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;