2024/12/21(土) [n年前の日記]
#1 [godot] ゴルフコースにピンを追加してみた
_昨日
に続き、Windows10 x64 22H2 + Godot Engine 4.3 64bit でゴルフゲームっぽいものが作れないものかなと試してる。
コースにピンが ―― 旗と旗竿が無いとそれっぽくないなと思えてきたので、blender 3.6.18 LTS で旗と旗竿を作成して追加してみた。また、各StaticBody3D に、グループとして flag と flagstick も追加。当たった何かがこのグループ名なら、旗、もしくは旗竿に当たっていると判別できる。
旗竿にボールが当たると跳ね返ることは確認できた。
旗にも処理を追加したい。いわゆる旗包みを表現したい。しかし、ここでハマった…。
コースにピンが ―― 旗と旗竿が無いとそれっぽくないなと思えてきたので、blender 3.6.18 LTS で旗と旗竿を作成して追加してみた。また、各StaticBody3D に、グループとして flag と flagstick も追加。当たった何かがこのグループ名なら、旗、もしくは旗竿に当たっていると判別できる。
旗竿にボールが当たると跳ね返ることは確認できた。
旗にも処理を追加したい。いわゆる旗包みを表現したい。しかし、ここでハマった…。
◎ ボールが当たらない :
まず、ボールが旗に当たってくれない。そのうち偶然当たってくれるだろうと気楽に試してたら、何十回もボールを打つ羽目に…。
こんなことはやってられないと、Ctrl+Z を押したら打つ前の位置に戻る仕様を入れてみた。これで動作確認が随分楽になった。もしかするとこの仕様は、ゲームにする時も入れておいたほうがいいのかもしれない…? 打ち直しができたほうがいいのだろうか…?
こんなことはやってられないと、Ctrl+Z を押したら打つ前の位置に戻る仕様を入れてみた。これで動作確認が随分楽になった。もしかするとこの仕様は、ゲームにする時も入れておいたほうがいいのかもしれない…? 打ち直しができたほうがいいのだろうか…?
◎ 旗にボールが貼り付く :
そのうちようやくボールが旗に当たってくれたのだけど、今度は旗にボールがピタリとくっ付いて、目が点になった。
考えてみたら当たり前。旗とボールが衝突していたらボールの速度をゼロにするという安易な処理を書いてしまったので…。ボールが旗にめり込んだ状態でボールの速度がゼロになって、そのままずっと旗にめり込んでるから、ボールの速度もずっとゼロにされてしまう。ピクリとも動かなくなるのは当たり前。
結局、前フレームではどこに当たっていたかを記憶して、衝突した場所が、空中 → 旗に変わった瞬間だけ速度をゼロにするようにしてみた。これなら旗に当たってからポトリと下に落ちてくれた。
考えてみたら当たり前。旗とボールが衝突していたらボールの速度をゼロにするという安易な処理を書いてしまったので…。ボールが旗にめり込んだ状態でボールの速度がゼロになって、そのままずっと旗にめり込んでるから、ボールの速度もずっとゼロにされてしまう。ピクリとも動かなくなるのは当たり前。
結局、前フレームではどこに当たっていたかを記憶して、衝突した場所が、空中 → 旗に変わった瞬間だけ速度をゼロにするようにしてみた。これなら旗に当たってからポトリと下に落ちてくれた。
◎ カップイン判別処理を追加 :
せっかくだから、カップイン判別も入れてみた。ボールが静止した状態でカップに衝突していたらカップイン。「CUP IN !」ラベルもその時だけ表示。
これだけでも一気にゲームっぽい感じになってきた。
これだけでも一気にゲームっぽい感じになってきた。
◎ グリーン上の動作を別処理にした :
グリーン上でボールを打つときは、斜め上ではなく、横方向にだけ力を追加するようにしてみた。ちなみに、RigidBody3D の apply_impulse() で、瞬間的に力を加えることができる。
しかし、ボールが全然転がらない…。グリーンに限らず、何かと当たっていたら移動速度と回転速度をどんどん減衰させるように処理しているから、ボールに急激なブレーキがかかってしまう。
パターモードを用意して、グリーン上で打った時はそのモードにして、ボールの速度の減衰の仕方を変えてみるようにしたら多少はマシになった。
しかしそれでも、グリーン上でパターを打ってる感じには程遠い…。もしかするとミニゴルフの類を別途作って、そこで作り方を勉強したほうがいいのかもしれない。
しかし、ボールが全然転がらない…。グリーンに限らず、何かと当たっていたら移動速度と回転速度をどんどん減衰させるように処理しているから、ボールに急激なブレーキがかかってしまう。
パターモードを用意して、グリーン上で打った時はそのモードにして、ボールの速度の減衰の仕方を変えてみるようにしたら多少はマシになった。
しかしそれでも、グリーン上でパターを打ってる感じには程遠い…。もしかするとミニゴルフの類を別途作って、そこで作り方を勉強したほうがいいのかもしれない。
◎ 表示モデルデータをglTF 2.0にしてみた :
今までは、blender から Wavefront形式(.obj)で3Dモデルデータをエクスポートして、Godot Engine にインポートしていたけれど、.obj はノーマルマップ(法線マップ)が使えないっぽいので、別の形式で表示用モデルデータをインポートすることにした。
とりあえず、glTF 2.0 にしてみる。glTF 2.0 はエクスポート時に、以下の3種類のどれかを選べる。
glTF ならノーマルマップが反映されることを確認できた。
ただ、.obj のように、MeshInstance3D を作成して Mesh に .obj をドラッグアンドドロップする感じではなく、シーンタブ(ノード一覧リスト)にドラッグアンドドロップして、Node3Dとして追加する感じになるっぽい? この操作で合ってるのかな…。ちょっとよく分からない。
コリジョン用モデルデータを作る際には、今まで通り、.obj をインポートして、メッシュ → コリジョン形状を作成、を選ぶことにした。.gltf を利用した場合は、コリジョン形状作成をする方法が分からない…。
とりあえず、glTF 2.0 にしてみる。glTF 2.0 はエクスポート時に、以下の3種類のどれかを選べる。
- glTFバイナリ(.glb)
- glTF Separate (.gltf+.bin+テクスチャ)
- glTF Embedded (.gltf)
glTF ならノーマルマップが反映されることを確認できた。
ただ、.obj のように、MeshInstance3D を作成して Mesh に .obj をドラッグアンドドロップする感じではなく、シーンタブ(ノード一覧リスト)にドラッグアンドドロップして、Node3Dとして追加する感じになるっぽい? この操作で合ってるのかな…。ちょっとよく分からない。
コリジョン用モデルデータを作る際には、今まで通り、.obj をインポートして、メッシュ → コリジョン形状を作成、を選ぶことにした。.gltf を利用した場合は、コリジョン形状作成をする方法が分からない…。
[ ツッコむ ]
以上です。