gpt4 book ai didi

android - 3D 第一人称相机旋转

转载 作者:行者123 更新时间:2023-11-29 00:48:58 26 4
gpt4 key购买 nike

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

这个类非常简单,相机对象有它的三个轴X、Y 和 Z

还有创建 ModelView 矩阵的函数(即 calculateModelViewMatrix() ),沿 X 轴和 Y 轴旋转相机并沿 Z 轴平移相机。

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

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

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

编辑

首先感谢您的回复。

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

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

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

最佳答案

有一个 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);
}
}

关于android - 3D 第一人称相机旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4613411/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com