gpt4 book ai didi

android - 3D libgdx 旋转

转载 作者:行者123 更新时间:2023-11-30 02:22:41 26 4
gpt4 key购买 nike

我认为这个问题不是重复的,或者如果是,我不明白如何让它工作。

(对不起,我的绘图能力很强......) Rotation Schema

我有一个球,半径为 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 开始。在每一帧中,我对其应用旋转,在球体中应用该旋转,然后平移它。

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

我尝试了使用四元数的实现,但也没有成功。这应该是我忘记的简单事情。

最佳答案

就像@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

关于android - 3D libgdx 旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28262490/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com