gpt4 book ai didi

Android : OpenGL 2. 0 使用 Matrix.setLookAtM 旋转/移动相机

转载 作者:太空狗 更新时间:2023-10-29 16:42:07 27 4
gpt4 key购买 nike

所以这是我今天的第二个问题,我可能是在碰运气简而言之,制作一个 3D 第一人称视角,您可以在其中四处移动和环顾四周。

在我正在使用的 OnDrawFrame 中

Matrix.setLookAtM(mViewMatrix, 0, eyeX , eyeY, eyeZ , lookX , lookY , lookZ , upX, upY, upZ);

为了前后移动,向左回避等,我使用类似这样的东西(列出了前向代码)

float v[] = {mRenderer.lookX - mRenderer.eyeX,mRenderer.lookY - mRenderer.eyeY, mRenderer.lookZ - mRenderer.eyeZ};

mRenderer.eyeX += v[0] * SPEED_MOVE;
mRenderer.eyeZ += v[2] * SPEED_MOVE;

mRenderer.lookX += v[0] * SPEED_MOVE;
mRenderer.lookZ += v[2] * SPEED_MOVE;

这行得通

现在我想四处看看,并尝试移植我的 iPhone openGL 1.0 代码。这是左/右

float v[] = {mRenderer.lookX - mRenderer.eyeX,mRenderer.lookY - mRenderer.eyeY, mRenderer.lookZ - mRenderer.eyeZ};

if (x > mPreviousX )
{
mRenderer.lookX += ((Math.cos(SPEED_TURN / 2) * v[0]) - (Math.sin(SPEED_TURN / 2) * v[2]));
mRenderer.lookZ += ((Math.sin(SPEED_TURN / 2) * v[0]) + (Math.cos(SPEED_TURN / 2) * v[2]));
}
else
{
mRenderer.lookX -= (Math.cos(SPEED_TURN / 2) *v[0] - Math.sin(SPEED_TURN / 2) * v[2]);
mRenderer.lookZ -= (Math.sin(SPEED_TURN / 2) *v[0] + Math.cos(SPEED_TURN / 2) * v[2]);
}

这在大约 35 度时有效,然后就精神错乱了?

有什么想法吗?

最佳答案

首先,我建议不要跟踪 look 向量,而是跟踪 forward 向量,然后在 lookAt 方法中使用 eye +forward 生成look 向量。通过这种方式,您可以在移动时完全放松对 look 的更新,并且您不需要计算 v 向量(mRenderer.eyeX += forward。 x * SPEED_MOVE;...)

为了使事情更简单,我建议您在每次更改向量 forwardup 时对其进行归一化(我会像您在以下方法中所做的那样考虑)。

现在轮换有两种方式。使用 rightup 向量移动 forward(和 up),这对于小转弯非常有用(我会说最多 10 度,上限为 90 度)或计算当前角度,添加您想要的任何角度并重新创建矢量。

第一个提到的旋转方法很简单:

vector forward = forward
vector up = up
vector right = cross(forward, up) //this one might be the other way around as up, forward :)
//going left or right:
forward = normalized(forward + right*rotationSpeedX)
//going up or down:
forward = normalized(forward + up*rotationSpeedY)
vector right = cross(forward, up) //this one might be the other way around
vector up = normalized(cross(forward, right)) //this one might be the other way around
//tilt left or right:
up = normalized(up + right*rotationZ)

第二种方法需要一点三角学知识:

通常要计算一个角度,您可以调用 atan(forward.z/forward.x) 并添加一些 if 语句,因为生成的结果只是 180 度angle (我相信你可以在网上找到一些答案来从向量中获取旋转)。 up 向量也是如此,用于获取垂直旋转。然后在您获得角度后,您可以轻松地为角度添加一些度数并使用 sincos 重新创建矢量。但是有一个问题,如果你以这种方式旋转相机,那么前向直接向上(0,1,0)你需要从 up 向量中获得第一个旋转,第二个从 forward 向量,但如果将最大垂直角度限制在 +- 85 度左右(实际上有很多游戏都这样做),则可以避免所有这些情况。第二件事是,如果你使用这种方法,你的环境必须支持 +-infinitive 否则 atan(forward.z/forward.x) 将在 forward.x == 0 时刹车>.

还有一些关于第一种方法的补充。因为我看到你正试图在 2D 空间中移动,你的前向矢量与移动速度一起使用应该是 normalized(forward.x, 0, forward.z),所以将它标准化很重要,否则你如果相机向上或向下倾斜更多,将会移动得更慢。第二件事是,当您向左/向右旋转时,您可能希望将 up 向量强制为 (0,1,0) + 归一化右向量,最后从向前和向右重新创建向上向量。然后你应该再次限制垂直旋转(up.z 应该大于一些小值,比如 .01)

关于Android : OpenGL 2. 0 使用 Matrix.setLookAtM 旋转/移动相机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16022821/

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