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

如何按Node3D逻辑根据位置、旋转和缩放计算Transform3D?

解决方法

你的代码和Node3D内部的Transform3D构建逻辑几乎一致,但有两个关键细节没处理到位,导致结果不匹配:

1. 欧拉角顺序必须匹配

Node3D的rotation_order属性(默认是EULER_ORDER_YXZ)定义了欧拉角的旋转顺序,而Basis.from_euler()默认使用YXZ顺序。如果你的Node3D修改过这个属性,直接用默认参数创建旋转矩阵就会出错。

2. 避免精确浮点比较

直接用==比较Transform3D会进行严格的浮点值匹配,哪怕是微小的计算误差都会导致结果为false,应该用Godot提供的is_equal_approx()方法做近似比较。

修正后的代码

func calc_transform_3d(position_3d: Vector3, rotation_3d: Vector3, scale_3d: Vector3, rotation_order: EulerOrder = EulerOrder.EULER_ORDER_YXZ) -> Transform3D:
    # 按指定顺序生成旋转矩阵
    var basis := Basis.from_euler(rotation_3d, rotation_order)
    # 应用轴向缩放
    basis.scale(scale_3d)
    # 组合位置与变换矩阵
    return Transform3D(basis, position_3d)

func _ready():
    var node_3d: Node3D = $Node3D
    var custom_transform := calc_transform_3d(
        node_3d.position,
        node_3d.rotation,
        node_3d.scale,
        node_3d.rotation_order
    )
    
    # 使用近似比较判断变换是否一致
    print(custom_transform.is_equal_approx(node_3d.transform)) # 现在会返回true

补充说明

Node3D内部构建Transform3D的逻辑就是先基于欧拉角创建旋转矩阵,再应用轴向缩放,最后结合位置,只要匹配欧拉角顺序并使用近似比较,就能得到和Node3D完全一致的变换结果。

内容的提问来源于stack exchange,提问作者Manas R. Makde

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 14:38:09