HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
0424
アキアキノヒロロGPPBIND_MESHのオプション指定の利用方法8未解決


アキアキノヒロロ

リンク

2021/4/24(Sat) 12:00:57|NO.92659

「HSP3.6β5テストのお願い」で、GPPBIND_MESHのオプション指定の利用方法について思い付いたアイデアを書きました。どうにか、基本的な道を歩かせるテストスクリプトを作ることが出来ました。
ここには、スクリプトのみ載せますが、ファイル等まとめたものを下記からダウンロードできます。
「GPPBIND_MESH_test.zip」を解凍して、その中の「GPPBIND_MESH_test.hsp」を「sample/hgimg4/」に、「GPPBIND_MESH」フォルダを「sample/hgimg4/res/」に入れて、実行してみて下さい。

不具合や工夫等ありましたら、お教え願います。
これ以外にも、考えられる利用方法がありそうに思えますが、あれば、お寄せ頂けるとうれしいです。

「GPPBIND_MESH_test.zip」
https://drive.google.com/file/d/1KAo08grFkHM2vHVruvavwFW4amkNFtug/view?usp=sharing

#include "hgimg4.as" gpreset setcls CLSMODE_SOLID, $404040 alpha_alpha=1 ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 gptexmat id_texmat,"res/GPPBIND_MESH/yuka.png" ; テクスチャマテリアル作成 モデル読み込み gpfloor id_floor, 7.6,7, , id_texmat ; 床ノードを追加 gppbind id_floor, 0 gpload id_hasi,"res/GPPBIND_MESH/hasi" ; 橋モデル読み込み setscale id_hasi, 0.2, 0.2, 0.2 setpos id_hasi, 0.0, 0.0, 0.0 gpload id_yuka_kabe,"res/GPPBIND_MESH/yuka_kabe" ; 床壁モデル読み込み setscale id_yuka_kabe, 0.2, 0.2, 0.2 setpos id_yuka_kabe, 0.0, 0.0, 0.0 gppbind id_yuka_kabe, 0, ,GPPBIND_MESH setalpha id_yuka_kabe, alpha_alpha gpload id_hasi_kabe,"res/GPPBIND_MESH/hasi_kabe" ; 橋壁モデル読み込み setscale id_hasi_kabe, 0.2, 0.2, 0.2 setpos id_hasi_kabe, 0.0, 0.0, 0.0 gppbind id_hasi_kabe, 0, ,GPPBIND_MESH setalpha id_hasi_kabe, alpha_alpha ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 gpbox id_box, 0.2, $ffff00 ; 珠音用箱ノードを追加 setpos id_box, 0,0.1,0 gppbind id_box, 0.5, 0.5 gpload id_tamane2,"res/tamane2" ; 珠音モデル読み込み setscale id_tamane2, 0.002,0.002,0.002 setpos GPOBJ_CAMERA, 0,4,8 ; カメラ位置を設定 ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 repeat stick key,15 if key&128 : end ;================================================== ; カーソルキーで珠音用箱ノード位置を動かす if key&1 : gppapply id_box, GPPAPPLY_IMPULSE, -0.1, 0, 0 if key&4 : gppapply id_box, GPPAPPLY_IMPULSE, 0.1, 0, 0 if key&8 : gppapply id_box, GPPAPPLY_IMPULSE, 0, 0 , 0.1 if key&2 : gppapply id_box, GPPAPPLY_IMPULSE, 0, 0 , -0.1 getpos id_box, x, y, z setpos id_tamane2, x, y, z ; スペースキーで壁の表示/非表示を切り替える if key&16 : alpha_alpha++ : if alpha_alpha=2 : alpha_alpha=0 setalpha id_yuka_kabe, alpha_alpha setalpha id_hasi_kabe, alpha_alpha ; タッチでカメラ位置を動かす if dragmd { ; ドラッグ中 getkey a,1 if a=1 { dx=0.05*(mousex-dragx)+cx dy=0.05*(mousey-dragy)+cy setpos GPOBJ_CAMERA, dx,dy,cz } else { dragmd=0 } } else { ; ドラッグなし getkey a,1 if a { dragx=mousex:dragy=mousey getpos GPOBJ_CAMERA, cx,cy,cz dragmd=1 } } gplookat GPOBJ_CAMERA, x, y, z ; カメラから指定した座標(珠音モデル)を見る ;================================================== redraw 0 ; 描画開始 gpdraw ; シーンの描画 redraw 1 ; 描画終了 await 1000/60 ; 待ち時間 loop ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓



