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


HSPTV!掲示板


未解決 解決 停止 削除要請

2024
0326
アキアキノヒロロ物理でなく、[gppraytest]で壁コースを進む方法11解決


アキアキノヒロロ

リンク

2024/3/26(Tue) 23:13:18|NO.101460

もうすでに、どなたかがやられている方法でしたら、お許し下さい。
度々ですが、GENKIさんの『地表を歩く』を参考利用させて頂いています。ありがとうございます。

動画、『X』に載せました。
https://twitter.com/akiakinohiroro/status/1772620905715277929

おかしなところがあれば、教えて頂きたいです。
また、他の方法があるのでしたら、紹介してほしいです。
以下、スクリプトです。
時として、無限ループになって、反応なしで動かなくなることがあるかもですが。([*modori] の箇所)

#include "hgimg4.as"
title "HGIMG4 Test" gpreset setcls CLSMODE_SOLID, $404040 gpfloor id_floor, 50,50, $00ffff // 床ノードを追加 gpload id_fence,"res/course_fence/course_fence" // 壁モデル読み込み setscale id_fence, 0.25,0.25,0.25 addang id_fence, 0, M_PI/8, 0 // わざと向きを変えてみる gppbind id_fence, 0.0, 0.01, GPPBIND_MESH gpbox id_null, 1.0, $ff0000, setpos id_null, 22, 1.0/2, 0 addang id_null, 0, M_PI, 0 // 手前に向ける(タマネの向きに揃える) gpload id_tamane,"res/tamane" // モデル読み込み setscale id_tamane, 0.03,0.03,0.03 setpos id_tamane, 22, 0, 0 setpos GPOBJ_CAMERA, 0,90,-15 // カメラ位置を設定 repeat stick key,15 if key&128 : end gplookat GPOBJ_CAMERA, 0, 0, 0 // カメラから指定した座標を見る fvset fv_vel, 0, 0, 0 ; 進行方向ベクトル ;……回転………………………………………………………………………… if key&1 { ; ■■ [←]キー ←左回転 addang id_null, 0, 0.02, 0 ; ■■ (タマネnull) addang id_tamane, 0, 0.02, 0 ; ■■ (タマネ) addang_cnt+ if (0.01*addang_cnt > M_PI*2) : addang_cnt=0 } if key&4 { ; ■■ [→]キー →右回転 addang id_null, 0, -0.02, 0 ; ■■ (タマネnull) addang id_tamane, 0,-0.02, 0 ; ■■ (タマネ) addang_cnt- if (-0.01*addang_cnt < -M_PI*2) : addang_cnt=0 } ;……進行………………………………………………………………………… if key&2 : fvset fv_vel, 0, 0, 0.25 ; ■■ [↑]キー *modori getang id_tamane, xr, yr, zr fvset fvr, xr, yr, zr ; 進行方向ベクトルを現在の[id_tamane](ノード)の向きに回転します。 ;■ ベクトル乗算 fvmul fvr, -1,-1,-1 ;◆◆◆ fvdir のバグ対策 ◆◆◆ ;■ ベクトル回転 ;■ [if key&2 / if key&8] キー操作による回転 fvdir fvr, fv_vel(0), fv_vel(1), fv_vel(2) ; 現在の向きに合わせた進行方向ベクトルを現在値に加算 addpos id_null, fvr(0), fvr(1), fvr(2) addpos id_tamane, fvr(0), fvr(1), fvr(2) gppraytest objid, id_null, 1 ; 前方[ 1 ]の距離までを テスト ;◆◆◆ [id_null] の前方[ 1 ]以内に障害物(壁)がある場合、逆方向に僅かに戻す ◆◆◆ if objid >0 { ; より厳密には、[if objid=id_fence] if key&2 : fvset fv_vel, 0, 0, -0.0001 ; ■■ [↑]キー goto *modori } redraw 0 ; 描画開始 gpdraw ; シーンの描画 color 255,255,0 font "MS ゴシック", 30,1 pos 20,20 getpos id_tamane, ta_x, ta_y, ta_z mes "tamane = "+ta_x+" / "+ta_y+" / "+ta_z redraw 1 ; 描画終了 await 1000/60 ; 待ち時間 loop



この記事に返信する


アキアキノヒロロ

リンク

2024/3/27(Wed) 10:50:50|NO.101461

無限ループで無反応になることがあるのを回避するため、少し直してみました。

