OpenGL:相机和物体

时间:2016-07-17 17:21:44

标签: opengl

我正在开发一些游戏以学习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 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 个答案:

答案 0 :(得分:1)

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

foo

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

float matrix[16];

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

(请注意,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; 0.0常量非常重要,原因我不会赘述。)

然后简单地替换:

1.0

有了这个:

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

如果您的OpenGL版本按我期望的方式工作,那么应该为您进行翻译和轮换。