对于3d拾取,我计划这样做:
-获取触摸坐标(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:
中保存Transform坐标gl.glLoadMatrixf(mAccRotation, 0);
所以测试函数变成这样:(testfy_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);
}
所以我尝试使用 result [0], result [1]作为(xP, yP)
,并试图使用(结果[0]+ 1)*(宽/2.0 f),(导致[1]+ 1)*(身高/2.0 f)
这行不通。为什么?你能给个建议吗?
附:我看过所有这样的问题,他们没有回答我的问题。
也许你错过了视角划分。将 results [0], results [1]除以 results [3],并使用比率(xP, yP)即:
float xP = Resulted[0] / Resulted[3];
float yP = Resulted[1] / Resulted[3];