[gppraytest] で衝突感知した時の処理で、本来の [fvset] に指定されている [z] 値の大きさ(=-0.25)と、
この箇所の [z] 値の大きさとの大小で、動きが違ってくる。

		if key&2 : fvset fv_vel, 0, 0, (-0.25 -0.0001)	; ■■ [↑]キー ;◆◆◆ 戻りの方が 僅かに大きい

として、この後を次のようにし、描画に続けます。
			ang_rnd=rnd(3)-1
			addang id_null, 0,  0.02*ang_rnd, 0	; ■■ (タマネnull)
			addang id_tamane, 0, 0.02*ang_rnd, 0	; ■■ (タマネ)
			addang_cnt=addang_cnt+ang_rnd
			if (0.01*addang_cnt > M_PI*2) : addang_cnt=0
			test_cnt+ : if test_cnt>100000 : test_cnt=0 : goto *out

			test_cnt=0
			goto *modori
			}
*out

上記のようにすると、無限ループになることは まずないが、[↑]キーだけでは進まないです。
上記の [z] を最初のスクリプトと同じ (-0.0001) にして、この方法を実行すると、[↑]キーだけで進み続けるが、
壁を通り抜けたり、無限ループで無反応になることがあります。



アキアキノヒロロ

リンク

2024/3/27(Wed) 18:10:09|NO.101462

> 本来の [fvset] に指定されている [z] 値の大きさ(=-0.25)

の、(=-0.25) は、(=0.25) の間違いでした。すいません。



アキアキノヒロロ

リンク

2024/3/28(Thu) 21:26:57|NO.101471

ポイント切替えの動画、『X』に載せました。
https://twitter.com/akiakinohiroro/status/1773324040926581082



名無し

リンク

2024/3/29(Fri) 18:33:54|NO.101475

こういうのは自分のブログなりでやっていただきたいと感じます。



buhio

リンク

2024/3/29(Fri) 21:45:59|NO.101478

こんにちわ。ご無沙汰しております。ワタクシも移動には苦労しております。
同じくGENKIさんのコードをベースに、まがりなりに汎用性が出るように頑張ってみました。
ちょっとまだジャンプでひっかかるのがなんともなんですが。。

上下左右方向に移動制限出来ているんではというテストコードです。
考え方として、
々洪形阿虜舵犬鯤歛
▲献礇鵐廚箘榮阿膿靴靴ず舵犬決まる。
8鼎ず舵犬ら新しい座標へレイを飛ばし、ヒットしたら移動できずに戻す。
ぅ劵奪箸靴覆韻譴个修里泙淇靴靴ず舵
と、考えてみました。