この記事に返信する


アキアキノヒロロ

リンク

2021/4/26(Mon) 17:45:29|NO.92684

[GPPBIND_MESH] 利用の壁を作る時に注意すべきことがあります。
何らかのモデルを囲む壁の場合、そのモデルを構成する板の一部をコピーするなどして作りたくなります。しかしそうすると、作るのは楽になりますが、[gppbind] で [GPPBIND_MESH]指定しても、どうもコリジョンが思い通りの範囲になってくれません。
「メタセコイア」で作るならば、「基本図形」の「平面」から、回転、拡大縮小したり、「ナイフ」を使ったりして、壁を伸ばしていくといいようです。この作り方の壁だと、コリジョン判定が思い通りになってくれます。



アキアキノヒロロ

リンク

2021/4/29(Thu) 07:07:54|NO.92714

ここでは、壁作りと言っていますが、何も垂直なつながった壁だけではありません。
その底を塞ぐ、樋のようなものでも大丈夫ですし、天井を付けた、トンネルのようなもの、両方持った筒状のものも、一つのオブジェクトとして、GPPBIND_MESHのオプション指定の利用が出来ます。
これは、本来が「モデル形状のコリジョンを使用するオプション」なのですから、当然なことでしょう。

「複雑なモデル形状」のものへの利用は、あまり勧められないようですが、どの辺まで許容できるか、やってみています。
今作っているゲームは、3Dモデルだけを数えても、大小120以上、板ノードは300ほどを表示させています。同時に、30くらいは動いています。ローポリもローポリ、「デフォルメ等身」の珠音ちゃん以下のポリゴン数のものばかりですが。
この状況のゲームの中でも、珠音ちゃん程度のポリゴン数以下の壁(?)ならば、GPPBIND_MESHのオプション指定の利用は、今のところ、違和感もなく、支障なしの有効です。

一応、私のパソコンは、
Windows 10 Home 64 ビット
プロセッサ Intel(R) Core(TM) i5-4210U CPU @ 1.70GHz 2.40GHz
実装 RAM 8.00 GB


念のため、命令の記述は、もちろん以下のようです。

gppbind id_kabe_obj, 0, , GPPBIND_MESH

です。重さ(mass)を0にすることで静的剛体にし、床(地面)と同等にした上で、[GPPBIND_MESH] です。
摩擦係数(friction)は空欄(省略)です。



アキアキノヒロロ

リンク

2021/5/5(Wed) 07:16:11|NO.92753

[GPPBIND_MESH] 指定した場合でも、

> gppbind id_kabe_obj, 0, , GPPBIND_MESH

のように、摩擦係数(friction)は指定せず、重さ(mass)を0にすることで、床(地面)と同等にした時は、[setscale] での設定の大きさに表示されます。
これは、床(地面)の場合の仕様が、そのまま壁にも当てはまっている、と考えられます。
床(地面)を [setscale] して表示したのに、表示されたその範囲で、床(地面)の機能が働いてくれなければ、役に立たない訳ですから。
壁は、その床(地面)が垂直になっただけです。斜めに傾いた床(地面)も、傾いた壁です。途中で傾いた床(地面)も、途中で曲がった壁です。
ただし、どんな形になっていても、それは一つのオブジェクトでなければならないようです。
「メタセコイア」で言えば、別々に作った別々のオブジェクトでも、オブジェクトの設定パネルで、[合成] してやることで、一つのオブジェクトにすると、床(地面)の機能が使えるようになります。
切り離れているもの同士でも、例えば両側にある壁、見た目は二つでも、[合成] して一つのオブジェクトとして登録(?)してやれば、大丈夫です。
これを[合成]しないでそのまま、[.mqo] ファイル、[.gpb] ファイルにすると、ファイルは一つでも、二つの別々のオブジェクトなので、床(地面)の機能は、先頭に登録(?)してあるオブジェクトのみにしか、適用されないようです。
[HSP] 上では、一つの[.gpb] ファイルとして、読み込み、表示もされますが、例えば両側の壁、両方とも表示されていても、片側しか床(地面)の機能が働かないのです。なので、[合成]は必須です。

