对于3d拾取,我计划这样做:

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

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

-然后用我自己的手(xM,yM,zM)在屏幕上协调项目

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

然后检查匹配项(例如sqrt((x-xP)^ 2 +(y-yP)^ 2)
为了进行投影,我将视锥矩阵保存在mProjectionMatrix中:

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);
}


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

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

而且这不起作用。为什么?
你能给个建议吗?

附言:我已经看到了所有这样的问题,但他们没有回答我的问题。

最佳答案

也许您缺少透视鸿沟。将Resulted [0]除以Resulted [1]除以Resulted [3],并使用比率作为(xP,yP),即:

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

关于android - OPEN GL ES 1.0。世界坐标到屏幕坐标,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40475696/

10-11 00:28