ところどころ、妙な数字を足したりしていますが、ピシッと組めず、まぁいいやと諦めた部分もあります。
スーパーマ●オみたいにスムーズに動きませんね( ノД`)シクシク…


#include "hgimg4.as" chdir dir_exe+"\\sample\\hgimg4" title "HGIMG4 アスレチック(GENKIさんコード改変)" gpreset setcls CLSMODE_SOLID, $404040 setcolor GPOBJ_LIGHT, 1,1,1 ; ライトカラーを設定 setdir GPOBJ_LIGHT, 0.5,0.5,0.5 ; アンビエントカラーを設定 ;床ボックス gptexmat id_texmat, "res/qbox.png" gpbox id_floor,100,0,id_texmat setpos id_floor,0,-50,0 gppbind id_floor,0 ;ボックス1 gpbox id_box,5,0,id_texmat setpos id_box,0,15,0 gppbind id_box,1 ;ナナメボックス gpbox id_box2,1,0,id_texmat setpos id_box2,-15,0,0 addangr id_box2,-60,0,0 setscale id_box2,10,30,1 gppbind id_box2,0, ,GPPBIND_MESH ;浮きボックス gpbox id_box3,5,0,id_texmat setpos id_box3,5,6,8 setscale id_box3,1,0.30,1 gppbind id_box3,0,GPPBIND_MESH ;衝突テスト用ボックス gpbox id_test,1,$ff0000 setpos id_test,10,10,0 ;tamane読込 gpload id_model,"res/tamane2" setscale id_model,0.01,0.01,0.01 gpact id_model gpsetanim id_model,0,GPANIM_OPT_SPEED,200 setpos id_model, 5,20,5 ; 作業用のヌルノード gpnull id_null setang id_null, -M_PI/2.0, 0, 0 ; 作業用のヌルノード gpnull id_null2 ; カメラ setpos GPOBJ_CAMERA, 0,10,30 ; カメラ位置を設定 gplookat GPOBJ_CAMERA, 0,0.3,0 ; カメラから指定した座標を見る ; 初期値 ; ジャンプ速度 fvset fv_jump, 0,0,0 ; 地面の高さ(標高) height = 0.0 repeat stick key,15+2048+4096 if key&128 : end redraw 0 ; 描画開始 getpos id_model,oldx,oldy,oldz;更新前の座標を保存 ; ========================================================================== ;------------------------------ ; キー入力による移動とジャンプ ;------------------------------ fvset fv_vel, 0, 0, 0 ; 進行方向ベクトル if key&1 : addang id_model, 0, 0.06 ; ←左回転 if key&4 : addang id_model, 0, -0.06 ; →右回転 if key&8 : fvset fv_vel, 0, 0, -0.2 ; ↓進行方向ベクトル(後ろに進む) if key&2 : fvset fv_vel, 0, 0, 0.2 ; ↑進行方向ベクトル(前に進む) if key&16 { if flgJump = 0 { ; ジャンプ中のジャンプを防止 fvset fv_jump, 0, 1.0, 0 ; ジャンプ初速 flgJump = 1 ; 0=着地中、1=ジャンプ中(空中) } } if key&2048 : fvadd fv_vel, 0.2, 0, 0 ;←進行方向ベクトル(左に進む) if key&4096 : fvadd fv_vel, -0.2, 0, 0 ;→進行方向ベクトル(右に進む) if key&1024 {;カメラモードチェンジ if CAM_MODE=0{CAM_MODE=1}else{CAM_MODE=0} } ; 初期値状態に比べてどのくらいの角度を向いているかを取得。 getang id_model, xr, yr, zr fvset fvr, xr, yr, zr ; 進行方向ベクトルを現在のノードの向きに回転します。 fvmul fvr, -1,-1,-1 ;fvdir のバグ対策 fvdir fvr, fv_vel(0), fv_vel(1), fv_vel(2) ; モデルの位置をヌルノードにセット getpos id_model, px, py, pz setpos id_null, px, py+0.5f, pz ; モデルの少し(50)上から100下までの線分と地面との交点を計算 ; 地面との接触がある場合は、アヒルの高さを地面に合わせる。 gppraytest objid, id_null,100.0f if objid > 0 { getwork id_null, wx, height, wz }else{ } ;------------------------------ ; ジャンプ ;------------------------------ if flgJump { ; ジャンプ中(空中) ; 重力加速度の分だけジャンプ速度を減速 addpos id_model, fv_jump(0), fv_jump(1), fv_jump(2) fvsub fv_jump, 0, (9.8/60)/3, 0 fvset fv_vel, 0, 0.1, ;ジャンプ終了条件 getpos id_model, px, py, pz if py < height { setpos id_model, px, height, pz fvset fv_jump, 0,0,0 flgJump = 0 } } else { ; ジャンプしていない(着地中) ; 接地したまま地面高さに沿って上り下りしている状態。 ; そのままでは地面にめり込んだり、空中散歩してしまうため ; 位置を地面高さに移動する。 getpos id_model, px, py, pz if (py-height)<1.0{ setpos id_model, px, height, pz flgJump = 0 }else{ ;自由落下 setpos id_model, px, py-(9.8/60/3), pz flgJump = 1 } } ;一旦、モデルを移動させる addpos id_model, fvr(0), fvr(1), fvr(2) ;移動可能か判定する getpos id_model,newx,newy,newz ;新座標 setpos id_null2,oldx,oldy+0.5,oldz ;ヌル2を旧座標へ移動 gplookat id_null2,newx+0.001,newy+0.5,newz ;ヌル2が新座標を向く(直上だと上手くいかなかった) gppraytest objid,id_null2,0.5f ;0.5でレイテスト if objid>0{ ;hitしたということは壁があったということなので、hit位置へ移動 getwork id_null2, wx, wy, wz getwork2 id_null2, wx2, wy2, wz2 setpos id_model, oldx+wx2*0.0001,oldy+wy2*0.0001,oldz+wz2*0.0001//ほんの少しだけ壁の法線方向に戻す setpos id_test,wx,wy,wz logmes objid } //===カメラのモード if CAM_MODE=0{//俯瞰モード setpos GPOBJ_CAMERA, 0,10,30 ; カメラ位置を設定 getpos id_model,x,y,z gplookat GPOBJ_CAMERA, x,y,z ; カメラから指定した座標を見る }else{//TPSモード getang id_model, xr, yr, zr fvset fv,-xr,-yr,-zr fvdir fv,0,8,-15 getpos id_model,px,py,pz setpos GPOBJ_CAMERA,px+fv.0,py+fv.1,pz+fv.2 gplookat GPOBJ_CAMERA, px,py,pz } ; ========================================================================== ; シーンの描画 gpdraw ,GPDRAW_OPT_DEBUG_PHY color 255,255,255 pos 8,8:mes "HGIMG4 方向キーorZX:移動 スペース:ジャンプ" getpos id_model, px, py, pz mes strf("位置:%3.2f, %3.2f, %3.2f", px, py, pz ) redraw 1 ; 描画終了 await 1000/60 ; 待ち時間 loop



usagi

リンク

2024/3/29(Fri) 22:08:38|NO.101479

こんにちわ。

>おかしなところがあれば、教えて頂きたいです。
>また、他の方法があるのでしたら、紹介してほしいです。

いろいろな方法はあると思いますので、おかしいとは思いませんが、
見た感じで、goto を使っているので、無限ループの危険性があるのではないでしょうか?

3Dの処理でよくある対応は、判定の処理回数を限定するなどが思い当たります。
(何回も処理すると重いので、次のフレームに分散させたりなど)

モデルが無いので試す事が出来なく、合ってるか分かりませんが、
例えば4回まで判定するイメージ例です。


;*modori ジャンプでの無限ループををやめる repeat 4; ★4回までにする ; ここで色々判定して if レイキャストがめり込んでない : break if レイキャストがめり込んでる : continue; ★goto *modoriの様な無限ループにはしない loop
当該フレームでは4回までめり込んでたら戻して、
それでもめり込んでたら、次のフレームでまた4回めり込み戻しをするので、
いつかはめり込まなくなる考えです。

壁抜けに関しては難しい問題ですよね。
移動速度と大きさ(厚み)を考えてプログラムする必要があると思いますので、
完璧なものというのは難しいとは思います。

ゲーム的な表現であり、数学のシミュレート的な目的でなければ、
鋭角な角とかは、見えない壁とかおいて鈍角にするとか
モデルをそのまま当たりに使うのではなく、
作りたいものに合わせた工夫は必要かと思いました。



usagi

リンク

2024/3/29(Fri) 22:19:10|NO.101480

あぁ..すみません。更新したらbuhioさんと被ってしまいました。(最近私やらかす)
いいですね。これすばらしい。

>スーパーマ●オ
あの滑らかな感じはベルレ法で処理してる聞いたことありますよ。



buhio

リンク

2024/3/29(Fri) 22:28:00|NO.101481

おぉ師匠、、!やはり来てくれましたか。。

また出ましたよ。新しい言葉「ベルレ法」
ググったら、もう大変です。。積分積分なんですかコレハ。


「大雑把な説明として、Verlet 法とは加速度を用いて速度を更新し、速度を用いて物体の座標を更新していく方法です。」
わかんねぇよ〜。



buhio

リンク

2024/3/29(Fri) 22:42:23|NO.101482

 いや、もしかして初代スーパーマ●オの速度足していくってやつかな?1フレーム前の速度
また宿題が。。。

https://qiita.com/morian-bisco/items/4c659d9f940c7e3a2099

 なるほどぉ(←わかってない



アキアキノヒロロ

リンク

2024/3/30(Sat) 05:46:39|NO.101485

>名無しさん、すいませんでした。

そのように思われる方がおられるかも知れない、と感じていました。
ただ、物理以外の方法がなかなか上手くいかず、やっとのことでどうにか形にできたことに、
自分ながら調子にのっていたところがありました。
『X』の動画も、宣伝のようになってしまったですね。

それでも、こちらに投稿させて頂いたのは、[hgimg4]の方法論として、
GENKIさんの『地表を歩く』がとても魅力的なのにも関わらず、
あまり取り上げられないでいるのが残念で、仕方なかったからです。
「平面上での3D」ではなく、「立体空間での3D」としての魅力です。

今現在も、衝突処理に関する、より良い方法を考えあぐねています。


>buhioさん、usagiさん、有難うございます。

buhioさんのスクリプトと格闘しています。
[getwork][getwork2]の利用方法がよく理解できていません。

usagiさんご指摘の、無限ループの危険性、分かっていましたが、
回避策が悩ましいです。数値の設定も微妙で厄介ですね。

スーパーマ●オが出てくるとは思いませんでした。



アキアキノヒロロ

リンク

2024/4/1(Mon) 18:12:34|NO.101490

失礼ながら、buhioさんのスクリプトを拝借して、手を加えてみました。
『法線ベクトル終点座標』にモデルを移動しているだけですが、
衝突の跳ね返りが表現でき、そのまま、障害物に沿って進みもします。
これで、一応解決といたします。

#include "hgimg4.as"
chdir dir_exe+"\\sample\\hgimg4" title "HGIMG4 操作" gpreset setcls CLSMODE_SOLID, $404040 setcolor GPOBJ_LIGHT, 1,1,1 ; ライトカラーを設定 setdir GPOBJ_LIGHT, 0.5,0.5,0.5 ; アンビエントカラーを設定 ;床ボックス gptexmat id_texmat, "res/qbox.png" gpbox id_floor,100,0,id_texmat setpos id_floor,0,-50,0 gppbind id_floor,0 ;ボックス1 gpbox id_box,5,0,id_texmat setpos id_box,0,15,0 gppbind id_box,1 ;ナナメボックス gpbox id_box2,1,0,id_texmat setpos id_box2,-15,0,0 addangr id_box2,-50,0,0 setscale id_box2,10,30,3 gppbind id_box2,0, ,GPPBIND_MESH ;浮きボックス gpbox id_box3,5,0,id_texmat setpos id_box3,5,6,8 setscale id_box3,1,0.30,1 gppbind id_box3,0,GPPBIND_MESH ;tamane読込 gpload id_model,"res/tamane2" ; ■モデル読み込み setscale id_model,0.01,0.01,0.01 gpact id_model addang id_model, 0.0, M_PI, 0.0 gpsetanim id_model,0,GPANIM_OPT_SPEED,200 mx=5.0 : my=0.0 : mz=5.0 setpos id_model, mx,my,mz ; 作業用のヌルノード=高さ設定用 gpbox id_null_1, 0.5, $00ff00 ; ■[緑]箱ノードを生成する setang id_null_1, -M_PI/2.0, 0, 0 setpos id_null_1, mx,my+3.0,mz ; 作業用のヌルノード=壁検知用 gpbox id_null_2, 1.0, $ffff00 ; ■[黄]箱ノードを生成する setalpha id_null_2, 196 setpos id_null_2, mx,my+0.5,mz ; 衝突座標用 gpbox id_point_1, 0.5, $ff0000 ; ■[赤]箱ノードを生成する setpos id_point_1,10,10,0 ; 法線ベクトル終点座標用 gpbox id_point_2, 0.5, $0000ff ; ■[青]箱ノードを生成する setpos id_point_2,15,10,0 ; カメラ setpos GPOBJ_CAMERA, 0,10,30 ; カメラ位置を設定 gplookat GPOBJ_CAMERA, 0,0.3,0 ; カメラから指定した座標を見る ; 初期値 ; ジャンプ速度 fvset fv_jump, 0,0,0 ; 地面の高さ(標高) height = 0.0 repeat stick key,15+2048+4096 if key&128 : end if key&1024 {;カメラモードチェンジ ; ■[Tab]キー if CAM_MODE=0 : CAM_MODE=1 : else : CAM_MODE=0 } fvset fv_vel, 0, 0, 0 ; 進行方向ベクトル if key&1 { ; ■[←]キー addang id_model, 0, 0.03, 0 ; ←左回転 addang id_null_2, 0, 0.03, 0 ; ←左回転 addang_cnt+ if (0.01*addang_cnt > M_PI*2) : addang_cnt=0 } if key&4 { ; ■[→]キー addang id_model, 0, -0.03, 0 ; →右回転 addang id_null_2, 0, -0.03, 0 ; →右回転 addang_cnt- if (-0.01*addang_cnt < -M_PI*2) : addang_cnt=0 } if key&2 : fvset fv_vel, 0, 0, 0.1 ; ↑進行方向ベクトル(前に進む); ■[↑]キー if key&8 : fvset fv_vel, 0, 0, -0.1 ; ↓進行方向ベクトル(後ろに進む)■[↓]キー if key&2048 : fvadd fv_vel, 0.1, 0, 0 ;←進行方向ベクトル(左に進む) ; ■[Z]キー if key&4096 : fvadd fv_vel, -0.1, 0, 0 ;→進行方向ベクトル(右に進む) ; ■[X]キー if key&16 { ; ■スペースキー if flgJump = 0 { ; ジャンプ中のジャンプを防止 fvset fv_jump, 0, 1.0, 0 ; ジャンプ初速 flgJump = 1 ; 0=着地中、1=ジャンプ中(空中) } } ; ========================================================================== ; タマネの顔が向いている方向に進む ; ↓か↑が押されていない間は、無駄な処理になりますが ; 今回はそのままにしてみました。 ; タマネ(ノード)の向きを取得します。 ; 初期値状態に比べてどのくらいの角度を向いているかを取得。 getang id_model, xr, yr, zr fvset fvr, xr, yr, zr ; 進行方向ベクトルを現在のアヒル(ノード)の向きに回転します。 fvmul fvr, -1,-1,-1 ;fvdir のバグ対策 fvdir fvr, fv_vel(0), fv_vel(1), fv_vel(2) ; 現在の向きに合わせた進行方向ベクトルを現在値に加算 addpos id_model, fvr(0), fvr(1), fvr(2) getpos id_model, new_mx, new_my, new_mz setpos id_null_1, new_mx, new_my+3.0, new_mz ; モデルの少し(3.0)上から100下までの線分と地面との交点を計算 ; 地面との接触がある場合は、モデルの高さを地面に合わせる。 gppraytest objid, id_null_1,100 if objid > 0 { getwork id_null_1, wx, height, wz }else{ } ;------------------------------ ; ジャンプ ;------------------------------ if flgJump { ; ジャンプ中(空中) ; 重力加速度の分だけジャンプ速度を減速 addpos id_model, fv_jump(0), fv_jump(1), fv_jump(2) fvsub fv_jump, 0, (9.8/60)/3, 0 fvset fv_vel, 0, 0.1, ;ジャンプ終了条件 getpos id_model, px, py, pz if py < height { setpos id_model, px, height, pz fvset fv_jump, 0,0,0 flgJump = 0 } } else { ; ジャンプしていない(着地中) ; 接地したまま地面高さに沿って上り下りしている状態。 ; そのままでは地面にめり込んだり、空中散歩してしまうため ; 位置を地面高さに移動する。 getpos id_model, px, py, pz if (py-height)<1.0{ setpos id_model, px, height, pz flgJump = 0 }else{ ;自由落下 setpos id_model, px, py-(9.8/60/3), pz flgJump = 1 } } ;一旦、モデルを移動させる getpos id_model, new_mx, new_my, new_mz setpos id_null_2, new_mx, new_my+0.5, new_mz ; モデルの位置から 1 前までの線分と障害物との交点([赤]箱)を計算 ; 障害物との接触がある場合は、モデルの位置を『法線ベクトル終点座標([青]箱)』に合わせる。 ; これで、障害物との跳ね返りを表現 gppraytest hitres, id_null_2, 1 if hitres=id_floor : hitres=0 if hitres>0 { // 衝突座標 getwork id_null_2, dx, dy, dz // mes "getwork : " + dx + ", " + dy + ", " + dz setpos id_point_1, dx, 0.05, dz ; ■[赤]箱ノード // 法線ベクトル(衝突座標 と ベクトル終点座標 との差(線分) getwork2 id_null_2, d2x, d2y, d2z // mes "getwork2 : " + d2x + ", " + d2y + ", " + d2z new_x=dx+d2x : new_z=dz+d2z setpos id_point_2, new_x, 0.05, new_z ; ■[青]箱ノード setpos id_model, new_x, 0.0, new_z setpos id_null_2, new_x, 0.5, new_z } //===カメラのモード getpos id_model,x,y,z if CAM_MODE=0 {//俯瞰モード setpos GPOBJ_CAMERA, 0,10,30 ; カメラ位置を設定 getpos id_model,x,y,z gplookat GPOBJ_CAMERA, x,y,z ; カメラから指定した座標を見る } else {//TPSモード getang id_model, xr, yr, zr fvset fv,-xr,-yr,-zr fvdir fv,0,8,-15 setpos GPOBJ_CAMERA,x+fv.0,y+fv.1,z+fv.2 gplookat GPOBJ_CAMERA, x,y,z } redraw 0 ; 描画開始 gpdraw ; シーンの描画 ; ========================================================================== font "MS ゴシック", 20,1 color 255,255,0 pos 8,8:mes "HGIMG4 方向キーorZX:移動 スペース:ジャンプ" getpos id_model, px, py, pz mes strf("位置:%3.2f, %3.2f, %3.2f", px, py, pz ) mes "getwork : " + dx + ", " + dy + ", " + dz mes "getwork2 : " + d2x + ", " + d2y + ", " + d2z redraw 1 ; 描画終了 await 1000/60 ; 待ち時間 loop



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.101460への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

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