【发布时间】:2016-07-17 17:21:44
【问题描述】:
我正在开发一些游戏来学习 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
【问题讨论】:
-
那么,当你asked this question yesterday但没有得到答案时,为什么你觉得删除那个问题再问是合适的?
-
我认为缺乏解释。我发布了更清晰的解释。
-
@NicolBolas 我有一个突破和编辑的问题。
-
我不知道您为什么选择使用顺序旋转向量使事情复杂化。但是,由于您没有向我们展示如何“计算新旧 Z 轴之间的角度差”,这很可能就是您的问题所在。
标签: opengl