对于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我已经看到了所有这些问题而且他们没有回答我的问题。
答案 0 :(得分:2)
也许你错过了视角鸿沟。除以结果[0] ,结果[1] 除以结果[3] 并将比率用作(xP,yP)< / em> ie:
float xP = Resulted[0] / Resulted[3];
float yP = Resulted[1] / Resulted[3];