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

Godot:如何用GDScript将3D平面网格定位到屏幕左边缘

如何将Plane Mesh放置在屏幕左边缘(GDScript实现)

Plane Mesh是3D资源,需要结合场景中相机的类型(正交/透视)计算世界空间位置,同时要考虑Plane自身的尺寸与缩放参数。

一、正交相机(OrthographicCamera3D)场景

正交相机的视口范围固定,计算逻辑更直接:

  1. 计算相机视口的水平半宽:相机正交半高 * (视口宽度/视口高度)
  2. 屏幕左边缘的世界X坐标 = 相机位置X - 视口水平半宽
  3. 调整Plane自身偏移:Plane Mesh默认尺寸为2x2(缩放为1时半宽是1),最终Plane的X位置需减去自身半宽(plane.scale.x * 1),确保Plane左边缘与屏幕左边缘对齐。

示例代码:

extends Node3D

@onready var plane = $MeshInstance3D  # 你的Plane所在MeshInstance3D节点
@onready var camera = $OrthographicCamera3D  # 场景中的正交相机

func _ready():
    var viewport_size = get_viewport().get_size()
    # 计算相机视口水平半宽
    var camera_half_width = camera.ortho_size * (viewport_size.x / viewport_size.y)
    # 计算Plane目标X位置:相机X - 视口半宽 - Plane自身半宽
    var target_x = camera.global_position.x - camera_half_width - (plane.scale.x * 1.0)
    # 设置Plane位置,Y/Z与相机保持一致确保在视野内
    plane.global_position = Vector3(target_x, camera.global_position.y, camera.global_position.z)
    # 让Plane面向相机(可选,按需调整)
    plane.look_at(camera.global_position, Vector3.UP)

二、透视相机(PerspectiveCamera3D)场景

透视相机需要将屏幕左边缘的像素坐标反投影到世界空间,再确定Plane位置:

  1. 取屏幕左边缘中点的像素坐标:Vector2(0, 视口高度/2)
  2. 使用相机的unproject_position方法,将像素点转换为世界空间位置(需指定Plane到相机的Z轴距离)
  3. 同样调整Plane自身偏移,确保边缘对齐。

示例代码:

extends Node3D

@onready var plane = $MeshInstance3D
@onready var camera = $PerspectiveCamera3D

func _ready():
    var viewport_size = get_viewport().get_size()
    var distance_to_camera = 5.0  # Plane到相机的Z轴距离,按需调整
    # 屏幕左边缘中点的像素坐标
    var screen_left_point = Vector2(0, viewport_size.y / 2)
    # 反投影得到世界空间位置
    var world_left_point = camera.unproject_position(Vector3(screen_left_point.x, screen_left_point.y, distance_to_camera))
    # 调整Plane位置:减去自身半宽,确保左边缘对齐
    var target_x = world_left_point.x - (plane.scale.x * 1.0)
    plane.global_position = Vector3(target_x, world_left_point.y, world_left_point.z)
    # 让Plane面向相机
    plane.look_at(camera.global_position, Vector3.UP)

注意事项

  • 若修改了Plane Mesh的原始尺寸或节点缩放,需对应调整自身半宽的计算(比如自定义Mesh尺寸为WxH,半宽就是W/2 * scale.x)
  • 如需响应窗口大小变化,将计算逻辑放到_viewport_resized信号回调中,确保窗口缩放时Plane位置自动更新。

内容的提问来源于stack exchange,提问作者Loma Harshana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:36:23