OPEN GL ES 1.0。世界坐标到屏幕坐标

时间:2016-11-07 22:18:21

标签: android opengl-es picking mouse-picking

对于3D采摘我计划这样做:

- 获取触摸坐标(x,y)

从模型的顶点缓冲区中选择顶点(xM,yM,zM)。

- 然后我自己动手(xM,yM,zM)在屏幕上显示坐标

(xM,yM,zM)---> (xP,yP,...)

然后检查匹配(例如sqrt((x - xP)^ 2 +(y - yP)^ 2)< SOME_EPS)

投影我在 mProjectionMatrix 中保存了Frustum Matrix:

gl.glFrustumf(-ratio / q, ratio / q, -1 / q, 1 / q, 1, 25);
Matrix.frustumM(mProjectionMatrix, 0, -ratio / q, ratio / q, -1 / q, 1 / q, 1, 25);

并在 mAccRotation 中保存变换坐标:

gl.glLoadMatrixf(mAccRotation, 0);

所以测试功能变成了这个: (TESTIFY_VERT是我模型中的一个)

public void touch(float x, float y){

    float TESTIFY_VERT[] = {0.0f, 0.0f, -1.5f, 1.0f}; //first vert in L0
    float Resulted[] = new float[4];
    float rMatrix[] = new float[16];

    Matrix.multiplyMM(rMatrix, 0, mProjectionMatrix, 0, mAccRotation, 0);
    Matrix.multiplyMV(Resulted, 0, rMatrix, 0, TESTIFY_VERT, 0);
}

所以我尝试使用结果[0],结果[1] 作为(xP,yP)

并尝试使用(结果[0] + 1)*(WIDTH / 2.0f),( - 已结算[1] + 1)*(HEIGHT / 2.0f)

这不起作用。为什么? 你能提出建议吗?

PS我已经看到了所有这些问题而且他们没有回答我的问题。

1 个答案:

答案 0 :(得分:2)

也许你错过了视角鸿沟。除以结果[0] 结果[1] 除以结果[3] 并将比率用作(xP,yP)< / em> ie:

float xP = Resulted[0] / Resulted[3];
float yP = Resulted[1] / Resulted[3];