Android 三维libgdx旋转

Android 三维libgdx旋转,android,3d,rotation,libgdx,Android,3d,Rotation,Libgdx,我认为这个问题不是重复的,或者如果是重复的话,我不知道如何使这个工作 (对不起,我的绘画能力很强……) 我有一个球,半径0.5(周长是3.1415926)。 在每个帧中,我都将其置于oldPosition位置,并且我希望将其置于位置,因此,沿蓝色箭头方向移动,该方向由图形中的v向量表示。这很容易 诀窍是我希望球在目标位置旋转。旋转轴应垂直于方向(绿色虚线),并应相对于对象中心进行旋转(旋转长度为平移长度的2倍) 目前我的libgdx代码如下所示: // During object initia

我认为这个问题不是重复的,或者如果是重复的话,我不知道如何使这个工作

(对不起,我的绘画能力很强……)

我有一个球,半径0.5(周长是3.1415926)。 在每个帧中,我都将其置于
oldPosition
位置,并且我希望将其置于
位置
,因此,沿蓝色箭头方向移动,该方向由图形中的v向量表示。这很容易

诀窍是我希望球在目标位置旋转。旋转轴应垂直于方向(绿色虚线),并应相对于对象中心进行旋转(旋转长度为平移长度的2倍)

目前我的libgdx代码如下所示:

// During object initialization I have a Matrix4 with identify
Matrix4 rotation = new Matrix4();


// Now, this code during render()
Vector3 movement = position.sub(oldPosition);
float length = movement.len();

// drawing this on paper, it seems a correct way to compute orthogonal vector
rotation.rotateRad(new Vector3(-movement.z, 0f, movement.x), 2*length);

iSphere.transform = rotation.cpy().trn(position);
所以,基本上,我从识别矩阵4开始。在每个帧中,我对其应用旋转,在球体中应用该旋转,然后平移它

一开始这似乎是可行的(?),但经过多次旋转后,球开始向错误的方向旋转


我尝试了一个四元数的实现,但是运气不好。这应该是我忘记的简单的事情。

就像@Springrbua说的,你可以用叉积来让轴旋转。例如(未测试的代码):


下面是一个工作示例的完整来源:

您确切想要实现的目标有点模糊。也许可以添加一个图像/图纸来让它更清晰。据我所知,你想移动球,并在移动时绕着自己的轴旋转。是吗?谢谢你的评论。添加了一幅(精彩的)图画,并重新表述了文本。希望能有帮助@SpringBua是对的,我不能确切地告诉你如何使用libgdx3DAPI,因为我对它知之甚少。但是我想你应该存储一个
向量3
方向,你移动的方向。然后,您可以围绕您的方向和Y轴的交叉点旋转球。我想@Xoppa可以告诉你在libgdxI中实现这一点的最佳方法是什么,似乎有时候事情会朝相反的方向发展,就像我自己的实现一样。另外,为了充分理解,这个比例相当于一个normalize
nor()
,对吗?这是由矩阵乘法的顺序引起的。我已经更新了答案,使用了分离的组件,正如这里所解释的,您可能应该使用分离的组件:作为旁白,如果四元数乘法是用
mul
方法完成的,那么行为将与我的原始代码相同。因此,这可能与强调que
mulLeft
用法有关。
public void update(float delta) {
    velocity.add(tmpV.set(acceleration).scl(delta));
    position.add(tmpV.set(velocity).scl(delta));
    final float speed = velocity.len();
    final float angle = speed*delta*MathUtils.radiansToDegrees;
    Vector3 axis = tmpV.set(velocity).scl(-1f/speed).crs(Vector3.Y);
    tmpQ.set(axis, angle);
    rotation.mulLeft(tmpQ);
    transform.set(position, rotation);
}