【问题标题】:Calculate world-up vector of object on arbitrary axis (ThreeJS)计算任意轴上对象的世界向上向量(ThreeJS)
【发布时间】:2018-06-07 14:50:15
【问题描述】:

我无法找到对象在任意轴上的绝对旋转。

到目前为止,我已经能够获得对象的相对旋转。为了获得相对旋转,我在面向选定轴的对象后面放置了一个平面。通过在这个平面上进行光线投射,我可以使用atan2 检索 3D 坐标来计算角度。

获取对象相对旋转的代码:

let planeCrossObjectDir = planeNormal.clone().cross(this.objectUpDirection).normalize();
let projectedPoint = new THREE.Vector3();
rayPlane.projectPoint(intersection.point, projectedPoint);
let centerProjected = new THREE.Vector3();
rayPlane.projectPoint(this.raycastPlane.position, centerProjected);

let u1 = this.objectUpDirection.dot(projectedPoint);
let v1 = planeCrossObjectDir.dot(projectedPoint);
let u2 =  this.objectUpDirection.dot(centerProjected);
let dotv2 = planeCrossObjectDir.dot(centerProjected);

let uvCoord = new THREE.Vector2(u1, v1).sub(new THREE.Vector2(u2, dotv2));

var theta = Math.atan2(uvCoord.y, uvCoord.x); // range [-PI, PI]
theta *= 180 / Math.PI; // range [-180, 180]
if (theta < 0) theta = 360 + theta; // range [0, 360]
let objectsRotation = Math.round(360 - theta); // invert rotation

我想通过更改planeCrossObjectDir 并使用平面的世界上矢量而不是this.objectUpDirection 来计算绝对旋转。

但问题是:我不知道如何计算..

我画了一张图来简化/澄清:

【问题讨论】:

    标签: javascript three.js calculus


    【解决方案1】:

    我认为你已经走了很长一段路。您对象的matrixWorld 属性应包含最终的世界值,包括位置、旋转和缩放。您可以通过两种不同的方式获取旋转组件:

    作为矩阵:

    var rotationMatrix = new THREE.Matrix4().extractRotation(yourObject.matrixWorld);
    // rotationMatrix will now contains the rotation component of your object's world matrix
    

    作为四元数:

    var position = new THREE.Vector3();
    var quaternion = new THREE.Quaternion();
    var scale = new THREE.Vector3();
    yourObject.matrixWorld.decompose(position, quaternion, scale);
    // quaternion now contains your object's world rotation as a quaternion
    

    应用于上向量:

    然后您可以根据您使用的方法更新向上向量:

    var up1 = new THREE.Vector3(0, 1, 0).applyMatrix4(rotationMatrix).normalize();
    

    或者

    var up2 = new THREE.Vector3(0, 1, 0).applyQuaternion(quaternion).normalize();
    

    如果您尝试这两种路径,您会看到它们得到相同的结果(在 JavaScript 的范围内)。

    如果您有任何问题,或者我误解了您的问题,请发表评论。

    【讨论】:

    • 我认为你误解了我的问题(可能是我的错,因为这很难解释;P)。你的回答给了我这个物体的世界向上向量。一开始这似乎是正确的,但如果我向下旋转对象(Y:180 度),向上矢量也将指向下方。您可以说答案只是简单地采用世界上矢量(THREE.Vector3(0, 1, 0)),但我希望也应用 X 和 Z(Y 面向世界上矢量)。这当然取决于您要旋转的轴。
    猜你喜欢
    • 2019-11-17
    • 1970-01-01
    • 2012-06-22
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2015-07-23
    相关资源
    最近更新 更多