如何按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
相关产品推荐
相关产品推荐

