我想知道是否有办法在 godot 3d 中获取空间节点的前向向量。
统一起来,这只是transform.forward。
Godot 给了我一个旋转向量,但我不确定如何将其转换为方向向量。
godot 的 transform.forward 版本是什么?
前锋是你决定的。我通常这样做:
var aim = $Player.get_global_transform().basis
var forward = -aim.z
var backward = aim.z
var left = -aim.x
var right = aim.x
当然,如果您在设计资产和场景时对此有一个约定,它会有所帮助。我总是使用 -Z 作为转发,但如果你愿意,你可以选择不同的。
我解决了我的问题get_global_transform().basis.z
SanzioSan 使用 basic.z 向量是正确的,但他解释得不够好。本质上,这是一个非常简单的问题。
如果您尝试在 3d 中拖动对象或拥有一个对象并希望它跟随您的屏幕,您可以使用类似于此的代码:
var transform_hold_obj = node_to_hold_obj.get_global_transform()
transform_hold_obj.origin = transform_hold_obj.origin - transform_hold_obj.basis.z * some_distance_between_you_and_object
obj_being_dragged.set_transform(transform_hold_obj)
在我的例子中,transform_hold_obj 来自我的相机节点。我想要一些我选择的对象来跟随我的相机。此代码位于连接到被拖动对象的一些脚本中。base.z 向量是我的前向向量或我的相机指向的方向。
使用transform.basis.z
是因为:
https ://docs.godotengine.org/en/stable/tutorials/3d/using_transforms.html#obtaining-information
我知道这有点晚了,但我提出了建立自己的前锋并离开 Vector 的解决方案。它在 c# 中,但应该很容易转换为 GDScript。希望它可以帮助某人。
Vector3 forward = new Vector3(-(float)Math.Sin(Rotation.y), 0, -(float)Math.Cos(Rotation.y));
Vector3 left = new Vector3((float)Math.Sin(Rotation.y - Math.PI/2), 0,
(float)Math.Cos(Rotation.y - Math.PI/2));