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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 16:32:42