3D场景坐标与鼠标位置换算过程
常常 我们需要换算鼠标的坐标转换成3D场景中的坐标,涉及到叉乘、基准点等。在观察相关代码时,有一点花了相当长的一段时间,都没明白,至今仍是在自己的猜想中得到解释
有一段算法:
1.获取摄像机位置 rayFrom
2.获取摄像机视线方向 rayForward,并安全单位化后放大10000倍
3.获取摄向机视线水平方向上的向量,并安全单位化后放大20000倍 hor
4.获取摄向机视线竖直方向上的向量,并安全单位化后放大20000倍 ver
5.获取屏幕长 width,宽 height;
6.求得屏幕长宽比 aspect = width / height;
7.接下来传奇开始了
hor *= aspect; //这应该是想:将hor进行屏幕长宽比方向上的拉伸处理,因为使用中好像鼠标在横向和纵向上移动相同距离时,
//反映在屏幕上坐标移动距离是不一致的,会被拉伸
Vector3 rayToCenter = rayFrom + rayForward; //摄像机起点射向场景中央的点
Vector3 dHor = hor * 1.f / width; //每个高度像素上的水平微向量
Vector3 dVert = vertical * 1.f / height; //每个宽度像素上的垂直微向量
Vector3 rayTo = rayToCenter - 0.5f * hor + 0.5f * ver; //中心减去向左的向量的拉伸后的10000倍,再减去向上单位向量的1000倍,回到左下角
rayTo += float(x) * dHor; //获得水平方向上鼠标位置
rayTo -= float(y) * dVert; //获得水平方向上鼠标位置
rayTo 即为所求。
所思:这里凭什么能直接将数值都取到10000,最后算出来的基准点一定与摄像机位置向客户区左下角的射过去的点在一条直线上。因为目前3D引擎默认视角都是45度,这里应当恰好与此设置相符,否则,此算法必然出错。
拉伸处理,想必也是3D引擎处理中必备的。按像素来计算出dHor、dVer也是比较有启发的。3D引擎领域也是很好玩的。