当前位置: 首页 > 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);}
}

http://www.xdnf.cn/news/74845.html

相关文章:

  • (51单片机)LCD显示温度(DS18B20教程)(LCD1602教程)(延时函数教程)(单总线教程)
  • PDF处理控件Aspose.PDF指南:使用 Python 将 EPUB 转换为 PDF
  • Kubernetes相关的名词解释kubelet 组件(17)
  • uniapp 上传二进制流图片
  • DeepSeek和Excel结合生成动态图表
  • SpringBoot入门实战(第五篇:项目接口-用户管理)
  • Missashe考研日记-day24
  • 品牌如何通过朝日新闻出海日本?——某企业日本媒体发稿实战
  • 小白学习java第14天(上):数据库
  • docker本地虚拟机配置
  • 用selenium4 webdriver + java 搭建并完成第一个自动化测试脚本
  • 【论文阅读24】并行 TCN-LSTM(2024-02)
  • 数据仓库ODS、DWD、DWS、ADS各层介绍
  • 【Linux】多进程任务模块
  • Arthas 指南
  • 在windows下安装windows+Ubuntu16.04双系统(下)
  • Java--数组的应用
  • 【Linux网络】应用层自定义协议与序列化
  • 怎么发布、更新Python第三方库?以potx-cloud为例
  • 算法学习(二)
  • PID控制程序编写
  • 20242817李臻《Linux⾼级编程实践》第8周
  • 辛格迪客户案例 | 浙江高跖医药委托生产质量管理协同(OWL MAH)项目
  • 2025-0421学习记录16——文献阅读与分享(1)
  • 判断链表是否为环(Java版本自己用)
  • 【技术追踪】Differential Transformer(ICLR-2025)
  • VMware制作Windows虚拟机模板注意点
  • 市场分析 3 mysql (槽)
  • vue部署到nginx服务器 启用gzip
  • 4月22日直播预告|AI赋能开发提效,三大应用场景实战分享