[Unity3D]修改PaintIn3D插件源码以便用于VR

10 篇文章 0 订阅
3 篇文章 0 订阅

1. 导入PaintIn3D插件和SteamVR

在这里插入图片描述
在这里插入图片描述

2. 修改PaintIn3D插件源码

2.1 修改P3dHitScreen.cs

打开P3dHitScreen.cs文件,该脚本主要用于射线检测和按键判断,可以在场景的Tools子对象中打开该脚本
在这里插入图片描述
在这里插入图片描述
找到PaintAt方法后多复制粘贴一次该方法,用于重载
修改参数screenPosition的变量类型,由Vector3改为Transform
注释原本的var ray = camera.ScreenPointToRay(screenPosition);,并重新编写Ray变量
Ray ray = new Ray(screenPosition.position,screenPosition.forward);

private void PaintAt(Link link, Vector3 screenPosition, bool preview, float pressure, object owner, Transform _transform)
{
	// Debug.Log(screenPosition);

	if (link != null)
	{
		link.Record(screenPosition);
	}

	var camera = P3dHelper.GetCamera(_camera);

	if (camera != null)
	{
		if (touchOffset != 0.0f && P3dInputManager.TouchCount > 0)
		{
			screenPosition.y += touchOffset * P3dInputManager.ScaleFactor;
		}


		// var ray = camera.ScreenPointToRay(screenPosition);
		Ray ray = new Ray(screenPosition,_transform.forward);
		var hit = default(RaycastHit);

		if (Physics.Raycast(ray, out hit, float.PositiveInfinity, layers) == true)
		{
			Debug.DrawLine(ray.origin, hit.point, Color.green);
			var finalPosition = hit.point + hit.normal * offset;
			var finalRotation = Quaternion.identity;
	
	
			switch (rotateTo)
			{
				case RotationType.Normal:
				{
					var finalNormal = default(Vector3);
	
					switch (normalDirection)
					{
						case DirectionType.HitNormal: finalNormal = hit.normal; break;
						case DirectionType.RayDirection: finalNormal = -ray.direction; break;
						case DirectionType.CameraDirection: finalNormal = -camera.transform.forward; break;
					}
	
					var finalUp = default(Vector3);
	
					switch (normalRelativeTo)
					{
						case RelativeType.WorldUp: finalUp = Vector3.up; break;
						case RelativeType.CameraUp: finalUp = camera.transform.up; break;
					}
	
					finalRotation = Quaternion.LookRotation(-finalNormal, finalUp);
				}
				break;
				case RotationType.World: finalRotation = Quaternion.identity; break;
				case RotationType.ThisRotation: finalRotation = transform.rotation; break;
				case RotationType.ThisLocalRotation: finalRotation = transform.localRotation; break;
				case RotationType.CustomRotation: 
					if (customTransform != null) finalRotation = customTransform.rotation; 
					break;
				case RotationType.CustomLocalRotation: 
					if (customTransform != null) finalRotation = customTransform.localRotation;
					break;
			}
	
			switch (draw)
			{
				case DrawType.PointsIn3D:
				case DrawType.PointsIn3DFilled:
				{
					SubmitPoint(preview, priority, pressure, finalPosition, finalRotation, owner);
				}
					break;
	
				case DrawType.PointsOnUV:
				{
					hitCache.InvokeCoord(gameObject, preview, priority, pressure, new P3dHit(hit), finalRotation);
				}
					break;
	
				case DrawType.TrianglesIn3D:
				{
					hitCache.InvokeTriangle(gameObject, preview, priority, pressure, hit, finalRotation);
				}
					break;
			}
			return;
		}
	}

	BreakHits(owner);
}

在P3dHitScreen.cs文件中声明一个新的变量RayPosition,用于传递手柄位置

[System.NonSerialized]
private List<Link> links = new List<Link>();

[System.NonSerialized]
public P3dInputManager inputManager = new P3dInputManager();

public Transform RayPosition;

查找P3dHitScreen.cs文件中所有有引用到PaintAt方法(原方法,不是后面重载的)的位置,修改第二个参数变量为RayPosition.position,并加入最后一个参数Transform _transform的实参RayPosition

if (showPreview == true)
{
	if (P3dInputManager.MouseExists == true && inputManager.Fingers.Count == 0 && 	P3dInputManager.PointOverGui(P3dInputManager.MousePosition) == false)
	{
		// PaintAt(null, P3dInputManager.MousePosition, true, 1.0f, this);
		PaintAt(null, RayPosition.position, true, 1.0f, this, RayPosition);
    }
    else
    {
         BreakHits(this);
    }
}

