C++ 旋转gluLookAt的LookAt向量

C++ 旋转gluLookAt的LookAt向量,c++,opengl,C++,Opengl,我是opengl的新手。目前,我正在做一个创建场景的项目 现在,我的团队正在为我的相机使用gluLookAt()。我想要完成的是尝试围绕某个点旋转LookAt向量,也就是相机正在观察的位置 这实现了一种“在一个圆圈中摇摆”。我需要这个,因为我正在为场景制作飞镖游戏,我的相机保持静止,但我需要它在一个圆圈中移动,但仍然允许用户的鼠标影响它。我还需要它来创造一个醉酒的运动。这就是为什么我不考虑向上旋转或眼睛向量的原因 目前,我对代码的看法是这样的 int deltax = x - mouse.mX;

我是opengl的新手。目前,我正在做一个创建场景的项目

现在,我的团队正在为我的相机使用
gluLookAt()
。我想要完成的是尝试围绕某个点旋转
LookAt
向量,也就是相机正在观察的位置

这实现了一种“在一个圆圈中摇摆”。我需要这个,因为我正在为场景制作飞镖游戏,我的相机保持静止,但我需要它在一个圆圈中移动,但仍然允许用户的鼠标影响它。我还需要它来创造一个醉酒的运动。这就是为什么我不考虑向上旋转
眼睛
向量的原因

目前,我对代码的看法是这样的

int deltax = x - mouse.mX;
int deltay = y - mouse.mY;
cameradart.mYaw -= ((deltax/360.0) * 3.142) * 0.5;
cameradart.mPitch -= deltay * 0.02;
mouse.mX = x;
mouse.mY = y;
cameradart.lookAt.x = sin (cameradart.mYaw);
cameradart.lookAt.y = cameradart.mPitch ;
cameradart.lookAt.z = cos (cameradart.mYaw);
gluLookAt (cameradart.eye.x, cameradart.eye.y, cameradart.eye.z,
           cameradart.eye.x + cameradart.lookAt.x, cameradart.eye.y + cameradart.lookAt.y,
           cameradart.eye.z + cameradart.lookAt.z,
           cameradart.up.x, cameradart.up.y, cameradart.up.z);

我知道使用不同的摄像头可以更容易地完成,但我真的不想因为不使用
gluLookAt()

我想到了一些解决方案,我会告诉你作为一名新的图形学生最容易理解/实现的方法

假设您首先看到(0,0,1)-存储该向量-:

想象一个画圆的点,你看着它

-先向右和向左转弯(X&Z上的2D)

-假设HDiff是旧鼠标位置和新鼠标位置之间的水平差

-更新x=cos(HDiff)

-更新z=sin(HDiff)


*我没有试过,但它应该能工作:)

如果你想操纵相机,使用相机矩阵比使用gluLookat更有效。GLM是一个很好的矩阵和向量数学库,它包含一个lookat机制,可以用来初始化矩阵,也可以通过一系列操作来初始化矩阵。但是,请记住,“注视”生成视图矩阵,并且视图矩阵是摄影机矩阵的逆矩阵

这段代码演示了我所说的内容。具体看一下player成员变量及其操作方式

glm::mat4 player;

...

glm::vec3 playerPosition(0, eyeHeight, ipd * 4.0f);
player = glm::inverse(glm::lookAt(playerPosition, glm::vec3(0, eyeHeight, 0), GlUtils::Y_AXIS));
这种方法允许您将旋转和平移等更改直接应用于玩家矩阵

// Rotate on the Y axis
player = glm::rotate(player, angle, glm::vec3(0, 1, 0));
这比操纵视图矩阵直观得多,因为对视图矩阵的更改总是与对玩家矩阵的更改相反

准备渲染时,需要将播放器矩阵转换为视图矩阵,方法是取其逆矩阵。在我的例子中,是这样做的:

gl::Stacks::modelview().top() = riftOrientation * glm::inverse(player);
这是因为我正在使用一个基于应用程序的modelview矩阵堆栈,该堆栈将应用于我正在运行的着色器程序

对于OpenGL 1.x程序,您应该使用
LoadMatrix

glMatrixMode(GL_MODELVIEW);
glm::mat4 modelview = glm::inverse(player);
glLoadMatrixf(&modelview);

谢谢问题:我正在更新x和z的外观吗?这意味着我将拥有cameradart.lookat.x=sin(cameradart.mYaw)*(cos HDiff)。我说的对吗?看起来我犯了一个错误。这么长时间以来,我一直在说[link]x'=xcos(HDiff)-zsin(HDiff),| |,z'=zcos(HDiff)+xsin(HDiff)。还有一件事要做,那就是理解我第一次写的东西和我作为评论写的东西之间的区别:首先,你总是从原点计算新的x&z,HDiff应该表示光标离原点有多远,| |,注释忽略原点,它只是不断修改x&z而不需要存储原点并回答您的问题,不,谢谢!我想我试过一点后就明白了。我总是觉得当我刚读到一些东西时,我就有一半的理解力。当我使用某样东西时,我会完全理解它。