Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL-ES-android中的摄像机运动_Android_Opengl Es_Camera - Fatal编程技术网

OpenGL-ES-android中的摄像机运动

OpenGL-ES-android中的摄像机运动,android,opengl-es,camera,Android,Opengl Es,Camera,我对GLU.gLookAt(eyeX,eyeY,eyeZ,Xpos,Ypos,Zpos,upX,upY,upZ)方法的使用感到非常困惑。我只想缩放3d立方体。 当我增加/减少eyeZ的值时,相机向前/向后移动到立方体。在eyeZ的某个限制范围内都可以,但是当我将eyeZ值增加到该限制范围之外时,它开始恢复效果,即,它开始缩小,而不是放大 我可能不擅长openGL来理解上述方法,但有人能告诉我这背后的基本原因吗。 我提到了这个链接 如果你愿意,我可以把我的代码贴在这里 public void o

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

我可能不擅长openGL来理解上述方法,但有人能告诉我这背后的基本原因吗。 我提到了这个链接

如果你愿意,我可以把我的代码贴在这里

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方法的方法。

GLU.gLookAt(gl,eyeX,eyeZ,eyeZ,0f,0f,0f,0f,1f,0f)
是一个函数,它可以让你的相机看到一个特定的点,在这个例子中是(0,0,0)(我想,我不记得参数是哪一个方向,但我假设最后3个是你的上方向向量)。因此,如果你将相机朝着你所看到的方向移动,它最终会穿过相机并从另一边出来,因为你使用的是
GLU.gluLookAt
,它会转向它后面的物体,这样你就会觉得当你继续朝同一方向移动时,你正在缩小,以及它开始向外缩放的点,如果沿直线移动相机,则在某一点您距离目标最近。public void onDrawFrame(GL10 gl){gl.glClear(GL10.gl_COLOR_BUFFER_BIT | GL10.gl_DEPTH_BUFFER_BIT);gl.glMatrixMode(GL10.gl_MODELVIEW);gl.glLoadIdentity()//.glTranslatef(xPos,yPos,-zoomFactor);GLU.glookat(gl,eyeX,eyeZ,eyeZ,0f,0f,1f,0f);gl.glRotatef(mAngleX,0,1,0);gl.glRotatef(mAngleY,-1,0,0);//绘制模型立方体。绘制(gl);}请不要将代码块作为注释发布。请改为编辑问题。对不起。我没有这么做。是的。你是对的。那么我可以做些什么来避免它。我的意思是确保相机不应该从后面转向面向对象。你必须停止使用glulookat。你需要使用glrotate旋转相机,以面向对象e您想要的方向,然后使用gltranslate将其移动到您想要的位置(或者先平移然后旋转,通常事件顺序是向后的),或者您可以使用GLOOKAT,并将其注视点移动到您正在向前移动的量,即
GLU.GLOOKAT(gl,eyeX,eyeZ,eyeZ,0f,0f,(startEyeZ-currentEYZ),0f,1f,0f)
不确定这是否正确,但有这样的效果(您是否确定该函数的参数中有2个
eyeZ
)实际上,在opengl中没有相机的概念,要移动“相机”,你就要移动场景中的所有东西。也就是说,从那时起,进行平移/旋转,这将影响到你渲染的所有其他对象。如果你在做opengl 2+ye,这将更明显。本质上,你可以自己使用平移和旋转制作glulookat,这只是一个h埃尔珀函数真的很有用。