旋转gluLookAt的LookAt向量

时间:2014-03-01 14:28:29

标签: c++ opengl

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

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

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

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

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()而弄乱我的团队代码。

2 个答案:

答案 0 :(得分:0)

我脑子里有几个解决方案,我会告诉你最容易理解/实现的新图形学生

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

想想一个画一个圆圈并且你正在看它的点,

- 首先左右转(X& Z上的2D)

-Let HDiff是旧鼠标位置与新鼠标位置之间的水平差异

- 更新x = cos(HDiff)

- 更新z = sin(HDiff)

*我没试过,但它应该有效:)

答案 1 :(得分:0)

如果您希望能够操作相机,使用相机矩阵比使用gluLookat更有效。 GLM是一个很好的矩阵和向量数学库,包括一个可以用来初始化矩阵的lookat机制,或者你可以通过一系列操作来初始化它。但是,请记住,lookat会生成视图矩阵,视图矩阵是摄像机矩阵的

This piece代码演示了我正在谈论的内容。具体来看看玩家成员变量及其操作方式

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);

这是因为我正在使用基于应用程序的模型视图矩阵堆栈,该堆栈应用于我正在运行的Shader程序。

对于OpenGL 1.x程序,您改为使用LoadMatrix

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