一共有五处需要进行如上修改
在这里插入图片描述

2.2 修改P3dInputManager.cs

打开P3dInputManager.cs文件,找到Finger类,将所有的Vector2变量类型改为Vector3
在这里插入图片描述
找到 GetAveragePosition,GetAveragePullScaled和GetAverageDeltaScaled,Hermite方法,同样把返回值改为Vector3
在这里插入图片描述
在这里插入图片描述

找到AddFinger方法,修改第二个参数类型为Vector3
在这里插入图片描述
如果在修改过程中出现变量类型报错信息,修改对应的变量类型即可

声明四个变量
前三个用于判断手柄按键,第四个用于传递射线发射点

public bool IsPressedForSteamVR;
public bool IsUpForSteamVR;
public bool IsDownForSteamVR;
public Vector3 HitPosition;

找到Update方法,修改下图处AddFinger方法参数和判断条件
在这里插入图片描述

回到P3dHitScreen.cs脚本中我们重载的PaintAt方法,添加一句
inputManager.HitPosition = screenPosition;
在这里插入图片描述
找到PaintAt方法的第二处引用,将head参数改为finger.PositionA
在这里插入图片描述

3. 传递数据

新建GameContorller.cs脚本

public class GameController : MonoBehaviour
{
    #region 单例
    
    private static GameController _instance;
    public static GameController Instance
    {
        get { return _instance; }
    }
    #endregion

    //笔刷类,储存对应数据
    public List<TouchPoint> TouchPointManager = new List<TouchPoint>();
    
    void Awake()
    {
        _instance = this;
    }

    // Start is called before the first frame update
    void Start()
    {
        #region 初始化各个玩家所拥有的笔刷贴图列表
        
        foreach (Transform _tran in TouchPointManager[0].Tool.transform)
        {
            TouchPointManager[0].Textures.Add(_tran.gameObject);
        }
        
        #endregion
    }

    // Update is called once per frame
    void Update()
    {
        #region 实时更新玩家信息
        
        //*******************************************************************************
        //玩家一
        TouchPointManager[0].Position = TouchPointManager[0].Parent.position;

        TouchPointManager[0].Texture.RayPosition = TouchPointManager[0].Parent;
        TouchPointManager[0].Texture.inputManager.IsPressedForSteamVR = SteamVR_Actions._default.GrabPinch.GetStateDown(SteamVR_Input_Sources.RightHand);
        TouchPointManager[0].Texture.inputManager.IsDownForSteamVR = SteamVR_Actions._default.GrabPinch.GetStateDown(SteamVR_Input_Sources.RightHand);
        TouchPointManager[0].Texture.inputManager.IsUpForSteamVR = SteamVR_Actions._default.GrabPinch.GetStateUp(SteamVR_Input_Sources.RightHand);
        //*******************************************************************************
        
        #endregion
    }
}

[System.Serializable]
public class TouchPoint
{
    //手柄
    public Transform Parent;
    //手柄位置
    public Vector3 Position;
    //当前选择的笔刷贴图
    public P3dHitScreen Texture;
    //笔刷父对象
    public Transform Tool;
    //所有的笔刷贴图
    public List<GameObject> Textures;
}

挂载GameContorller脚本至任意对象上,拖入SteamVR相机预制体,变量如下设置
Parent对应手柄的Transform组件,Texture则是当前所使用的喷漆类型
在这里插入图片描述

