【问题标题】:Calculate World Coordinates from Normalized Device Coordinates从标准化设备坐标计算世界坐标
【发布时间】:2015-08-19 10:15:17
【问题描述】:

我目前正在尝试在 World Space 中注册屏幕上的触摸。 我首先将它们转换为标准化的设备坐标,然后尝试将标准化立方体近侧的一个点 (z = -1) 和标准化立方体远侧的一个点 (z = 1) 与倒置的 ProjectionViewMatrix 相乘到在他们之间划一条线。 到目前为止我的方法:

//Calculate ProjectionViewMatrix
Matrix.multiplyMM(projectionViewMatrix,0,perspectiveProjectionMatrix,0,viewMatrix,0);

//Calculate Inverse
Matrix.invertM(invertedProjectionViewMatrix,0,projectionViewMatrix,0);

float[] nearPoint = {x, y, -1, 1};
float[] farPoint = {x, y, 1, 1};

float[] nearPointWorldSpace = new float[4];
float[] farPointWorldSpace = new float[4];

Matrix.multiplyMV(nearPointWorldSpace,0, invertedProjectionViewMatrix,0, nearPoint,0);
Matrix.multiplyMV(farPointWorldSpace,0, invertedProjectionViewMatrix,0, farPoint,0);

perspectiveDevide(nearPointWorldSpace);
perspectiveDevide(farPointWorldSpace);

其中perspectiveDevide定义为:

private static void perspectiveDevide(float[] vector) {
    vector[0] /= vector[3];
    vector[1] /= vector[3];
    vector[2] /= vector[3];
}

现在我应该得到一个近点和远点,它们具有相同或非常相似的 X/Y 坐标,因为我的相机就在 lookAt 的正上方并且没有角度。 但是我得到的是:

近点世界:

[0] -0.002805814
[1] 0.046295937
[2] 1.9
[3] 9.999999

远点世界:

[0] -2.8057494
[1] 46.294872 
[2] -97.99771
[3] 0.010000229 

任何想法可能有什么问题?

编辑:

这是我的视图和投影矩阵代码:

投影:

Matrix.perspectiveM(perspectiveProjectionMatrix,0, 60, (float) width / (float) height, 0.1f, 100f);

查看:

Matrix.setLookAtM(viewMatrix,0, 
            0,0,2, 
            0,0,0, 
            0,1,0); 

【问题讨论】:

  • 你还应该在透视分割中设置vector[3]=1;
  • 是的,我做到了,但遗憾的是它不会影响我的问题
  • 实际上,您的结果看起来很合理。如果您将相机的位移移除 (0, 0, 2),那么 farWorldPoint 大约是 nearWorldPoint 的 1000 倍,这正是您的 znear 和 zfar 平面距离的比率。并且这些点与相机在一条射线上。所以我认为你的结果没有任何问题。只有取消投影屏幕中心时,两个点的 X/Y 坐标才会相等。
  • 当然!你是对的。非常感谢!

标签: java android math opengl-es opengl-es-2.0


【解决方案1】:

正如 Nico Schertler 所指出的,这些结果实际上是合理的。 为了获得正确的 X/Y 坐标,我必须取消投影屏幕中心。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 2011-07-24
    • 2018-01-29
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多