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


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
1124
アキアキノヒロロ3D表示レーダー『RadarScreen_for_3D.hsp』を試作4解決


アキアキノヒロロ

リンク

2021/11/24(Wed) 17:52:13|NO.94488

3Dゲームのモデル進行方向が常に上になる、レーダー表示として、『RadarScreen_for_3D.hsp』を試作しました。
すでにどなたかがやっておられたら、すいません。
猫の手 さんの「DEMON OF MAZE」や、法貴優雅 さんの「日曜ゾンビExtreme」での、レーダー表示がうまく再現できませんでした。
これはそれらと違って、3D表示レーダーです。
プロコン出品作"ANIMAL_ISLAND"のレーダー表示は、向きが固定されてて、見づらかったので、どうにか作ってみました。
以下、スクリプトです。これを「sample/hgimg4/」に入れて実行してみて下さい。

『RadarScreen_for_3D.hsp』実行動画
https://twitter.com/akiakinohiroro/status/1463410217169809416
試作ゲーム「迷路の島」実行動画
https://twitter.com/akiakinohiroro/status/1463419547671678980

RadarScreen_for_3D.hsp

#include "hgimg4.as" title "RadarScreen_for_3D.hsp" setcls CLSMODE_SOLID, $404040 gpfloor id_floor, 10, 10, $00ffff ; 床ノードを追加 setpos id_floor, 0, 0, 0 gppbind id_floor, 0 ; [地面]の物理設定 box_w=1.0 box_x=0.0 : box_y=box_w/2 : box_z=0.0 gpbox id_box, box_w, $ff0000 ; 珠音用箱ノードを追加 setpos id_box, box_x, box_y, box_z gppbind id_box, 1.0, 0.5 ; 珠音用箱の物理設定 gpload id_model,"res/tamane" ; モデル読み込み setscale id_model, 0.01,0.01,0.01 setpos id_model, box_x, box_y-box_w/2, box_z gpaddanim id_model,"run",0,700 ; "run"クリップを設定 gpact id_model,"run" ; "run"クリップを再生 ca_y= 15.0 setpos GPOBJ_CAMERA, 0, ca_y, 0.1 ; カメラ位置を設定 ;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ *Main_Loop stick key,15 ;■ [方向]キー if key&128 : end ;■ [Esc] ; ◆ カメラの高度 getkey k,16 : if k { ;■ [SHIFT]キー ca_y=ca_y+0.15 : if ca_y>23.0 : ca_y=23.0 } getkey k,17 : if k { ;■ [CTRL]キー ca_y=ca_y-0.15 : if ca_y<8.0 : ca_y=8.0 } ; ◆ カメラの向き(回転) if key&1 : ca_cnt++ : if ca_cnt=256 : ca_cnt=0 ;■ [←]キー if key&4 : ca_cnt-- : if ca_cnt=-256 : ca_cnt=0 ;■ [→]キー ; ◆ [↑]キーで、前進 if key&2 { ; [モデルの向きの変化量] が [カメラの向きの変化量] と違うならば if model_cnt!=ca_cnt : gosub *model_cnt_set ; [モデルの向きの変化量] が [カメラの向きの変化量] に同じならば if model_cnt=ca_cnt { ; deg2rad(ca_deg) = カメラ角度(ca_deg)をラジアンに変換して ca_deg=1.0*360*ca_cnt/256 Mx=sin deg2rad(ca_deg)*(0.05) Mz=cos deg2rad(ca_deg)*(0.05) ; 珠音用箱に[GPPAPPLY_IMPULSE](=瞬間的な衝撃)を与える gppapply id_box, GPPAPPLY_IMPULSE, Mx, 0.0, Mz } setangr id_model, 0.0, model_cnt, 0.0 } ; 珠音を 珠音用箱位置に セット getpos id_box, box_x, box_y, box_z setpos id_model, box_x, box_y-box_w/2, box_z ; カメラ位置を設定(高度=ca_y) ; モデルの真上にすることで、レーダーの中央に setpos GPOBJ_CAMERA, box_x, ca_y, box_z ; カメラの向き(回転)を設定 ; X軸回転で真下に向け、その時 垂直方向の回転軸になる Z軸で(+180)して 回転 setang GPOBJ_CAMERA, deg2rad(-90), 0, deg2rad(1.0*ca_cnt/256*360+180) ;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ redraw 0 ; 描画開始 gpdraw ; シーンの描画 color 255,255,255 pos 10,10 mes "カメラ高度\n = [SHIFT / CTRL] キー" mes " " mes "カメラ・モデル回転\n = [← / →] キー" mes " " mes "モデル前進\n = [↑] キー" redraw 1 ; 描画終了 await 1000/60 ; 待ち時間 goto *Main_Loop ;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ *model_cnt_set ; [モデルの向きの変化量] が [カメラの向きの変化量] より大きいならば if model_cnt>ca_cnt { sa=model_cnt-ca_cnt if sa<=128 : model_cnt-- : if model_cnt<ca_cnt : model_cnt=ca_cnt if sa>128 : model_cnt++ : if model_cnt>(ca_cnt+256) : model_cnt=ca_cnt } ; [モデルの向きの変化量] が [カメラの向きの変化量] より小さいならば if model_cnt<ca_cnt { sa=model_cnt-ca_cnt if sa>=-128 : model_cnt++ : if model_cnt>=ca_cnt : model_cnt=ca_cnt if sa<-128 : model_cnt-- : if model_cnt<=(ca_cnt-256) : model_cnt=ca_cnt } return



