2025/01/16(木) [n年前の日記]
#1 [godot] ピンの位置を2Dで表示したい
_昨日の作業
の続き。Windows10 x64 22H2 + Godot Engine 4.3 64bit でゴルフゲームっぽいものが作れないものかなと試してる。
旗というか、ピンというか、カップの位置を分かりやすく表示したい。
Godot Engine 4 の Camera3Dノードには、いくつか便利なメソッドがあるので、それを使えばアイコンを表示すべき座標は得られそう。
_Camera3D - Godot Engine (stable) documentation in English
これで一応、アイコン(TextureRectで表示)が3D空間内の特定の座標を指し示すような表示にはなった。
ただ、その位置が画面外にある時に、どういう表示をしたらいいのか…。画面外の右にあるとか、画面外の左にあるとか、そういう表示にしたいのだけど…。
カメラの位置と向きが分かれば、そこからベクトルが作れるだろうし、ピンの位置でもベクトルを作れるだろうから、ベクトルの内積だか外積だかそのあたり符号で対象が右にあるか左にあるかぐらいは分かりそうな気もする…。
旗というか、ピンというか、カップの位置を分かりやすく表示したい。
- 旗モデルが遠くにあると小さくなって見えない。
- 高低差のある場所では旗モデルが地面で隠れてしまう時もある。
- パット時(?)は旗モデルを非表示にするからカップの位置が分かりづらくなる。
Godot Engine 4 の Camera3Dノードには、いくつか便利なメソッドがあるので、それを使えばアイコンを表示すべき座標は得られそう。
- unproject_position(Vector3) を使えば、3D空間の座標(Vector3)をスクリーン座標(Vector2)に変換できる。
- is_position_behind(Vector3) を使えば、指定座標がカメラ(スクリーン)の前にあるか、後ろにあるかを調べることができる。
- is_position_in_frustum(Vector3) を使えば、指定座標が視錐台(カメラから見える範囲)に入っているか否かを調べることができる。
_Camera3D - Godot Engine (stable) documentation in English
これで一応、アイコン(TextureRectで表示)が3D空間内の特定の座標を指し示すような表示にはなった。
extends Node3D
@export var target: MeshInstance3D
@export var markicon: TextureRect
@export var message: Label
var camera_ang: float = 0.0
func _ready():
pass # Replace with function body.
func _process(delta):
var camera = get_viewport().get_camera_3d()
if camera == null:
printerr("Not found Camera3D")
return
camera_ang = Input.get_axis("ui_left", "ui_right") * (90.0 * delta)
camera.rotate_y(deg_to_rad(camera_ang))
var msg = ""
msg += "behind: "
msg += "true" if camera.is_position_behind(target.global_position) else "false"
msg += "\nin frustum: "
msg += "true" if camera.is_position_in_frustum(target.global_position) else "false"
message.text = msg
var viewport_size = get_viewport().get_visible_rect().size
var screen_pos = camera.unproject_position(target.global_position)
markicon.global_position.x = screen_pos.x - (markicon.texture.get_width() / 2)
#markicon.global_position.y = screen_pos.y - (markicon.texture.get_height())
ただ、その位置が画面外にある時に、どういう表示をしたらいいのか…。画面外の右にあるとか、画面外の左にあるとか、そういう表示にしたいのだけど…。
カメラの位置と向きが分かれば、そこからベクトルが作れるだろうし、ピンの位置でもベクトルを作れるだろうから、ベクトルの内積だか外積だかそのあたり符号で対象が右にあるか左にあるかぐらいは分かりそうな気もする…。
[ ツッコむ ]
以上です。