Godot:如何用GDScript将3D平面网格定位到屏幕左边缘
如何将Plane Mesh放置在屏幕左边缘(GDScript实现)
Plane Mesh是3D资源,需要结合场景中相机的类型(正交/透视)计算世界空间位置,同时要考虑Plane自身的尺寸与缩放参数。
一、正交相机(OrthographicCamera3D)场景
正交相机的视口范围固定,计算逻辑更直接:
- 计算相机视口的水平半宽:
相机正交半高 * (视口宽度/视口高度) - 屏幕左边缘的世界X坐标 = 相机位置X - 视口水平半宽
- 调整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位置:
- 取屏幕左边缘中点的像素坐标:
Vector2(0, 视口高度/2) - 使用相机的
unproject_position方法,将像素点转换为世界空间位置(需指定Plane到相机的Z轴距离) - 同样调整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
相关产品推荐
相关产品推荐

