FPS风格的相机
Posted
技术标签:
【中文标题】FPS风格的相机【英文标题】:FPS-style Camera 【发布时间】:2013-08-05 07:01:18 【问题描述】:我是 GLM 的新手,正在尝试编写一个 fps 风格的相机类
移动鼠标时是否需要重新计算向上矢量?
但是在我改变了向上的向量之后,一切看起来都很奇怪
不过,当我维护向上向量时,我的程序看起来有问题
文件: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 Library)
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);
问题依然存在....
将鼠标沿圆形路径移动数次后.....
【问题讨论】:
【参考方案1】:相机应该围绕 2 轴旋转。向上向量和扫射向量。围绕向上矢量旋转给出左右“看”,而围绕扫射矢量旋转给出向上和向下“看”。
在执行旋转时,不仅需要变换方向,还需要变换向上向量和扫射向量。你在这里似乎没有这样做。转换后必须至少更改 2 个向量,因为所有 3 个向量必须彼此正交。
看看下面的伪代码:
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
【讨论】:
抱歉,我不知道如何实现 CreateFromAxisAngle...(这就是我使用 glm 的原因:P) @Tim Hsu 它只是伪代码。关键是你需要围绕向上向量和扫射向量旋转,两者都是相互垂直的。 @Tim Hsu 不幸的是我不使用 GLM,但无论您使用什么库,这个想法都应该保持不变。 @Tim Hsu 查看我答案底部的链接。 我可以结合偏航和俯仰来做到这一点吗??以上是关于FPS风格的相机的主要内容,如果未能解决你的问题,请参考以下文章