2010-03-29 84 views
6

我正在研究OpenGL ES1应用程序,该应用程序显示2D网格并允许用户导航和缩放/旋转它。我需要知道View Touch坐标到我的opengl世界和网格单元的确切翻译。有没有任何助手可以完成我为导航所做的最后几个变换的反转?或者我应该用手来计算和做矩阵的东西?iPhone OpenGL ES - 如何选择

回答

4

挑选模式在openGL ES中不可用。但使用从当前openGL状态检索到的投影矩阵很容易计算任意3d点的屏幕坐标。 这里是我如何做到这一点(IMPoint2D和IMPoint3D是基本的(X,Y)和(X,Y,Z)结构)

+ (IMPoint2D) getScreenCoorOfPoint:(IMPoint3D)_point3D 
{ 
    GLfloat  p[16];            // Where The 16 Doubles Of The Projection Matrix Are To Be Stored 
    glGetFloatv(GL_PROJECTION_MATRIX, p);       // Retrieve The Projection Matrix 
/* 
Multiply M * point 
*/ 
    GLfloat _p[] = {p[0]*_point3D.x +p[4]*_point3D.y +p[8]*_point3D.z + p[12], 
        p[1]*_point3D.x +p[5]*_point3D.y +p[9]*_point3D.z + p[13], 
        p[2]*_point3D.x +p[6]*_point3D.y +p[10]*_point3D.z+ p[14], 
        p[3]*_point3D.x +p[7]*_point3D.y +p[11]*_point3D.z+ p[15]}; 
/* 
divide by scale factor 
*/ 
    IMPoint2D _p2D = {_p[0]/_p[3], _p[1]/_p[3]}; 
/* 
get result in screen coordinates. In this case I'm in landscape mode 
*/ 
    return (IMPoint2D) {_p2D.x*240.0f + 240.0f, (1.0f - _p2D.y) *160.0f}; 
} 
+0

我添加了功能 - (CGPoint)getScreenCoorOfPoint:(IMPoint3D)_point3D这似乎给我的项目位置在世界上可是一点我现在卡住上是: * 我有有一个位置的对象 * 我有在世界位置(gluLookAt眼[0],眼[1],眼[2]) * 然后我有我在哪里点击s creen 我该如何加入这一切,这是我存档伟大的最后一件事! – Burf2000 2010-12-05 18:43:03

6

听起来你正在寻找什么是unproject方法。 glut库有一个,但它在OpenGL ES上不可用。这是可能的rewrite the glut code yourself to be iphone compatible 你也可以编写你自己的代码来进行unproject,这将涉及到需要将接触点缩放到视口,将其乘以投影* modelview矩阵的逆,并用w除以得到3D矢量。

0

可以用GL_MODELVIEW_MATRIX做到这一点吗?或GL_MODLVIEW,我不修改视图位置,只有del modelview。 I'm这样做:

  glMatrixMode(GL_MODELVIEW); 

// Setup model view matrix 
      glLoadIdentity(); 
      [gAccel GetAccelerometerMatrix:(GLfloat *) matrix headingX:headx headingY: heady headingZ:headz]; 

      // Finally load matrix 
      glLoadMatrixf((GLfloat*)matrix); 

      glPushMatrix(); 
      glRotatef(-90, 1, 0, 0); 
      glScalef(0.0005, 0.0005, 0.0005); 
      glTranslatef(x, 0.0, z); 

感谢