gpt4 book ai didi

c++ - FPS 风格相机

转载 作者:行者123 更新时间:2023-11-28 07:29:06 25 4
gpt4 key购买 nike

我是 GLM 的新手,正在尝试编写一个 fps 风格的相机类

移动鼠标时是否需要重新计算向上 vector ?

但是在我改变向上 vector 之后一切看起来都很奇怪

不过,当我维护向上 vector 时,我的程序看起来有问题

文件:fpscamera.cpp

void FPSCamera::rotateScreen(float dx, float dy){
auto oldDirection=getTarget()-getPosition();

setTarget(getPosition()+rotate(oldDirection, -dx*5, getUp()));
auto oldHoro=rotate(cross(oldDirection,getUp()), -dx*5, getUp());
setTarget(getPosition()+rotate(getTarget()-getPosition(),dy*5, oldHoro));

////////////////HERE////////////////////////
//setUp(normalize(cross(oldHoro,getTarget()-getPosition())));
}

您可以在这里下载源代码和二进制文件

https://docs.google.com/file/d/0B9givuJvSet8ekRReWtRM29ldzg/edit?usp=sharing

需要 mingw-built64 g++4.8(C++11) glfw3 GLM(MathHelper 库)

g++ -std=c++0x -Wall main.cpp mesh.cpp fpscamera.cpp -lglfw3 -lopengl32 -lglu32 -lgdi32

朝着目标前进……W

左转/右转.... Q/E

向左/向右移动.... A/D

====================2013/8/6 编辑我编辑我的相机类并添加偏航俯仰滚动功能

void Camera::roll(float among){
if(isChange) resetCacheAxis();
upVec=glm::rotate(upVec, among, cacheY);
isChange=true;
}

void Camera::pitch(float among){
if(isChange) resetCacheAxis();
targetVec=posVec+glm::rotate(targetVec-posVec, among, cacheX);
upVec=glm::normalize(glm::cross(cacheX, targetVec-posVec));
isChange=true;
}
void Camera::yaw(float among){
if(isChange) resetCacheAxis();
targetVec=posVec+glm::rotate(targetVec-posVec, among, cacheZ);
isChange=true;
}

void Camera::resetCacheAxis(){
cacheY=glm::normalize(targetVec-posVec);
cacheZ=glm::normalize(upVec);
cacheX=glm::cross(cacheY, cacheZ);
}

我用偏航和俯仰实现鼠标相机控制

void FPSCamera::rotateScreen(float dx, float dy){
yaw(-dx);
pitch(dy);
}

问题依然存在....

Initial

沿着圆圈路径移动鼠标几次后.....

final

最佳答案

相机应该围绕 2 轴旋转。向上 vector 和扫射 vector 。围绕向上 vector 旋转给出左右“外观”,而围绕扫射 vector 旋转给出上下“外观”。

进行旋转时,不仅需要变换方向,还需要变换up vector 和strafe vector 。你似乎不在这里这样做。转换后必须至少更改 2 个 vector ,因为所有 3 个 vector 必须彼此正交

看看下面的伪代码:

public static void MouseLook(float x, float y)
{
Matrix xRot = Matrix.CreateFromAxisAngle(Vector3.Up, x * rotationSpeed);
Matrix yRot = Matrix.CreateFromAxisAngle(Vector3.Right, y * rotationSpeed);

viewMatrix = viewMatrix * yRot * xRot;

// Orthogonalize the matrix
OrthoNormalize();
}

private static void OrthoNormalize()
{
Vector3 zAxis = viewMatrix.Forward;
zAxis.Normalize();

Vector3 xAxis = Vector3.Cross(Vector3.Up,zAxis);
xAxis.Normalize();



Vector3 yAxis = Vector3.Cross(xAxis,zAxis);
yAxis.Normalize();

viewMatrix.Forward = zAxis;
viewMatrix.Up = yAxis;
viewMatrix.Right = xAxis;
}

检查以下问题,因为它有您正在寻找的答案:Camera Rotation

关于c++ - FPS 风格相机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18052256/

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