[GodotEngine]3Dカメラとカメラジンバル
Godot Engine 3.xにおいて、3Dプラットフォーマーを作る際に、毎回同じことばっかりやってて思い出すのがしんどいのでメモ。
カメラ
自分はカメラを作る際に、二通りの方法で作ることが多い。
プレイヤーシーンに含めちゃう方法とプレイヤーと別でカメラを用意する方法
前者はカメラの追従処理を考えなくていいのでスタンダードな方法。
後者はカメラ追従処理が必要だけど、カメラ単品を動かしやすいので汎用性高いように感じる。
カメラジンバル
ひとまず、いずれにせよCameraController
という親ノード(Spatial
)を作る。
その子ノードをh
、孫ノードにv
、それぞれSpatial
ノード。
曾孫ノードにCameraPos
という名前でPosition3D
を作成。
これで、h
ノードをY軸回転させればカメラはキャラの周囲を回る。
同様にv
ノードをX軸回転させればカメラはキャラの上下を回る。
カメラのズームイン・ズームアウトしたい場合は、CameraPos
のローカルZ座標を動かせばOK。
export var _distance:float = 3.0
export var _vertical_rotate:float = -20.0
onready var _camera_gimbal_h:Spatial = get_node("h")
onready var _camera_gimbal_v:Spatial = get_node("h/v")
onready var _camera_position:Spatial = get_node("h/v/CameraPos")
func _ready():
_camera_pos_node.translation.z = distance
_camera_gimbal_v.rotate_x(deg2rad(vertical_rotate))
インスペクターで好きな角度や距離を設定しておけば、ゲーム開始時にその値で開始される。
tool
キーワードを付けておいてEngine.editor_hint
で設定してもいいかも。
カメラは、プレイヤーシーンに入れるにしても入れないにしても、CameraPos
ノードの座標を見て_process(_delta)
で動かすようにすれば良い。
_physics_process(_delta)
で動かすと物理プロセス側(衝突処理が多いとか)でラグが起きるとカメラに影響して画面全体がカクつく原因になるので、分けておくのが良いみたい。
SpringArm
ノードを使うのもあり。
ただ個人的には、SpringArm
を使うと障害物がある場合にキャラクターに寄っていってしまう挙動よりもコ○ミ社が特許(2016年に失効)を持っていた、カメラとターゲットの間のオブジェクトの半透明化のほうが好きなので、SpringArm
は使っていない。
Discussion