4. 最终效果

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Paint in 3D 绘制所有物体 - 在游戏内和编辑器里。所有功能已经过深度优化,在WebGL、移动端、VR 以及更多平台用起来都非常好用! ? 容易使用 - 学习如何使用 Paint in 3D,让众多教程场景来手把手帮你过一遍每个功能。然后你还可以看看如何将多个功能结合在一起的演示场景,创建一些更有趣的东西。 ? 长期支持 - Paint in 3D 经过超过 5 年的定期更新,现在已经具有大量功能。感谢迄今为止一直支持其开发的每一个人! ? 所有渲染管线 - 此资源支持标准管线,以及 LWRP、HDRP 和 URP。请参阅文档了解如何在它们之间切换。 ? 随地可用 - Painy in 3D 一开始就被设计来用于尽多的设备和平台。它在台式、移动端、VR 上等更多都运行得很好!假如遇上任何性能问题,你可以调整许多设置来提升性能,而且其视觉效果影响极小。 ? 包含了完整源代码 - 如果你是程序员,随时可以根据爱好代码进行调整,它可轻松地被修改。 ? 光速绘制 - 通过使用GPU 加速,你的物体将以难以置信的速度被绘制。代码还经过深度优化来防止 GC 分配,和将所有绘制操作一起批次完成。 ? 在游戏内和编辑器中绘制 - Paint in 3D 是被设计来既可以用于游戏内,也可用于编辑器中,以便你想创建自己的纹理。如果你是程序员的话,你还可以直接从 C# 中使用它。 ? 稳定的性能 - 跟贴图系统不同,Paint in 3D 是一个纹理绘制解决方案。这意味着你可以绘制你的物体上百万次,还是无帧率丢失,让你创作难以想象的游戏。 ?自动保存和加载 - Paint in 3D 带有一个简易使用的系统,可自动恢复你的绘制进度。如果你需要更高级的控制的话,你可以使用简单的 C# API 来手动控制。 ?蒙皮网格绘制 – Paint in 3D 让你能够以高性能绘制动态物体。查看 WebGL 演示,了解到僵尸绘制是多好看和绘制是如何一瞬间完成。 ?画笔修改器 - 为你的画笔添加修改器,让它们变得活跃起来。它们可随机改变位置、旋转、不透明度、纹理,以及更多! ? 无缝UV 绘制 - 正在用复杂的 UV 来绘制复杂的网格?没问题,Paint in 3D 能流畅无缝地在 UV 缝合上进行绘制,即使它们在不同的物体上,或甚至它们的缩放度不同! ? 撤消和重做系统 - Paint in 3D 中包括了完整的撤销 + 重做支持来为游戏内和编辑器内的绘制。在游戏内,绘制可以设置为使用全纹理快照来达到快速切换,也可以绘制动作重放来降低内存使用。撤消和重做能分别在全局、或在个别物体上进行,还可以用 UI 按钮或 C# AAPI 触发。 ? 绘制遮罩 - 使用任何自定义纹理形状来轻松地将 3D 绘制遮罩添加到场景中。这将会自动防止所有新增的绘制在指定区域中出现,为你带来了油印效果。 ? 智能镜像系统 - Paint in 3D 自带强大的镜像功能,让你同时绘制物体的两面。如果你用文字来绘制贴图的话 ,它们通常会倒后出现,Paint in 3D 能更正它! ? 绘制任何着色器 - Paint in 3D 让你绘制各种着色器和材质,包括你的自定义。只需直接选择你想绘制的纹理和你想使用的混合模式,然后你就能开始了! ? 多纹理绘制 - PBR 材料往往需要你同时绘制反照率 + 金属性 + AO 地图。这在 Paint in 3D 里很容易设置,甚至还可以将其自定义为任何其他类型的复杂材质。 ? 颜色计数 – Paint in 3D 自带简易使用的系统来计算某个指定的颜色占了多少像素。这在团队合作绘制游戏时非常合适,能让你看到谁绘制的最多。 ?LOD 绘制 - 假如你需要绘制高多边形网格的话,你可以通过应用低多边形网格绘制来加速过程,并且仍然使用高多边形网格来可视化绘制! ? VR支持 - 所有功能都在VR中都很好用,而且 Paint in 3D 还附带了几个专为利用这些来设计的演示场景。如果你没有 VR 头盔的话, 不用担心,这些演示场景也可以与鼠标一起使用! ? 贴图绘制 - 使用此绘制工具来用你喜欢的纹理在物体表面上绘制。你能全面调控颜色、角度,甚至还有背面绘制和角度限制等这些高级设置。非常适合于汽车贴图、血溅 ,和更多! ? 实时绘制 - 应用了之后还需要移动贴图和其他绘制吗?实时绘制功能让你可以轻松地将绘制附加到任何变换中,给予你全面控制。 ? 动态绘制 - 轻松地绘制动态贴图,就跟文字一样。此绘制模式兼容你在 UI 或相机中绘制的东西,包括复杂的纹理、角色、3D 物体等。 ? 粒子碰撞绘制 - 使用此功能来用粒子绘制物体。这能让你做出逼真的喷漆涂鸦、烟熏等等! ?物理碰撞绘制 - 留下绘制并将你的碰撞影响带到下一个关卡中。这非常适用于添加凹痕、抓痕、 血溅,等等! ? 球形绘制 - 使用此 绘制工具来绘制球体半径中的每个像素。 ? 三边平面绘制 - 使用此绘制工具在复杂几何体上绘制无缝纹理。这能与球形和贴图绘制一起使用。 ? 孔形绘制 - 使用减性混合模式在物体上绘制孔。这能与球形和贴图绘制一起使用。 ? 法线绘制 - 使用法线混合模式绘制法线贴图。这可以让你将凹痕、抓痕 和其他细节添加到物体中。 ? 模糊绘制 - 使用模糊混合模式来将纹理中的像素模糊化。这可以让你将法线贴图平滑化 、抹去尖锐的线条等等! ? 间介绘制 - 使用此混合模式在 2 个 3D 点之间绘制第一个表面。这非常适合激光光束特效,还有更多! ? 贯通绘制 - 使用此混合模式在两个 3D 点之间绘制所有像素。这适合于非常强烈的激光光束特效,来贯穿一切。 ? 渐变绘制 - 使用此工具的任何混合模式,渐变绘制你的纹理中的所有像素。这非常适合随着时间逐渐淡化的特效,例如能量盾、雪中的足迹,以及更多! ? 泼溅贴图绘制 - 此绘制工具可让你用泼溅贴图将瓷片纹理绘制在物体上。
Paint in 3D 绘制所有物体 - 在游戏内和编辑器里都可使用。所有功能已经过深度优化,在WebGL、移动端、VR 以及更多平台用起来都非常好用! 容易使用 - 学习如何使用 Paint in 3D,让众多教程场景来手把手帮你过一遍每个功能。然后你还可以看看如何将多个功能结合在一起的演示场景,创建一些更有趣的东西。 长期支持 - Paint in 3D 经过超过 5 年的定期更新,现在已经具有大量功能。感谢至今一直支持我们开发的所有人! 所有渲染管线 - 此资源支持标准管线,以及 LWRP、HDRP 和 URP。请参阅文档了解如何在它们之间切换。 随地可用 - Painy in 3D 一开始就被设计来用于尽多的设备和平台。它在桌面、移动端、VR 上等各个平台上都表现优秀!假如遇上任何性能问题,你可以调整许多设置来提升性能,而且其视觉效果影响极小。 包含了完整源代码 - 如果你是程序员,随时可以根据爱好代码进行调整,它可轻松地被修改。 光速绘制 - 通过使用GPU 加速,你的物体将以难以置信的速度被绘制。代码还经过深度优化来防止 GC 分配,和将所有绘制操作一起批次完成。 在游戏内和编辑器中绘制 - Paint in 3D 是被设计来既可以用于游戏内,也可用于编辑器中,以便你想创建自己的纹理。如果你是程序员的话,你还可以直接从 C# 中使用它。 稳定的性能 - 跟贴图系统不同,Paint in 3D 是一个纹理绘制解决方案。这意味着你可以绘制你的物体上百万次,还是无帧率丢失,让你创作难以想象的游戏。 自动保存和加载 - Paint in 3D 带有一个简易使用的系统,可自动恢复你的绘制进度。如果你需要更高级的控制的话,你可以使用简单的 C# API 来手动控制。 蒙皮网格绘制 – Paint in 3D 让你能够以高性能绘制动态物体。查看 WebGL 演示,了解僵尸喷涂的极佳效果和绘制过程的方便快速。 画笔修改器 - 为你的画笔添加修改器,让它们变得活跃起来。它们可随机改变位置、旋转、不透明度、纹理,以及更多! 无缝 UV 绘制 - 正在用复杂的 UV 来绘制复杂的网格?没问题,Paint in 3D 能流畅无缝地在 UV 缝合上进行绘制,即使它们在不同的物体上,或甚至它们的缩放度不同! 撤消和重做系统 - Paint in 3D 中包括了完整的撤销 + 重做支持来为游戏内和编辑器内的绘制。在游戏内,绘制可以设置为使用全纹理快照来达到快速切换,也可以绘制动作重放来降低内存使用。撤消和重做能分别在全局、或在个别物体上进行,还可以用 UI 按钮或 C# AAPI 触发。 绘制遮罩 - 使用任何自定义纹理形状来轻松地将 3D 绘制遮罩添加到场景中。这将会自动防止所有新增的绘制在指定区域中出现,为你带来了油印效果。 智能镜像系统 - Paint in 3D 自带强大的镜像功能,让你同时绘制物体的两面。如果你用文字来绘制贴图的话 ,它们通常会倒后出现,Paint in 3D 能更正它! 绘制任何着色器 - Paint in 3D 让你绘制各种着色器和材质,包括你的自定义。只需直接选择你想绘制的纹理和你想使用的混合模式,然后你就能开始了! 多纹理绘制 - PBR 材料往往需要你同时绘制反照率 + 金属性 + AO 地图。这在 Paint in 3D 里很容易设置,甚至还可以将其自定义为任何其他类型的复杂材质。 颜色计数 – Paint in 3D 自带简易使用的系统来计算某个指定的颜色占了多少像素。这在团队合作绘制游戏时非常合适,能让你看到谁绘制的最多。 LOD 绘制 - 假如你需要绘制高多边形网格的话,你可以通过应用低多边形网格绘制来加速过程,并且仍然使用高多边形网格来可视化绘制! VR支持 - 所有功能都在VR中都很好用,而且 Paint in 3D 还附带了几个专为利用这些来设计的演示场景。如果你没有 VR 头盔的话, 不用担心,这些演示场景也可以与鼠标一起使用! 贴图绘制 - 使用此绘制工具来用你喜欢的纹理在物体表面上绘制。你能全面调控颜色、角度,甚至还有背面绘制和角度限制等这些高级设置。非常适合于汽车贴图、血溅 ,和更多! 实时绘制 - 应用了之后还需要移动贴图和其他绘制吗?实时绘制功能让你可以轻松地将绘制附加到任何变换中,给予你全面控制。 动态绘制 - 轻松地绘制动态贴图,就跟文字一样。此绘制模式兼容你在 UI 或相机中绘制的东西,包括复杂的纹理、角色、3D 物体等。 粒子碰撞绘制 - 使用此功能来用粒子绘制物体。这能让你做出逼真的喷漆涂鸦、烟熏等等! 物理碰撞绘制 - 留下绘制并将你的碰撞影响带到下一个关卡中。这非常适用于添加凹痕、抓痕、 血溅,等等! 球形绘制 - 使用此 绘制工具来绘制球体半径中的每个像素。
3D绘制允许你在游戏和编辑器中绘制场景中的所有对象。 记住这不是一个贴花系统,所以你的游戏不会因为你画了多少而延迟。相反,您的FPS将保持不变,即使您将对象绘制一百万次! 看看:WebGL演示|论坛线程 ▶一致的性能 即使你画了很多,在3D中画的速度还是很快的原因是因为颜料被烘焙成物体的纹理。你的对象已经有纹理了,为什么不使用它们呢?代码也不会产生垃圾(0 gc alloc),所以您不必担心随机延迟峰值。 ▶闪电快速绘画 烤漆成纹理听起来很慢,但是画图代码是在GPU上100%完成的,这使得它的速度非常快。绘制代码也经过了大量优化,以通过将绘制操作组合在一起来最小化状态更改。 ▶完整的c#源代码 就像我的所有资产一样,我提供了完整的c#源代码——没有什么隐藏在.dll中。代码的组织和注释也很好,所以如果需要,可以很容易地进行更改。 ▶长期支持 就像我所有的资产,我提供长期的支持,不会在你购买后就消失。我也提供定期的免费更新基于伟大的功能从客户的要求。 ▶蒙皮绘画 在3D绘制允许您绘制动画对象与伟大的性能。看看WebGL的演示,看看僵尸油漆看起来有多棒。 ▶无缝紫外线绘画 如果你有一个复杂的网格,它是常见的接缝时绘画,甚至当使用专业的绘画软件。3D绘画解决 了这个问题,包括“缝线固定”工具。3D绘画也使多个对象之间的绘画无缝连接,即使它们有不同的比例。 ▶易于使用 就像我的所有资产一样,我尽量保持界面简单。在几分钟之内,你就可以在游戏中添加绘画功能,并根据你的需要调整简单而强大的设置。 ▶团队基础绘画 3D绘画具有易于使用的基于团队的绘画功能。你可以指定一个特定的颜色给一个特定的团队,并计算每个团队在你的场景中画了多少像素! ▶Multi-Texture绘画 如果你有一个复杂的材质和着色器,有多个纹理一起工作,那么没问题。3D绘画允许你创建画笔,在同一时间绘制多个纹理,并给予每个画笔独特的设置。 ▶完整的物质支持 3D绘制不仅支持绘制所有的材质和着色器与统一,但所有你的定制的!使用直观的检查器,您可以轻松地选择您想要绘制的材质和纹理。 ▶在游戏&编辑器 3D绘画从一开始就被设计来支持游戏和编辑器中的绘画。这允许您在编辑器中快速调整纹理,然后在游戏中使用完全相同的特性绘制它们。 ▶混合模式 你不局限于画普通的反照率纹理。3D绘画有一系列的混合模式和设置,允许你画任何类型的纹理你喜欢。例如,添加混合照明纹理,RGB隔离阿尔法混合切割纹理,和更多。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值