GDScript新手求助:实现物体朝向鼠标指向位置旋转的函数
解决GDScript中物体朝向鼠标位置旋转的问题
先指出你代码里的几个问题:
look_at调用末尾缺少右括号,会触发语法报错- 直接修改
camera_3d.transform(局部变换)可能导致朝向异常,应该用global_transform确保全局空间下的正确朝向 - 如果你是想让非相机的物体朝向鼠标,那应该操作目标物体的变换,而非相机的
以下是修正并优化后的实现:
场景1:让相机自身朝向鼠标指向位置
func CameraRotate(): var mouse_position = get_viewport().get_mouse_position() # 将屏幕鼠标位置转换为3D世界空间的射线 var ray_origin = camera_3d.project_ray_origin(mouse_position) var ray_direction = camera_3d.project_ray_normal(mouse_position) # 取射线上距离相机5单位的点作为目标位置 var target_position = ray_origin + ray_direction * 5 # 使用全局变换设置朝向,避免父节点变换干扰 camera_3d.global_transform.look_at(target_position, Vector3.UP)
场景2:让场景中其他物体朝向鼠标指向位置
如果你的需求是让角色、道具这类物体朝向鼠标,代码调整如下:
@onready var target_object = $YourTargetObject # 替换成你的目标节点路径 func ObjectLookAtMouse(): var mouse_position = get_viewport().get_mouse_position() var ray_origin = camera_3d.project_ray_origin(mouse_position) var ray_direction = camera_3d.project_ray_normal(mouse_position) # 用更远的距离确保目标位置覆盖场景范围 var target_position = ray_origin + ray_direction * 100 # 让目标物体朝向该位置,保持Y轴向上 target_object.global_transform.look_at(target_position, Vector3.UP)
补充说明
project_ray_origin和project_ray_normal的作用是把屏幕2D鼠标坐标转换为3D世界空间的射线,延长射线就能得到鼠标对应的世界位置- 使用
global_transform而非transform,可以避免父节点的变换影响物体朝向逻辑
内容的提问来源于stack exchange,提问作者Mark Darwin Ordoño
相关产品推荐
相关产品推荐

