【问题标题】:First Person Camera rotation in 3D3D 中的第一人称相机旋转
【发布时间】:2011-01-06 09:25:17
【问题描述】:

我已经为 android 编写了一个第一人称相机类。

这个类很简单,相机对象有它的三个轴 X,y 和 Z

并且有一些函数可以创建 ModelView 矩阵(即 calculateModelViewMatrix() ), 沿 X 和 Y 轴旋转相机 并沿其 Z 轴平移相机。

我认为我的 ModelViewMatrix 计算是正确的,我还可以沿 Z 轴平移相机。

沿 x 轴旋转似乎可行,但沿 Y 轴旋转会产生奇怪的结果。 旋转的另一个问题似乎是,我的 3d 模型不是旋转相机,而是开始沿其轴旋转。

我已经编写了另一个基于观察点的实现,并使用 openGL ES 的 GLU.gluLookAt() 函数来获取 ModelView 矩阵,但这似乎也遇到了完全相同的问题。

编辑

首先感谢您的回复。

我实际上已经实现了 Camera 类的第二个实现,这次使用了 android.opengl.Matrix 类中提供的旋转功能,如你所说。 我提供了下面的代码,更简单。

令我惊讶的是,结果“完全相同”。 这意味着我的旋转函数和 Android 的旋转函数产生了相同的结果。

我做了一个简单的测试并查看了我的数据。 我只是围绕 Y 轴一次旋转 LookAt 点 1-dgree 并查看坐标。似乎我的 LookAt 点落后于确切的旋转角度,例如在 20 度时,它只旋转了 10 到 12 度。 45度后开始反转

【问题讨论】:

    标签: android opengl-es 3d


    【解决方案1】:

    有一个 android.opengl.Matrix 类,它是静态方法的集合,可以在传入的 float[16] 上执行您需要的所有操作。我强烈建议您使用这些函数,而不是自己滚动。您可能希望 setLookAtM 使用根据您的相机角度计算的观察点(使用 sin、cos,就像您在代码中所做的那样 - 我假设您知道如何执行此操作。)

    -- 编辑以响应新答案--

    (顺便说一句,你可能应该编辑过你原来的问题——你作为另一个问题的回答让我有点困惑)

    好的,这是一种方法。这是未编译和未经测试的。我决定改为手动构建矩阵;也许这会提供更多关于正在发生的事情的信息......

    class TomCamera {
         // These are our inputs - eye position, and the orientation of the camera.
         public float mEyeX, mEyeY, mEyeZ; // position
         public float mYaw, mPitch, mRoll; // euler angles.
    
         // this is the outputted matrix to pass to OpenGL.
         public float mCameraMatrix[] = new float [16];
    
         // convert inputs to outputs.
         public void createMatrix() {
             // create a camera matrix (YXZ order is pretty standard)
             // you may want to negate some of these constant 1s to match expectations.
             Matrix.setRotateM(mCameraMatrix, 0, mYaw, 0, 1, 0);
             Matrix.rotateM(mCameraMatrix, 0, mPitch, 1, 0, 0);
             Matrix.rotateM(mCameraMatrix, 0, mRoll, 0, 0, 1);
             Matrix.translateM(mCameraMatrix, 0, -mEyeX, -mEyeY, -mEyeZ);
         }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-29
      • 1970-01-01
      • 2021-02-21
      • 2018-01-22
      • 1970-01-01
      相关资源
      最近更新 更多