所以我试图在Android上学习OpenGL 2.0,我确实在iOS上玩OpenGL 1并且非常喜欢它。
我的简单问题是关于相机和制作可以四处移动的3D环境(第一人称)
我应该使用
Matrix.setLookAtM(mViewMatrix, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ, upX, upY, upZ);
控制相机以及我在世界上的位置(在onDrawFrame上更新),或者在onSurfaceCreated上设置(一次)并使用
Matrix.setIdentityM(mViewMatrix, 0);
Matrix.translateM(mViewMatrix, 0, mMoveY, 0.0f, mMoveX);
Matrix.rotateM(mViewMatrix, 0, mDeltaY, 1.0f, 0.0f, 0.0f);
Matrix.rotateM(mViewMatrix, 0, mDeltaX, 0.0f, 1.0f, 0.0f);
相反,感觉就像是在旋转我周围的世界。
我已经看过他们做过的例子,在OpenGL 1我曾经使用过GLLookAt
答案 0 :(得分:1)
这两种方法中的任何一种都很好,因为你可以得到相同的结果。一般差异在于您希望如何存储对象状态。对于3D环境,我总是使用3个向量来确定对象状态(位置,向前,向上),并使用lookAt和modelMatrix的修改版本,它们可以使用与lookAt相同的参数放置对象。这种方法的优点是你可以根据其他物体直接放置参数,例如:导弹跟随你,并且总是转向你,无论你在哪里或如何移动。然后它的前向向量只是taregetPosition-missilePosition
(通常是标准化的)。另一方面,如果你必须计算角度,你可以直接asin
,acos
和一些if
语句来完成两个角度。接下来例如简单地在房间里移动,前进:如果你使用基矢量,那么position = position+forward*speedFactor
同时使用角度你再次必须计算你面对的方式然后做同样的...(有相当的...几个有用的情况)
但有缺点。您需要拥有自己的系统来移动和旋转这些向量。例如,如果你想说向左转45度,它将看起来像这样:
forward = (forward+cross(up,forward)*tan(45)).normalized
这仅适用于间隔(-90,90)的角度。在调高时它会变得非常相同,但您还需要校正向上矢量。
所以要把它包起来,如果你创建了使用基本向量的所有方法(旋转,看看,模型矩阵......),它们是一种真正省力的方法。但它只取决于你所写的项目来决定使用什么。