欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

unity使用顶点偏移shader后物体包围盒中心点的偏移

程序员文章站 2024-03-16 18:07:28
...

unity使用顶点偏移shader后物体包围盒位置的偏移

这里只做一下笔记,总结。
顶点偏移shader主要是将游戏中的点在经过一系列坐标转化过程中所做的偏移的shader。
有2种做法,要么在观察坐标系偏移,要么在其次坐标系偏移。
假如在开发一个跑酷游戏,游戏的跑道是一个纵深弯曲的曲面,上面有各种金币,道具。
虽然说金币及道具顶点实现了偏移,但包围盒不会,所以还得再项目里实现位置坐标转化;

代码块

观察坐标系下转化如下:

m_vpMatrix = cam.worldToCameraMatrix;
Vector4 lvlObjV4Pos = new Vector4(pos.x, pos.y, pos.z, 1);
Vector4 ml = m_vpMatrix * lvlObjV4Pos;
// shader中的变换
Vector4 v4 = new Vector4(0, -8.5f, 0, 0);
var disss = ml.z / 10.58f;
var offse = ml + v4 * disss * disss;
offse = cam.projectionMatrix * offse;

var y1 = offse.y * Screen.height / (2 * offse.w) + Screen.height / 2;
var screenPos = cam.WorldToScreenPoint(pos);
var test = cam.ScreenToWorldPoint(new Vector3(screenPos.x, y1, screenPos.z));
float fOffY = transform.InverseTransformPoint(test).y;

脚注

1、Vector4 lvlObjV4Pos = new Vector4(pos.x, pos.y, pos.z, 1);unity中的矩阵变换都是4*4矩阵,从三维坐标转换成齐次坐标是把w分量设为1;
2、m_vpMatrix * lvlObjV4Pos 将世界坐标转成观察系坐标;
3、shader中变换,就是shader中的值了;
4、offse.y * Screen.height / (2 * offse.w) + Screen.height / 2;这里就是将获得的齐次坐标转成unity屏幕坐标;
5、因为,x,z轴没有变换,现将x,z轴转屏幕坐标再一起转回世界坐标;

总结:
齐次除法和屏幕映射的过程可以使用下面的公式
unity使用顶点偏移shader后物体包围盒中心点的偏移