gpt4 book ai didi

javascript - THREE.js:需要帮助旋转四元数

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:35:04 24 4
gpt4 key购买 nike

我想了解 three.js 的四元数,但对于所有教程,我无法将它们转化为我需要的应用程序。这是问题所在:

给定一个以 (0,0,0) 为中心的球体,我想在球体表面上设置一个物体的 Angular ,作为相机的焦点。该点将通过键盘输入在曲面上移动和旋转。将焦点设置到选定的轨道上当然很容易,但是保持垂直于表面的正确旋转让我难以理解。我知道四元数对于平滑移动和任意轴旋转是必要的,但我不知道从哪里开始。

然后第二部分是旋转相机偏移与焦点。我为此找到的代码片段不再具有预期的效果,因为 cameraOffset 不继承旋转:

var cameraOffset = relativeCameraOffset.clone().applyMatrix4( focalPoint.matrixWorld );
camera.position.copy( focalPoint.position.clone().add(cameraOffset) );
camera.lookAt( focalPoint.position );

更新 1:尝试在杆上固定相机并旋转行星。但是除非我遗漏了一些重要的东西,否则这也会失败,因为在走向赤道时方向会完全倾斜。 (向左变为向前)。更新中的代码是:

        acceleration.set(0,0,0);

if (keyboard.pressed("w")) acceleration.x = 1 * accelerationSpeed;
if (keyboard.pressed("s")) acceleration.x = -1 * accelerationSpeed;
if (keyboard.pressed("a")) acceleration.z = 1 * accelerationSpeed;
if (keyboard.pressed("d")) acceleration.z = -1 * accelerationSpeed;
if (keyboard.pressed("q")) acceleration.y = 1 * accelerationSpeed;
if (keyboard.pressed("e")) acceleration.y = -1 * accelerationSpeed;

velocity.add(acceleration);
velocity.multiplyScalar(dropOff);
velocity.max(minV);
velocity.min(maxV);

planet.mesh.rotation.x += velocity.x;
planet.mesh.rotation.y += velocity.y;
planet.mesh.rotation.z += velocity.z;

所以我仍然愿意接受建议。

最佳答案

最终从矩阵和四元数的混合中找到了解决方案:

    //Setup
var ux = new THREE.Vector3(1,0,0);
var uy = new THREE.Vector3(0,1,0);
var uz = new THREE.Vector3(0,0,1);

var direction = ux.clone();
var m4 = new THREE.Matrix4();
var dq = new THREE.Quaternion(); //direction quad base
var dqq; //final direction quad
var dq2 = new THREE.Quaternion();
dq2.setFromAxisAngle(uz,Math.PI/2); //direction perpendicular rot

//Update
if (velocity.length() < 0.1) return;
if (velocity.x) { focalPoint.translateY( velocity.x ); }
if (velocity.y) { focalPoint.translateX( velocity.y ); }
//create new direction from focalPoint quat, but perpendicular
dqq = dq.clone().multiply(focalPoint.quaternion).multiply(dq2);

velocity.multiplyScalar(dropOff);
//forward direction vector
direction = ux.clone().applyQuaternion(dqq).normalize();
//use Matrix4.lookAt to align focalPoint with the direction
m4.lookAt(focalPoint.position, planet.mesh.position, direction);
focalPoint.quaternion.setFromRotationMatrix(m4);

var cameraOffset = relativeCameraOffset.clone();
cameraOffset.z = cameraDistance;

cameraOffset.applyQuaternion(focalPoint.quaternion);

camera.position = focalPoint.position.clone().add(cameraOffset) ;
//use direction for camera rotation as well
camera.up = direction;
camera.lookAt( focalPoint.position );

这是它的硬核。它在行星周围平移(并在一定程度上旋转),两极不成问题。

关于javascript - THREE.js:需要帮助旋转四元数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21327797/

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