当前位置: 首页 > news >正文

Unity Paint In 3D 入门

插件版本4.1.8

快速开始

这是一个强大的,可自由涂鸦的Unity插件.

步骤1

任何带有 MeshFilter + MeshRenderer 或 SkinnedMeshRenderer 的 GameObject 均可被喷涂。

​方法1​
为 GameObject 添加 CwPaintableMesh 组件。

​方法2​
点击 MeshRenderer 或 SkinnedMeshRenderer 组件的上下文菜单(右上角 ​​⋮ 图标​​),选择 ​​"Make Paintable (Paint in 3D)"​​ 选项。

两个方法任选一个

添加 CwPaintableMesh 组件后,可选择点击 ​​"Analyze Mesh"​​ 按钮检测网格是否适合喷涂。

Unity自带的Cube是不合适的.在你使用分析器后,展示大面积的红色代表不适合被涂鸦.

而几乎没有红色则代表合适.

步骤2

你需要选择使用什么纹理喷涂.

物体的 MeshRenderer 或 SkinnedMeshRenderer 组件包含一个 ​​Materials数组​​(通常只有一个材质)。每个材质依赖着色器(Shader)渲染,而着色器会使用多个纹理。

多数着色器都包含​​Albedo/Color纹理,还有一些更高级的可能还包含 ​​法线贴图(_BumpMap)​​、​​自发光贴图(_EmissionMap)​​

配置方法​

​方法1​
在 CwPaintableMesh 组件Inspector中点击 ​​"Add Paintable Texture"​​ 按钮。

​方法2​
手动添加 CwPaintableMeshTexture 组件到GameObject(需与 CwPaintableMesh 组件共存)。

添加成功后,您将看到新增的 CwPaintableMeshTexture 组件

关键参数设置​
  1. ​Slot 下拉菜单​

    • 点击下拉箭头,选择当前渲染器使用的纹理
    • 常规物体使用默认值:​​0, _MainTex​​(对应主贴图)
    • 特殊需求示例:
      • 喷涂法线贴图 → 选择 ​​0, _BumpMap​
      • 喷涂金属度 → 选择 ​​0, _MetallicGlossMap​

  1. ​URP/HDRP 注意事项​

    • ​URP Lit着色器​​ 使用 ​​0, _BaseMap​​ 作为Albedo纹理
    • _MainTex 是兼容旧版的伪插槽,实际无效

步骤3

有多种方式喷涂物体.

一个简单的方法是创建一个新的GameObject,并添加CwHitScreen和CwPaintSphere 组件(这里的官网原文写的是CwPaintDecal组件,但是经过我的测试无法正常工作)。
这些组件将自动协同工作,允许您使用鼠标(或者如果在移动设备上运行手指)进行绘制。
注意:CwHitScreen组件使用射线检测,所以你的网格必须有碰撞器,以便它知道在哪里绘制。

你可以根据自己的喜好调整CwPaintSphere 组件的设置.

最好改变一下颜色,因为默认的颜色是白色,可能会让你误以为什么也没发生.

现在运行看下效果!

更高级的用法请查看示例PaintIn3D/Examples 

简单总结

首先你的物体想要能被绘制要加上

然后还要还需要一个物体包含下面的这些组件,这个物体是通过事件驱动的方式涂鸦可被涂鸦的物体.

如何使用自己的射线检测

但是我阅读该插件的源代码,发现本质是利用从摄像机发射一个射向鼠标的射线.

我有一个需求就是自己射线检测得到的RaycastHit结果替换掉插件默认的射线检测结果(插件默认使用主相机发射射线)

在这里

 我尝试重写该方法,可以正常工作,

var hit = transform.parent.GetComponent<Device_HVLP>().Hit;

这句是我缓存的RaycastHit结果,你替换成你的RaycastHit传给

hit3D = new CwHit(hit);
public class MyCwHitScreen : CwHitScreen
{protected override void DoQuery(Vector2 screenPosition, ref Camera camera, ref Ray ray, ref CwHit hit3D,ref RaycastHit2D hit2D){hit2D = default(RaycastHit2D);camera = CwHelper.GetCamera(Camera);var hit = transform.parent.GetComponent<Device_HVLP>().Hit;hit3D = new CwHit(hit);}
}

相关文章:

  • Python线程全面详解:从基础概念到高级应用
  • 鸿蒙生态新利器:华为ArkUI-X混合开发框架深度解析
  • android contentProvider 踩坑日记
  • uniapp 上传二进制流图片
  • 鸿蒙生态:鸿蒙生态校园行心得
  • Windows下Golang与Nuxt项目宝塔部署指南
  • L1-4、如何写出清晰有目标的 Prompt
  • vscode python 代码无法函数跳转的问题
  • 55、Spring Boot 详细讲义(十一 项目实战)springboot应用的登录功能和权限认证
  • 小刚说C语言刷题——1031 温度转化
  • Ubuntu-Linux中vi / vim编辑文件,保存并退出
  • 云账号安全事件分析:黑客利用RAM子账户发起ECS命令执行攻击
  • 联易融科技:以科技赋能驱动经营反转与价值重估
  • 可吸收聚合物:医疗科技与绿色未来的交汇点
  • K8s:概念、特点、核心组件与简单应用
  • 方案精读:华为智慧园区解决方案【附全文阅读】
  • [创业之路-380]:企业法务 - 企业经营中,企业为什么会虚开増值税发票?哪些是虚开増值税发票的行为?示例?风险?
  • SpringCloud组件—Eureka
  • 【sylar-webserver】重构 增加内存池
  • [盈达科技】GEO(生成式引擎优化)实战指南:从认知重构、技术落地到内容突围的三维战略
  • 山东省检察院答澎湃:惩治网络售假,强化“全链条”刑事打击
  • 全球最大车展在上海启幕,解放日报头版头条:“看懂上海车展,就能预判未来”
  • 今天是世界读书日,上海准备了哪些文化大餐?
  • 4月语言学联合书单|法庭审判话语的态度表达及人际功能研究
  • 伊朗外长访华将会见哪些人?讨论哪些议题?外交部回应
  • 柬埔寨人民党中央外委会副主席:柬中友谊坚如钢铁,期待更多合作