「複雑なモデル形状」は、適用が難しいようですが、今作っているゲーム内での様子をみる限り、「ローポリ」といわれる程度のものに収まっていれば、使用するに十分耐えます。



アキアキノヒロロ

リンク

2021/5/5(Wed) 12:20:22|NO.92754

アイデアの一つです。

炭鉱の坑道のように、前後左右上下、様々な方向にまがりくねったパイプ状のものでも、一つのオブジェクトになっていれば、大丈夫。
重さ(mass)を0にすることで静的剛体にし、摩擦係数(friction)は空欄(省略)、[GPPBIND_MESH] 指定すれば、いいのです。
その中を移動させることも可能になります。
パイプの中のどこかに、[setpos] した立方体オブジェクト(model_box)などに、物理設定したなら、[gppapply] で前後左右上下に力を加えて動かす訳です。
(注. 物理設定した後では、[setpos] 出来ません)

> gppapply model_box, GPPAPPLY_IMPULSE, x, y, z

パイプがなければ、空中をヘリコプター飛行するような感じでしょうが、例えて言えば、ジェットコースターの軌道に沿って移動するイメージです。

自分のゲーム内でどうにかなってます。

[GPPBIND_MESH] 指定のアイデア、他にも考えられると思います。
ヒントめいたことでも、お寄せ頂けると、うれしいです。お願いします。



アキアキノヒロロ

リンク

2021/5/7(Fri) 11:47:22|NO.92763

小さなモデル(Little_model)を、それを包むような大きなモデル(Big_model)の中に位置設定している場合のことです。
両方に物理設定すると、設定前には大きなモデルの中にあった小さなモデルは、その外に出た位置にセットされてしまいます。
物理設定したもの同士はその空間的位置を共有できないようです。

よくテストサンプルとして、[gpbox] で作った[box]を使います。
この時、[box]=箱と考えがちですが、物理設定としての[box]は、がらんどうの箱ではなくなり、サイコロのような中身の詰まった「立方体」なのですね。
だから、上記のことを、[box]を使ってのテストで行なうと、勘違いしやすいです。
このことから、「メタセコイア」で筒状のものを作るときは、「平面」からです。
「立方体」の左右を切って伸ばしても、物理設定として、それは断面の四角い棒なんですね。
当たり前と言えば、当たり前ですが、「立方体」の表面は、「面」であっても、物理設定としての「平面」ではないことに注意しないといけないのですね。

楽して作ろうとして、墓穴を掘ります。



アキアキノヒロロ

リンク

2021/5/16(Sun) 01:40:10|NO.92874

平面のオブジェクトには、当たり前ですが、表と裏の面があります。表の面も裏の面もそれとしては、オブジェクトではないのですね。
そして、「Metasequoia」でも、「blender」でも表の面は見えても、裏の面は見えないですよね。
見えるようにしようと思ったら、面を反転させたり、両面化しないとダメですね。
体積のある、立方体でなら、面に裏がなくて、裏の面が見えないのは、何となく、そういうものだろうと、一応納得します。
でも、平面だと、この関係がどうもしっくりこないです。

そして、ここで思うわけですが、平面に物理設定した時です。
例えば、その右側から接して行った場合には、その平面で止まったり、跳ね返されたりしても、その逆に左側からは、通り抜けられるみたいな設定って、出来ないのだろうか、と。
プログラム上では、位置関係を条件設定すれば、[gppset objid, GPPSET_ENABLE, 0] を使ってできると思います。
しかし、ただの平面ではなく、ここで色々やっている壁のようなものになってくると、複雑すぎて、位置関係の条件設定では無理です。
筒状のような壁(?)であっても、面には、表と裏があるように、表側だけに物理設定ができる、なんてことが出来ないものか。

たとえ出来たとしても、どんなことに使えるんだ、と言われそうですが。



アキアキノヒロロ

リンク

2021/6/20(Sun) 17:34:56|NO.93090

GPPBIND_MESHのオプション指定の利用方法として、もう一つ、思い付きました。

