gpt4 book ai didi

android - OpenGL : gluUnProject returns wrong coordinates

转载 作者:行者123 更新时间:2023-11-29 15:27:59 26 4
gpt4 key购买 nike

我这样设置我的场景(Android 应用程序,OpenGL ES):

GLU.gluPerspective(gl, 60, viewRatio, 0.1f, 1000.0f);
// ...
GLU.gluLookAt(gl, cameraX, cameraY, cameraZ, cameraX, cameraY, cameraZ - 1f, 0f, 1f, 0f);
// Scene scaled down because object positions are in [-10000..10000] for x & y
gl.glScalef(0.001f, 0.001f, 1.0f);

场景渲染得很好,它包含 z=-10 处的四边形和一个 z=-30 处的巨大背景四边形。我现在正在尝试实现光线拾取,就像这样(取自 this thread :

public float[] unproject(float rx, float ry, float rz) {
float[] xyzw = {0, 0, 0, 0};
int[] viewport = {0, 0, mDisplayWidth, mDisplayHeight};
android.opengl.GLU.gluUnProject(rx, ry, rz, mMatrixGrabber.mModelView, 0, mMatrixGrabber.mProjection, 0, viewport, 0, xyzw, 0);
xyzw[0] /= xyzw[3];
xyzw[1] /= xyzw[3];
xyzw[2] /= xyzw[3];
xyzw[3] = 1;
return xyzw;
}

然后以这种方式测试屏幕上的点击:

unproject(tapX, mDisplayHeight - tapY, BACKGROUND_Z);

预期行为:返回的 X、Y 坐标类似于深度 = -30 (BACKGROUND_Z) 处的点击点

实际作用:在屏幕中心点击时返回正确的 X、Y 坐标;但是屏幕中心和点击点之间的距离没有被正确解释——它似乎被某种因素缩小了。例如。点击屏幕中心给出 [0,0],点击屏幕左边缘应该给出 ~[-3600,0],但给出 [-1.13,0]。平移 View ,使之前触摸的点位于屏幕中心,这会给出 ~[-3600,0],这是应该的。

这会不会是因为场景缩放了 0.001?我已经测试了各种配置(在 gluLookAt 之前移动缩放比例,或者完全删除它),但问题仍然存在 :(


屏幕左边缘触摸的示例数据输出:

传递给 unproject() 的接触点:

x=3, y = 554 (0,0 at bottom left; w=720, h=1280)

投影矩阵:

[2.8482616, 0.0,       0.0,         0.0, 
0.0, 1.7320509, 0.0, 0.0,
0.0, 0.0, -1.0001999, -1.0,
0.0, 0.0, -0.20001999, 0.0]

模型矩阵:

[0.0010, 0.0,    0.0, 0.0, 
0.0, 0.0010, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 1.0, 1.0]

unproject() 输出:

[-1.1232367, -0.11801138, -1.0032262, 1.0]

我想到的是返回的 z 值似乎是错误的 - 传递给 unproject() 的 z 值是 -30(如上所述)。

最佳答案

让我们看看——我无法重现您获得的值,但我认为这无关紧要。

您不得使用 [-1;+1] 之外的 z 值调用 unprojectunproject 必须做的第一件事是反转窗口变换,然后,坐标必须在 NDC 空间中。在 OpenGL 中,这是立方体 [-1;+1]^3(songho 包含一些漂亮的图形)。使用-30 调用unproject 意味着该点必须在近平面之前。用 z=-1.0f 调用它会产生近平面,而 z=+1.0f 会产生远平面。

如何选择 z s.t.在所有矩阵求逆之后,z=-30 成立——我不知道。

关于android - OpenGL : gluUnProject returns wrong coordinates,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9906759/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com