我无法在任意轴上找到对象的绝对旋转。
到目前为止,我已经能够获得对象的相对旋转。为了获得相对旋转,我在面向所选轴的物体后面放置了一个平面。通过在这个平面上进行光线投射,我可以使用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
来计算绝对旋转的原理相同。
但问题是:我不知道如何计算......
答案 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的原因内)。
如果您有疑问,或者我误解了您的问题,请发表评论。