如何修改透视相机的屏幕转世界坐标方法,实现平面绕X轴旋转?
如何在PerspectiveCamera下获取绕X轴旋转后的平面上的世界坐标
我正尝试在PerspectiveCamera(透视相机)下,通过屏幕坐标获取平面上的世界坐标。当前实现代码如下:
public Vector3 getWorldCoordinates(float x, float y) { // Use an imaginary plane at z=0 to intersect ray Plane plane = new Plane(); plane.set(0, 0, 1, 0); Ray ray = mCamera.getPickRay(x, y); Vector3 pos = new Vector3(); Intersector.intersectRayPlane(ray, plane, pos); return pos; }请问如何修改该方法,使得在计算坐标前让平面绕X轴旋转x度?
要实现这个需求,我们只需要在创建平面后对其应用绕X轴的旋转即可——libGDX的Plane类已经提供了便捷的旋转方法,不需要手动计算复杂的向量变换。这里有两种简洁的实现方式:
方式一:直接使用Plane的rotate方法(推荐)
这种方式最直观,直接调用Plane.rotate()方法对平面进行旋转,内部会自动更新平面的法向量和平面方程参数:
public Vector3 getWorldCoordinates(float x, float y, float rotateXDegrees) { // 创建初始z=0平面(法向量(0,0,1),过原点) Plane plane = new Plane(new Vector3(0, 0, 1), 0); // 绕X轴旋转指定角度(参数为角度值,若用弧度请用rotateRad) plane.rotate(Vector3.X, rotateXDegrees); // 保持原有的射线求交逻辑 Ray ray = mCamera.getPickRay(x, y); Vector3 pos = new Vector3(); Intersector.intersectRayPlane(ray, plane, pos); return pos; }
方式二:手动计算旋转后的法向量
如果你想理解背后的变换逻辑,可以手动创建旋转矩阵,计算旋转后的平面法向量,再构造平面:
public Vector3 getWorldCoordinates(float x, float y, float rotateXDegrees) { // 创建绕X轴旋转的矩阵(角度制) Matrix4 rotationMatrix = new Matrix4().rotate(Vector3.X, rotateXDegrees); // 原平面法向量是z轴方向,应用旋转得到新的法向量 Vector3 rotatedNormal = new Vector3(0, 0, 1).mul(rotationMatrix); // 构造旋转后的平面(因为旋转后仍过原点,所以d参数为0) Plane plane = new Plane(rotatedNormal, 0); // 射线求交逻辑不变 Ray ray = mCamera.getPickRay(x, y); Vector3 pos = new Vector3(); Intersector.intersectRayPlane(ray, plane, pos); return pos; }
注意事项
- 两个方法中的
rotateXDegrees参数都是角度值,如果你使用弧度进行计算,请替换为rotateRad()方法(Matrix4和Plane都支持) - 因为原平面是过原点的z=0平面,绕X轴旋转后仍然会经过原点,所以平面的
d参数(平面方程ax+by+cz+d=0中的常数项)保持0不变。如果你的平面不是过原点的,需要额外调整d值。
内容的提问来源于stack exchange,提问作者Henrik