[gppbind] で床(地面)設定するために、[gpfloor] で生成する床ノードを使うのが一般です。
しかし、gpbモデルノードでもできるはず。これまで、壁としての利用ばかり考えていましたが、地面でもいいはずです。
[Plane]を何十にも分割して高低差をつけたり、それぞれ角度を変えたりして、[デコボコ地形gpbモデル] を作り、それを[gppbind] でGPPBIND_MESHのオプション指定すればいい訳です。

今まで地面としては、段差のある床(地面)や、ある程度の傾斜を持たせた斜面ぐらいしか、考えられなかった、それが当然のように思い込んでいましたが、[デコボコ地形gpbモデル] で、自由度が増し、より自然な描写が可能になります。

ここには、スクリプトのみ載せますが、ファイル等まとめたものを下記からダウンロードできます。
「terrain.zip」を解凍して、実行してみて下さい。

なお、[デコボコ地形gpbモデル] は、
「FBX 無料 3D モデル - .fbx ダウンロード - Free3D」(https://free3d.com/3d-models/?page=2) の自然/地形 のFree素材を元にしています。


「terrain.zip」
https://drive.google.com/file/d/143Qvcm_gVB6T_tY-O3rMlvHco9WorSvB/view?usp=sharing

#include "hgimg4.as" gpreset setcls CLSMODE_SOLID, $404040 ;〓〓[デコボコ地形のgpbモデル]〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 gpload id_terrain,"res/Terrain/terrain" setscale id_terrain, 0.01, 0.01, 0.01 setpos id_errain, 0.0, 0.0, 0.0 gppbind id_terrain, 0, , GPPBIND_MESH ; 物理設定 (コリジョンとしてノードのモデルを反映) ;================================================== gpbox id_box, 2, $ffff00 ; 珠音用箱ノード setpos id_box, 0.0,5.0,0.0 setalpha id_box, 64 gppbind id_box, 1.0, 0.5 gpload id_model,"res/tamane2" ; 珠音モデル読み込み setscale id_model, 0.02,0.02,0.02 gpact id_model ; 再生 setpos GPOBJ_CAMERA, 0,20,70 ; カメラ位置を設定 ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 repeat stick key,15 if key&128 : end ;================================================== ; カーソルキーで珠音用箱ノード位置を動かす if key&1 : gppapply id_box, GPPAPPLY_IMPULSE, -0.1, 0, 0 if key&4 : gppapply id_box, GPPAPPLY_IMPULSE, 0.1, 0, 0 if key&8 : gppapply id_box, GPPAPPLY_IMPULSE, 0, 0 , 0.1 if key&2 : gppapply id_box, GPPAPPLY_IMPULSE, 0, 0 , -0.1 getpos id_box, x, y, z setpos id_model, x, y-1, z ; タッチでカメラ位置を動かす if dragmd { ; ドラッグ中 getkey a,1 if a=1 { dx=0.05*(mousex-dragx)+cx dy=0.05*(mousey-dragy)+cy setpos GPOBJ_CAMERA, dx,dy,cz } else { dragmd=0 } } else { ; ドラッグなし getkey a,1 if a { dragx=mousex:dragy=mousey getpos GPOBJ_CAMERA, cx,cy,cz dragmd=1 } } gplookat GPOBJ_CAMERA, x, y, z ; カメラから指定した座標(珠音モデル)を見る ;================================================== redraw 0 ; 描画開始 gpdraw ; シーンの描画 redraw 1 ; 描画終了 await 1000/60 ; 待ち時間 loop ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓



アキアキノヒロロ

リンク

2021/6/21(Mon) 14:22:15|NO.93091

上記 [NO.93090] の方法によって、[hgimg4] でも、[hgimg3]サンプルの [meshmap] や [tamane] のようなこともプログラムできるようになります。
今年のコンテストに、この利用方法を取り込んだものを出そうか、と考えているところです。

3Dに関しては、今もって [hgimg3]使用者のほうが多いようですが、[hgimg4] も少しずつ置き換えられることが増えてきている感じがします。

ここに載せたアイデア、気に入った方に、好きに使って頂ければ、嬉しいです。



ONION software Copyright 1997-2023(c) All rights reserved.