对于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/