gpt4 book ai didi

java - 通过拖动在 libGDX 中真实地旋转 3D 模型

转载 作者:行者123 更新时间:2023-11-30 08:51:08 24 4
gpt4 key购买 nike

我正在尝试在 libGDX 中创建一个立方体,用户可以通过点击(或单击)和拖动来旋转它。我希望感觉好像立方体的边缘被拖向您滑动的方向,这让我想到了我的问题。我需要模型独立于它已经旋转的方式进行旋转。

例如,如果放置立方体使得 Y 轴垂直运行,则向右滑动应使立方体绕 Y 轴旋转。但是,如果另一个轴(例如 X 轴)在立方体当前位置垂直运行,则相同的手势应围绕 X 轴旋转立方体。

当没有轴直接垂直于手势方向时,情况会更加复杂。是否需要在多个轴上进行某种旋转组合?

我对完成此任务所需的计算感到困惑,但我确信这是可能的,如果可能通过我没有想到的完全替代方法的话。任何帮助或见解将不胜感激!

最佳答案

在这种情况下,我强烈建议您使用四元数,因为它们对于 3D 空间中的旋转更加独立。

但是:由于您应该知道在屏幕上滑动的方向(一对 X、Y 屏幕坐标),您应该能够计算出表示手势的 vector 。

在libgdx中你可以通过调用camera的方法得到一个pickRay

.getPickRay(float screenX, float screenY)

我们需要 3D 空间中位于相机和对象旋转中心之间的两个点,它们代表两个屏幕坐标,以便计算该旋转的四元数:

//你不需要归一化光线的方向,因为 libgdx 会为你做这件事

final Ray ray1 = camera.getPickRay(oldScreenX, oldScreenY);
final Ray ray2 = camera.getPickRay(currentScreenX, currentScreenY);

// instead of 0.1 use some other values, preferably your camera.near value
// you can play with the scale value since it also represents how much of rotation you will get
final Vector3 screen1 = ray1.direction.cpy().scl(0.1).add(ray1.origin);
final Vector3 screen2 = ray2.direction.cpy().scl(0.1).add(ray2.origin);

现在您在 3D 空间中有了两个点,您可以通过涉及对象中心来计算表示要执行的旋转的两个 vector :

final Vector3 cross1 = screen1.cpy().sub(myObjectsCenterPosition).nor();
final Vector3 cross2 = screen2.cpy().sub(myObjectsCenterPosition).nor();
final Quaternion rotation = new Quaternion();
rotation.setFromCross(cross1, cross2);

由于您应该为对象旋转设置一个四元数,因此您可以将新的旋转应用于对象的四元数:

myObjectRotation.mulLeft(rotation);

然后根据对象的旋转四元数旋转你的对象:

myModelInstance.transform.set(myObjectRotation);

我希望我没有忘记任何重要的事情。

关于java - 通过拖动在 libGDX 中真实地旋转 3D 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30690027/

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