【问题标题】:Camera movement in OpenGL ES androidOpenGL ES android中的相机移动
【发布时间】:2013-02-26 15:26:01
【问题描述】:

我对 GLU.gLookAt(eyeX,eyeY,eyeZ,Xpos,Ypos,Zpos,upX,upY,upZ) 方法的使用感到非常困惑。我想要的只是缩放 3d 立方体。 当我增加/减少 eyeZ 的值时,相机向前/向后移动到立方体。在 eyeZ 的某个限制范围内一切正常,但是当我将 eyeZ 值增加到超过该限制时,它开始恢复效果,即不是放大而是开始缩小。

我可能不擅长openGL,无法理解上述方法,但谁能告诉我这背后的基本原因是什么。 我提到了这个链接 http://jerome.jouvie.free.fr/opengl-tutorials/Tutorial8.php

如果你愿意,我可以在这里发布我的代码..

public void onDrawFrame(GL10 gl) 
{

    gl.glClear(GL10.GL_COLOR_BUFFER_BIT  | GL10.GL_DEPTH_BUFFER_BIT);
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();


    //gl.glTranslatef(xPos, yPos, -zoomFactor);
    GLU.gluLookAt(gl, eyeX, eyeZ, eyeZ, 0f, 0f, 0f  , 0f, 1f, 0f);

    gl.glRotatef(mAngleX, 0, 1, 0);
    gl.glRotatef(mAngleY, -1, 0, 0);

    // Draw the model
    cube.draw(gl);
}

这是我使用 gLookAt 方法的方法..

【问题讨论】:

  • 发布您的代码,以及它开始缩小的点
  • 好吧,如果你沿着这条线移动相机,那么在某一点你是最接近你的目标的。
  • public void onDrawFrame(GL10 gl) { gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); //gl.glTranslatef(xPos, yPos, -zoomFactor); GLU.gluLookAt(gl, eyeX, eyeZ, eyeZ, 0f, 0f, 0f, 0f, 1f, 0f); gl.glRotatef(mAngleX, 0, 1, 0); gl.glRotatef(mAngleY, -1, 0, 0); // 绘制模型 cube.draw(gl); }
  • 请不要将代码块发布为 cmets。改为编辑问题。
  • 对不起..我不知道该怎么做..

标签: android opengl-es camera


【解决方案1】:

GLU.gluLookAt(gl, eyeX, eyeZ, eyeZ, 0f, 0f, 0f , 0f, 1f, 0f); 是一个让你的相机看着一个特定点的函数,在这种情况下它是 (0,0,0) (我想,不记得参数是哪个方向的,但我假设最后 3 个是你的向上向量)。因此,如果您将相机移向您正在看的东西,最终它会穿过它并从另一侧出来,并且由于您使用的是GLU.gluLookAt,它会转向面对它后面的物体,从而给您的印象是您当您继续朝同一方向移动时正在缩小。

【讨论】:

  • 是的..你是对的..那么我能做些什么来避免它..我的意思是确保相机不应该从后面转向物体
  • 您将不得不停止使用 glulookat。您需要使用 glrotate 旋转相机以使其朝向您想要的方向,然后使用 gltranslate 将其移动到您想要的位置(或先平移然后旋转,通常事件的顺序是向后的)
  • 或者您可以使用 glulookat,并将其视点移动您正在向前移动的数量,即 GLU.gluLookAt(gl, eyeX, eyeZ, eyeZ, 0f, 0f, (startEyeZ - currentEyeZ) , 0f, 1f, 0f); 不确定这是否正确,但可以达到这种效果(您也确定您是意味着在该函数的参数中有 2 个eyeZ?)
  • 实际上,opengl 中没有相机的概念,要移动“相机”,您可以移动场景中的所有内容。即,进行平移/旋转,这将影响您从那时起渲染的所有其他对象。如果你在做 opengl 2+,这会更明显
  • 你基本上可以自己使用平移和旋转来制作 glulookat,它实际上只是一个辅助函数。
猜你喜欢
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多