You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 16:27:38