计算任意轴上对象的世界向量(ThreeJS)

时间:2018-06-07 14:50:15

标签: javascript three.js calculus

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

到目前为止,我已经能够获得对象的相对旋转。为了获得相对旋转,我在面向所选轴的物体后面放置了一个平面。通过在这个平面上进行光线投射,我可以使用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并使用平面的世界UP向量而不是this.objectUpDirection来计算绝对旋转的原理相同。

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

我做了一个简化事项/澄清的图纸: World Up-vector of plane

1 个答案:

答案 0 :(得分:0)

我认为你已经走了很长一段路。对象的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的原因内)。

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