对于 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我见过所有这样的问题,他们没有回答我的问题。