如何在Godot中实现非居中3D相机 调整透视消失点位置
Godot 3D相机实现非居中消失点的解决方案
你需要实现的是离轴透视投影效果,Camera.h_offset本质是平移相机的空间位置,不会改变投影的消失点位置,只有修改投影矩阵的视锥体偏移参数才能实现你要的消失点偏移效果。
Godot 4.x 版本解决方案
方法1:直接使用内置属性(4.1及以上版本)
Godot 4.1开始给Camera3D新增了frustum_offset属性,直接调整该属性的x/y分量即可实现消失点偏移,无需额外代码:
frustum_offset.x控制水平方向偏移,正值为向右偏移,负值为向左偏移frustum_offset.y控制垂直方向偏移
调整后相机位置朝向完全不变,仅消失点位置会对应移动,完全符合需求。
方法2:手动修改投影矩阵(全4.x版本兼容)
如果使用4.0版本没有内置属性,可以通过脚本自定义投影矩阵实现,将以下脚本挂载到你的Camera3D节点上即可:
extends Camera3D # 水平偏移比例,范围建议-1~1,0为默认居中,0.5对应向右偏移半个屏幕宽度 @export var horizontal_shift: float = 0.2 # 垂直偏移比例 @export var vertical_shift: float = 0.0 func _process(delta: float) -> void: # 读取相机当前投影参数 var fov = self.fov var aspect = get_viewport().get_aspect() var near_clip = near var far_clip = far # 计算原始视锥体边界 var y_max = near_clip * tan(deg_to_rad(fov * 0.5)) var y_min = -y_max var x_max = y_max * aspect var x_min = -x_max # 应用偏移 var shift_x = (x_max - x_min) * horizontal_shift var shift_y = (y_max - y_min) * vertical_shift x_min += shift_x x_max += shift_x y_min += shift_y y_max += shift_y # 更新投影矩阵 set_projection(Projection.create_frustum(x_min, x_max, y_min, y_max, near_clip, far_clip))
Godot 3.x 版本解决方案
3.x版本没有内置偏移属性,直接挂载以下脚本到Camera节点即可:
extends Camera export var horizontal_shift: float = 0.2 export var vertical_shift: float = 0.0 func _process(delta: float) -> void: var fov = get_fov() var aspect = get_aspect_ratio() var near_clip = get_znear() var far_clip = get_zfar() var y_max = near_clip * tan(deg2rad(fov * 0.5)) var y_min = -y_max var x_max = y_max * aspect var x_min = -x_max var shift_x = (x_max - x_min) * horizontal_shift var shift_y = (y_max - y_min) * vertical_shift x_min += shift_x x_max += shift_x y_min += shift_y y_max += shift_y set_projection_matrix(Matrix4.create_frustum(x_min, x_max, y_min, y_max, near_clip, far_clip))
效果验证
修改后你会发现相机本身的位置和朝向没有变化,3D场景的透视消失点会按你设置的偏移值移动,完美对齐你需要的非UI区域中心。
内容的提问来源于stack exchange,提问作者bluenote10
相关产品推荐
相关产品推荐

