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

OpenGL在相机周围移动场景

东门城
2023-03-14

我正在制作一个小的3D世界,现在我正在修理相机。

相机停留在世界中的固定位置,而世界可以用鼠标和键盘围绕它移动(模拟相机在世界中移动)。

以下是我的draw函数中的代码:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// store current matrix
glMatrixMode( GL_MODELVIEW );

glLoadIdentity();

glPushMatrix( );

GLfloat light_pos [] = {3, -1, 0, 1};
GLfloat light_dir [] = {0, 0, -1};

glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, light_dir);

glTranslated(-cam->getXPos(), -8, -cam->getZPos());
glRotated(cam->getYRot(), 1, 0, 0);
glRotated(cam->getXRot(), 0, 1, 0);

GLfloat diff [] = { .5, .5, .5, 1.0 };

glMaterialfv ( GL_FRONT, GL_DIFFUSE, diff );

glPushMatrix();
glTranslated(0, 0, -20);
glCallList(displayLists[LISTWALL]);
glPopMatrix();

// restore current matrix
glMatrixMode( GL_MODELVIEW );
glPopMatrix( );

只要我站着不动,环顾四周,一切都很好。另一方面,当我移动时,奇怪的事情开始发生。

首先,相机的Y坐标会发生变化,但它应该固定在Y=8(这就是为什么我将场景转换为-8)

第二,当我试图在世界中移动时,向前按应该只沿着z轴移动,但你会到达相机指向的位置(可能与第一个问题有关)

最后,当我在场景中四处移动时,环视开始表现出奇怪的行为,看起来相机不仅围绕自身旋转,还围绕着起点旋转。(这在一个完全3D的世界中很明显,而不是我在这里展示的一个多边形的简单示例)

共有1个答案

居和顺
2023-03-14

我找到了解决方案,在尝试了一些随机的事情之后,我发现我只需要交换旋转和平移,x和y旋转必须在平移之前发生。

这解决了我问题中描述的所有问题,相机保持在y=8,旋转不再发生在起点附近,而是发生在相机所在的点附近,移动也是固定的,向前按时相机沿原始Z轴移动。

 类似资料:
  • 我试图创建一个第一人称相机。我从我的XNA项目中提取了一段代码,并试图将其转换为java(LWJGL)。 如果我移动鼠标,俯仰和偏航会增加/减少。在开始运行我的游戏时,它运行良好,但在一些动作后,我无法向下或向上看。如果我的位置是 性能良好的XNA代码: 所以我发现LWJGL和XNA在旋转矩阵方面有一些不同。 Java: 结果: {1.0 0.0 0.0 0 0.0}{0.0 0.3299931-

  • 我正在开发一些游戏,以便学习OpenGL。 我正在尝试实现一种方法来拾取对象(例如,镐、枪等)。 这个想法是,即使在相机移动或旋转之后,这个物体也会固定在相机前面。 当我向前、向后、向左、向右、向上或向下移动时,我可以通过在相机正前方设置对象的位置来使对象跟随我。 然而...当相机旋转/倾斜(向上、向下、向左、向右看...)问题就开始了。 在这种情况下,一切都很好(向上、向下、向左、向右、向右倾斜

  • 我有一个用WASD控制的相机,但是我一直在左右移动它。我一直在网上寻找,它说要找到一个垂直于另一个向量的向量,你改变x和y的圆,并将其中一个乘以-1。我在下面的代码中尝试过这个: 我一直在向前移动,工作得很好,实际上是在转动相机,但由于某些原因,这不起作用,老实说,我不确定它到底是做什么的,因为当我按下或(他们称之为该功能)时,相机会发疯,开始非常快速地转动,有时会向前移动,或者像100万英里以外

  • 问题内容: 以下内容适用于Android操作系统。 我正在尝试使用相机估计手机所处房间的黑暗(或明亮)。 这个想法是相机可以返回一定的亮度水平,我可以用它来确定手机周围的光量。 我的问题很简单:如何使用摄像头(背面摄像头的前部)获得这种亮度(“光量”)? 提前致谢。 问题答案: 在光传感器上注册侦听器的方法如下: 编辑: 感谢@AntiMatter的建议更新。 文件:

  • 我正在使用GLM库实现一个第一人称相机,它为我提供了一些有用的函数,可以计算透视和“注视”矩阵。我也在使用OpenGL,但这不会对代码产生影响。 在这张图片中,你可以看到四个摄像头的位置。标有1的是在运动之前,标有2的是在运动之后。红色三角形表示沿z轴笔直向前的相机。蓝色三角形代表一个相机,该相机已沿x轴(向左)旋转向后看。当我按下“向前移动键”时,相机在两种情况下都会沿z轴向前移动,而不考虑相机