1

对于 3d-picking,我计划这样做:

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

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

- 然后用我自己的双手(xM,yM,zM)在屏幕坐标上投影

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

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

对于投影,我将 Frustum Matrix 保存在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 )

这是行不通的。为什么?你能给个建议吗?

PS我见过所有这样的问题,他们没有回答我的问题。

4

1 回答 1

2

也许你错过了视角鸿沟。将Resulted [0] , Resulted[1]除以 Resulted[3]并将比率用作(xP, yP)即:

float xP = Resulted[0] / Resulted[3];
float yP = Resulted[1] / Resulted[3];
于 2016-11-07T22:22:22.080 回答