我正在开发一些游戏以学习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
答案 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版本按我期望的方式工作,那么应该为您进行翻译和轮换。