You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何修改透视相机的屏幕转世界坐标方法,实现平面绕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

火山引擎 最新活动