Godot 4.1 - 控制CharacterBody3D周围的Camera3D位置

问题描述 投票:0回答:1

在Godot中构建3D环境的新手,我正在尝试创建一个场景,其中CharacterBody3D(称为焦点)保持在屏幕中心(上方和后方的Camera3D),而世界的其他部分旋转/移动周围。不幸的是,当旋转(q/e 键)时,焦点会沿椭圆路径移动,而不是保持居中。

项目文件在这里:Github存储库

我已经能够实现居中旋转和平移(w/a/s/d 键),但是相机向前跳跃并将焦点减半,这样您只能查看前面(屏幕上半部分)的行星) 焦点。修改后的代码如下所示:

func rotate_around_focus_character(delta):
# Rotate the camera around the focus character
var theta = deg_to_rad(rotation_speed * delta)
#var rotation_center = focus.global_transform.origin #+ Vector3(0, 10, 0)

if Input.is_action_pressed("rotate_left"):
    global_transform.origin = focus.global_transform.origin
    global_transform.basis = camera_3d.global_transform.basis.rotated(Vector3(0, 1, 0), theta)
    
if Input.is_action_pressed("rotate_right"):
    global_transform.origin = focus.global_transform.origin
    global_transform.basis = camera_3d.global_transform.basis.rotated(Vector3(0, 1, 0), -theta)

func track_focus_with_camera(delta):
if focus:
    var camera_3d_pos = camera_3d.global_transform.origin
    print("camera_3d_pos = " + str(camera_3d_pos))
    global_transform.origin = focus.global_transform.origin.lerp(camera_3d.position, 0.1)

相关代码位于此处:res://camera/CameraFocus.gd

3d godot godot4
1个回答
0
投票

下面的脚本是否实现了您想要的行为?我所做的是跟踪相机位置向量的角度。基本偏移向量为 (0, 10, 10),并且旋转当前旋转量。

如果你对处理 3D 相机没有信心(至少在 Godot 中),我建议你使用嵌套的 Node3D 节点。例如这样的结构:

Node3DX  
    Node3DY
        Node3DZ
            Camera itself

每个 Node3D 用于绕单个轴旋转。我并不是说这是最好的方法,而是它更简单。对于您的示例,我确实使用了此方法,因为您的旋转仅围绕 Y 轴。

extends Camera3D

@onready var focus = $"../../Focus"
@onready var camera_pivot = $".."
@onready var camera_3d = $"."

var rotation_speed = 60


var current_focus_rotation = 0


func _process(delta):
    rotate_around_focus_character(delta)
    track_focus_with_camera(delta)

func rotate_around_focus_character(delta):
    # Rotate the camera around the focus character
    var theta = deg_to_rad(rotation_speed * delta)
    #var rotation_center = focus.global_transform.origin #+ Vector3(0, 10, 0)
    
    if Input.is_action_pressed("rotate_left"):
        if (not focus):
            global_transform.origin = camera_3d.global_transform.origin
        global_transform.basis = camera_3d.global_transform.basis.rotated(Vector3(0, 1, 0), theta)
        current_focus_rotation += theta
        
    if Input.is_action_pressed("rotate_right"):
        if (not focus):
            global_transform.origin = camera_3d.global_transform.origin
        global_transform.basis = camera_3d.global_transform.basis.rotated(Vector3(0, 1, 0), -theta)
        current_focus_rotation -= theta
    

func track_focus_with_camera(delta):
    if focus:
        var camera_3d_pos = camera_3d.global_transform.origin
        print("camera_3d_pos = " + str(camera_3d_pos))
        var focus_pos = focus.global_transform.origin #cus.global_transform.origin.lerp(camera_3d.position, 0.1)
        var offset_vector = Vector3(0, 10, 10).rotated(Vector3(0, 1, 0), current_focus_rotation)
        var final_pos = focus_pos + offset_vector
        camera_3d.global_transform.origin = final_pos
        
© www.soinside.com 2019 - 2024. All rights reserved.