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

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.dtcms.com/a/54873.html

相关文章:

  • Python接口自动化之断言封装!
  • TikTok美国战略升级:聚焦美食旅行,本地化服务如何重塑市场格局
  • 跟着 Lua 5.1 官方参考文档学习 Lua (10)
  • 【SpringBoot】深入解析 Maven 的操作与配置
  • SpringBoot集成Sentry日志收集-1 (Sentry安装)
  • 如何不重启,生效windows环境变量
  • 力扣刷题DAY6(滑动窗口/中等+栈/简单、中等)
  • springboot 集成 MongoDB 基础篇
  • 基于SpringBoot+Vue的校园美食分享平台的设计与实现
  • Redis 脚本:高效数据管理的利器
  • Python 配置文件解析利器:configparser 使用指南
  • 【docker】安装mysql,修改端口号并重启,root改密
  • Android项目优化同步速度
  • 属于网络安全规划重安全性需求
  • 专题02.DeepSeek R1大语言模型发展演进
  • ssm_mysql_暖心家装平台
  • android 横竖屏适配工作总结
  • CentOS 7.9 安装 ClickHouse 文档
  • 信息检索--课程笔记
  • Unity多Pass渲染与GPU Instancing深度优化指南
  • 使用基于深度学习的 T1 加权 MRI 个性化电场图直接估计 tDCS 数字孪生
  • 华为 VRP 系统简介配置TELNET远程登录
  • 第二次CCF-CSP认证(含C++源码)
  • CTF 中的 XSS 攻击:原理、技巧与实战案例
  • BZOJ2121 字符串游戏
  • uniapp+微信小程序+地图+传入多个标记点显示+点击打开内置地图导航+完整代码
  • 网络安全:利用 IP 查询构建网络安全系统的方法
  • 技术方案包括哪些内容
  • JavaAdv——多线程同步案例(售票系统)
  • OpenCV计算摄影学(16)调整图像光照效果函数illuminationChange()