我是opengl的新手。目前,我正在做一个创建场景的项目。
现在,我的团队正在使用gluLookAt()
用于我的相机。我想要完成的是尝试围绕某个点(即相机正在看的位置)旋转LookAt
向量。
这实现了一种“在一个圆圈中摇摆”。我需要这个,因为我正在为场景做一个飞镖游戏,我的相机保持不动,但我需要它移动一圈,但仍然允许用户的鼠标影响它。我还需要它来创造一个醉酒的运动。这就是为什么我不考虑轮换Up
或Eye
向量。
目前,我对代码的看法是这样的。
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)
我脑子里有几个解决方案,我会告诉你最容易理解/实现的新图形学生
首先假设您正在查看(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);