3D libgdx旋转(3D libgdx rotation)

2019-10-21 17:45发布

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

(对不起,我伟大的绘图功能...)

我有一个球,半径0.5(因此,周界是3.1415926)。 在每个帧中,我有它在oldPosition ,我想将其放置在position ,所以,在蓝色箭头方向,由图中的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);

所以,基本上,我开始与识别Matrix4。 在我申请一个旋转,它每一帧,应用旋转球体,和翻译。

这似乎在第一工作(?),但很多旋转之后,球开始在错误的方向旋转。

我试着用四元数的实现,但没有运气,以及。 它应该是简单的,我忘了。

Answer 1:

就像@Springrbua说,你可以采取跨产品,以获得轴绕。 例如(未测试的代码):

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);
}

这里有一个工作示例的完整源: https://gist.github.com/xoppa/3b841fb52f46e8cdec24



文章来源: 3D libgdx rotation