将Three.js四元数转换为DXF插入法线与旋转角度的问题
THREE.js四元数转DXF插入法线与旋转角度的问题
我正尝试将THREE.Object3D的四元数转换为DXF绘图所需的插入法线向量与旋转角度。现有代码的插入法线计算看似正确,但仅当插入法线接近(x: 0, y: 1, z: 0)平面时,绕该向量的旋转计算才准确,其余场景结果与预期不符。
相关代码
import { MathUtils, Object3D, Quaternion, Vector3 } from "three"; export function getRotationOnPlaneFromQuaternion(quaternion: Quaternion) { const object = new Object3D(); object.quaternion.copy(quaternion); const insertNormal = object.up.clone().applyQuaternion(object.getWorldQuaternion(new Quaternion())); const initialForward = new Vector3(0, 0, 1); // 计算当前前向向量 const currentForward = initialForward.clone().applyQuaternion(object.quaternion); // 将向量投影到垂直于上轴的平面 const initialProjected = initialForward.clone().projectOnPlane(insertNormal); const currentProjected = currentForward.clone().projectOnPlane(insertNormal); // 计算投影向量之间的夹角 let rotation = MathUtils.radToDeg(currentProjected.angleTo(initialProjected)); // 判断旋转方向 const crossProduct = new Vector3().crossVectors(initialProjected, currentProjected); if (crossProduct.y < 0) { rotation = 360 - rotation; } console.log(quaternion, insertNormal, rotation); return { rotation, insertNormal }; } // 测试用例 getRotationOnPlaneFromQuaternion(new Quaternion(0.0016539615100301002, 0.6118680073155581, 0.0021380584578606005, 0.7909552672187234)); // 结果正确:75.44951016783165 getRotationOnPlaneFromQuaternion(new Quaternion(0.06902894353202288, 0.5853380727748623, 0.09461360593069452, 0.8022858661897604)); // 当前结果:71.75956142781651,预期约89 getRotationOnPlaneFromQuaternion(new Quaternion(0.13752154621828078, 0.5945058704625087, 0.17854775191073505, 0.7718622251405822)); // 当前结果:73.6215463749499,预期约90
我曾参考过关于DXF块位置与法线向量关系的相关问题,但未能解决当前问题。
内容的提问来源于stack exchange,提问作者Immugio
相关产品推荐
相关产品推荐

