打开gl 1.0.世界坐标到屏幕坐标



对于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];

相关内容

  • 没有找到相关文章

最新更新