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

OpenGL:相机和对象

张可人
2023-03-14

我正在开发一些游戏,以便学习OpenGL。

我正在尝试实现一种方法来拾取对象(例如,镐、枪等)。

这个想法是,即使在相机移动或旋转之后,这个物体也会固定在相机前面。

当我向前、向后、向左、向右、向上或向下移动时,我可以通过在相机正前方设置对象的位置来使对象跟随我。

然而...当相机旋转/倾斜(向上、向下、向左、向右看...)问题就开始了。

在这种情况下,一切都很好(向上、向下、向左、向右、向右倾斜、向左倾斜...所有这些操作都转化为围绕x、y、z轴旋转),直到我组合几个旋转,例如向后旋转180度,然后尝试向上旋转(在我们的语言中:在Z轴上旋转180度,然后在X轴上旋转)。

物体开始以一种奇怪的行为绕着自己旋转。如果我在Z轴上向后旋转-180度(=再次向前看),然后向上看(绕X轴旋转),那么物体旋转得很好。

相机有4个矢量,每个对象有4个矢量:原点、x、y和z(代表对象坐标系)。

要向前移动相机,我从当前位置减去z轴

其他方向也一样。

为了使相机向右倾斜,我只需计算绕Z轴的旋转,并应用于X、Y轴。

注意:世界上所有方向和角度的运动都很好。

以下是我用来在世界上定位物体的(相关)代码。在绘制它们之前,我首先将它们放在原点(回想一下:我将原点和x、y、z轴保存到所有对象),然后进行缩放以适合我所需的大小:

// translate to position
gl.glTranslatef((float)origin.x, (float)origin.y, (float)origin.z);
// scale to size
gl.glScalef((float)size.x, (float)size.y, (float)size.z);
// apply rotation around the html" target="_blank">object's axes
gl.glRotatef(xrot, (float)x.x, (float)x.y, (float)x.z);
gl.glRotatef(yrot, (float)y.x, (float)y.y, (float)y.z);
gl.glRotatef(zrot, (float)z.x, (float)z.y, (float)z.z);

编辑:

这是我计算角度的方法:

Math.toDegrees(Math.acos(v1.dot(v2))) // dot is a simple dot product

共有1个答案

楚畅
2023-03-14

让我给你介绍一种叫做“矩阵”的东西:

float matrix[16];

矩阵是一个简单的数组,用于以OpenGL理解的格式将所有四个向量存储在一个整洁的包中。可以按以下方式将向量存储在矩阵中:

matrix[0] = getAxisX().getX();
matrix[1] = getAxisX().getY();
matrix[2] = getAxisX().getZ();
matrix[3] = 0.0;

matrix[4] = getAxisY().getX();
matrix[5] = getAxisY().getY();
matrix[6] = getAxisY().getZ();
matrix[7] = 0.0;

matrix[8] = getAxisZ().getX();
matrix[9] = getAxisZ().getY();
matrix[10] = getAxisZ().getZ();
matrix[11] = 0.0;

matrix[12] = getOrigin().getX();
matrix[13] = getOrigin().getY();
matrix[14] = getOrigin().getZ();
matrix[15] = 1.0;

您可以在每次将数据传递给OpenGL时将其复制到矩阵中,或者通过采用矩阵作为现在将数据存储在对象中的标准方式,以后可以省去很多麻烦。

(请注意,0.01.0常量很重要,我不想在这里赘述。)

然后简单地替换:

gl.glTranslatef((float)origin.x, (float)origin.y, (float)origin.z);

有了这个:

gl.glMultMatrixf(matrix);

如果您的OpenGL版本按照我所期望的方式工作,那么应该为您完成翻译和旋转。

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

  • 我正在制作一个小的3D世界,现在我正在修理相机。 相机停留在世界中的固定位置,而世界可以用鼠标和键盘围绕它移动(模拟相机在世界中移动)。 以下是我的draw函数中的代码: 只要我站着不动,环顾四周,一切都很好。另一方面,当我移动时,奇怪的事情开始发生。 首先,相机的Y坐标会发生变化,但它应该固定在Y=8(这就是为什么我将场景转换为-8) 第二,当我试图在世界中移动时,向前按应该只沿着z轴移动,但你

  • Threejs是场景、渲染器、相机三大部分之一,在第一章新手上路部分已经进行了简单介绍。对于初学者而言,只要知道相机对象的作用是什么,可以不用深究,理解Threejs相机对象的最简单的方式就是参考生活中真实的相机拍照过程。 Threejs常用的相机对象就是正投影相机OrthographicCamera和透视投影相机PerspectiveCamera, 初学者对这两种相机对象建立一个基本的印象即可,

  • 症状是,“摄像头位置”似乎围绕x轴镜像(负z而非正z),并且“摄像头方向”与预期方向相反<换句话说,我必须将相机旋转180度,然后将其向前移动才能看到任何渲染 在我看过的所有OpenGl相机教程中,相机位置总是有一个正的z坐标。也许代码中只有一个符号错误,但我看不出来。我还发布了相应的着色器代码 我的对象在世界坐标z=0.1处渲染 摄影机实例的初始化显示在以下几行中 哪里 结果是黑屏。当我将相机位

  • 我最近完成的opengl程序中有一个“相机”。然而,我注意到每当我旋转然后再次移动时,x、y和z的角度都会改变。例如,当我按下“w”键时,我沿着“z”轴向前移动。如果我然后旋转相机90度,当我按下“W”键时,我实际上会沿着“x”轴向右移动。为什么会发生这种情况是有道理的,我只是想知道为什么会发生。这是旋转函数: 键盘功能: 以及我的翻译功能: 有没有办法解决这个问题?

  • 当我移动到右边的目标时,它确实会查看目标,并向上看,直到它与-zax成180度并决定走另一条路。