この記事に返信する


アキアキノヒロロ

リンク

2021/11/26(Fri) 07:18:15|NO.94529

このスクリプトの肝は、74行目の [setang] ですが、

; カメラの向き(回転)を設定
; X軸回転で真下に向け、その時 垂直方向の回転軸になる Z軸で(+180)して 回転
setang GPOBJ_CAMERA, deg2rad(-90), 0, deg2rad(1.0*ca_cnt/256*360+180)

この意味を敷衍して、説明してみると、
;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
;■ カメラの向き(回転)を設定
; 〓〓 X軸回転で真下に向け、その時 垂直方向の回転軸になる Z軸を(+180)して 回転 〓〓
; カメラは、初期設定で、Z軸の(-)方向に向いているので、X軸の(-90)回転で真下に向く。
; その時点で垂直方向の軸となるのは、Z軸(+)方向を真上とするZ軸なので、
; このZ軸に、本来のカメラの向き(カメラのY軸回転)をセットする
; ただし、元々カメラは、Z軸の(-)方向に向いているので、修正のため(+180)して Z軸を回転
;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
となるかと思います。

この説明が果たして正しいかどうか、甚だ心もとないですが、自分としては、現状、この理屈で納得しようかと!?
どなたか、正解を教えていただけないでしょうか。



usagi

リンク

2021/11/26(Fri) 20:24:38|NO.94537

こんにちは。
いち意見としてですが、正しいかどうかというより下記の様な方が
考え方が分かりやすいかと感じました。
------------
カメラのデフォルトは画面奥方向を向いているので、
キャラと同じ方向に回転(Y軸)させて、カメラを下に向けます(X軸)
※Y->X回転

setangy GPOBJ_CAMERA, deg2rad(-90), deg2rad(ca_cnt*360/255+180)
------------
※ちなみに、360掛け合わせてから255で割った方が効率がよいです(一度実数にしなくてよいので)

また、角度を0~255で扱っていてx->y->z回転で表記したいなら下記の方がシンプルかとは思いました。

setangr GPOBJ_CAMERA, -64, 0, ca_cnt+128

※余談※
スクリプトの先頭に下記のようなものを入れておくと、
掲示板コピペで確認できるので皆さんコメントや検証がしやすくなるのではと思いました。

chdir dir_exe+"\\sample\\hgimg4"



アキアキノヒロロ

リンク

2021/11/27(Sat) 07:27:23|NO.94542

[deg2rad] で扱う deg は、整数でいい訳ですよね。
気にし過ぎて、実数にしてました。
ただ、割るのは、255ではなく、256のはずでは?
[setangy] は、どうも私としては、感覚的に掴みづらくてやってみませんでした。でも、

>キャラと同じ方向に回転(Y軸)させて、カメラを下に向けます(X軸)
>※Y->X回転

という考え方のほうが、素直な方法ですね。
また、角度を0~255で扱っているのだから、[setangr] を使うほうが筋が通りますね。
有難うございました。

※余談※ でお教え下さった命令、そんなふうな命令があったなあとは思っていましたが、
命令自体を思い出せなかったので、すいませんでした。
以前、usagi さんにお世話になった時、usagi さん、スクリプトに使っておられてましたね。

usagi さんには、角度について、色々お世話になりました。重ねて御礼申します。



usagi

リンク

2021/11/27(Sat) 12:24:40|NO.94544

あっ、256ですね記入ミスでございます。混乱させてすみません。

コメントとしては、オイラー角で回転させるなら、
回転順番を都合に合わせて使い分けて説明するのが良いのかなぁ、思った感じでした。



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