当前位置: 首页 > 知识库问答 >
问题:

FPS样式照相机

宓毅庵
2023-03-14

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

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

然而,在我改变向上向量后,一切看起来都很奇怪

但是当我保持向上向量时我的程序看起来有问题

文件:FPSCAMER。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-标准=c 0x-墙干管。cpp网格。cpp FPS摄像头。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个答案

邵正雅
2023-03-14

相机应绕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;
}

检查下面的问题,因为它有你想要的答案:相机旋转

 类似资料:
  • 虽然我熟悉OpenGl(LWJGL),但我目前正在进行一个小型fps项目的测试。我这里的问题是相机的旋转不是很平稳。它从一个像素跳到另一个像素,这实际上非常明显。我怎样才能把它弄平滑呢?[链接到片段:]https://www.youtube.com/watch?v=6Hgt1hXCKKA 代码摘要:我将当前鼠标位置存储在Vector2f中; 我通过相机的相对运动增加偏航和俯仰(新位置-旧位置);

  • 本章将介绍照相机的概念,以及如何使用Three.js设置相应的参数。对于熟悉图形学照相机概念的读者,可以直接阅读2.3和2.4节。

  • 什么是照相机?这个问题似乎太简单了,用来拍照的机器。咔嚓! 可是,在图形学中照相机的概念并非如此。 我们使用Three.js创建的场景是三维的,而通常情况下显示屏是二维的,那么三维的场景如何显示到二维的显示屏上呢?照相机就是这样一个抽象,它定义了三维空间到二维屏幕的投影方式,用“照相机”这样一个类比,可以使我们直观地理解这一投影方式。 而针对投影方式的不同,照相机又分为正交投影照相机与透视投影照相

  • 在Android上, 有人知道snapchat使用了什么技巧在他们的相机预览中获得如此高的fps吗?我尝试了各种方法: 使用文本评论而不是表面视图 强制硬件加速 使用较低的分辨率 使用不同的预览格式(YV12、NV21丢帧) 改变对焦模式 没有人能让我达到30帧/秒的恒定速度,甚至可能超过snapchat的速度。我可以获得与谷歌相机应用程序相同的fps,但这并不好,我的显示分辨率要低得多。 编辑:

  • 所以我遇到了一个问题,前面在我提问的问题中提到过:将图像(ACTION_image_CAPTURE)上载到Firebase存储 我对这个问题进行了更多的搜索,并应用了Android Studio文档:https://developer.android.com/training/camera/photobasics.html#TaskPhotoView 所以,在您阅读代码之前,我基本上想说一下需要什

  • 我在做一个增强现实项目。当发现图像目标时,ARCamera跟踪目标。我希望相机只移动XZ轴而不影响Y轴。