Godot4でGDScriptを使ってY軸ビルボード的なものを実装したい!
概要
今回の記事では、Godot4でGDScriptを使ってY軸ビルボード的なものを実装する手順を掲載する。
GodotのSprite3DはInspectorからビルボードを設定できるんだけども、なぜわざわざスクリプトでビルボードを実装するのか?
理由は、前者のビルボードではUnityのShaderLabで実装したビルボードのように影の表現に違和感があるからだ。
こんな感じ。
キャラクターから発生してる影がキャラクター自体に表示されてしまってる。キャラクターから発生してる影自体もキャラクターの回転が反映されてない。
スクリプトで実装したビルボードはビルボードとしては微妙だが、影の表現は自然に見えるようになる。
仕様書
環境
- Gogot 4.0
手順書
ビルボードさせたいノードに下記のスクリプトをアタッチする。
extends Sprite3D
@onready var camera = $"../CharacterBody3D"
func _process(_delta):
var p:Vector3 = camera.position
p.y = position.y
look_at(p, Vector3.UP)
rotate_y(PI)
コード自体もやってることもUnityのときとだいたい同じ感じ。
カメラのノードを取得してる部分@onready var camera = $"../CharacterBody3D"
は、それぞれのプロジェクトの設定合わせて変更してね。
このコードは4.0向けで、3.xで同じことをしたい場合は
extends Sprite3D
@onready var camera = $"../CharacterBody3D"
func _process(_delta):
var p:Vector3 = camera.translation
p.y = position.y
look_at(p, Vector3.UP)
rotate_y(PI)
になる。
カメラの位置を取得する部分var p:Vector3 = camera.position
をvar p:Vector3 = camera.translation
にする。
4.0ではposition
、3.xではtranslation
から座標データにアクセスできる。
4.0は3.xからいくつか関数名が変更になってるみたい。
まとめ(感想文)
ビルボードってかなり昔からある技術だけど、完璧なビルボードを目指そうとするとかなり難しいと感じる今日この頃。