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

Unity 实现在模型表面进行绘画

Texture2D-SetPixels32 - Unity 脚本 API

实现思路

从笔尖位置发射射线获取画纸上碰撞位置的UV 纹理坐标以确认笔迹位置,射线检查碰撞的最大距离即笔尖距离画纸的最大距离,利用Texture2D.SetPixels32 实现对画纸贴图颜色的修改。

核心代码

发射一条以笔尖位置为起点,笔尖forward 方向的射线检测碰撞获取碰撞位置处的UV 纹理坐标。maxDis 限制笔尖与画纸距离。

Ray ray = new Ray(nibTrans.position, dir);
//Debug.DrawRay(nibTrans.position, ray.direction, Color.red);
if (Physics.Raycast(ray, out RaycastHit hitInfo, maxDis))
{
    //hitInfo.textureCoord
}

 以碰撞位置为中心,笔迹范围大小计算笔迹开始位置。

startPosX = (int)(paintPos.x * textureWidth - (painterRange / 2f));
startPosY = (int)(paintPos.y * textureHeight - (painterRange / 2f));

修改贴图颜色并将修改的像素上传至显卡。

curTexture.SetPixels32(startPosX, startPosY, painterRange, painterRange, painterColor);
curTexture.Apply();

若画纸为一个平面,可利用画纸上任意三个点确认画纸的法线向量,以画纸的法线向量为射线方向可减小画笔出现倾斜时笔迹位置的偏差。

dir = Vector3.Cross(pointsTrans[1].position - pointsTrans[0].position, pointsTrans[2].position - pointsTrans[0].position).normalized;

画笔与射线方向的夹角小于一定角度时,则不进行贴图颜色修改。

angle = Vector3.Angle(transform.forward, dir);
if (angle < minAngle) return;

效果


http://www.kler.cn/a/573720.html

相关文章:

  • DeepSeek赋能智慧工厂:推动制造业高效智能可持续,开启制造业转型升级
  • 网站搭建需要做些什么
  • 模板字符串【ES6】
  • Mac OS升级后变慢了,如何恢复老系统?
  • 在 Aspire 项目下使用 AgileConfig
  • 【HTTP】解码网络通信的奥秘:HTTP,IP 地址,端口,DNS及NAT地址转换的协同之舞
  • 一个结合创意与技术的Python数据可视化案例,展示动态3D粒子轨迹图与热力图的融合效果,代码包含注释与关键技术点解析
  • 【C++】函数指针和指针函数
  • 什么是美颜SDK?从几何变换到深度学习驱动的美颜算法详解
  • FieldFox 手持射频与微波分析仪
  • 六十天前端强化训练之第七天CSS预处理器(Sass)案例:变量与嵌套系统详解
  • 零基础C语言学习日志19(C语言内存函数)
  • 个推助力小米米家全场景智能生活体验再升级
  • 智能家居遥控革命!昂瑞微HS6621EM:用「芯」定义AIoT时代的语音交互标杆
  • 蓝桥杯备考:BFS最短路径之kotori迷宫
  • go数组的声明和初始化
  • 黄昏时间户外街拍人像Lr调色教程,手机滤镜PS+Lightroom预设下载!
  • 面试问题(一)
  • Python数据可视化——Matplotlib的基本绘图:图形、轴、标签
  • GPU 英伟达GPU架构回顾