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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
1110
アキアキノヒロロ物理設定を利用した動きの制御方法16未解決


アキアキノヒロロ

リンク

2019/11/10(Sun) 16:00:33|NO.88831

 コンテストが一段落して、「HGIMG4プログラミングガイド」を読み直しています。

 自分の力でどうにか考えつくものを色々試してみていますが、物理設定を利用した動きの
制御方法で悩んでいます。「HSP 3.6」でだいぶ様子が変わってきているようですが、どうも
思っているような動きを実現する方法が考え出せません。

 「物理設定を行なったノードオブジェクトは、それ以降自立して動作するようになり、
 setposなどの座標変更は無効となります。」

 とあり、操作は、物体に力を加える「gppapply」命令や「gppset」命令でやるようですが、
サンプルもなく、具体的な使用方法が分かりません。
 また、以前「掲示板」で、通りすがり さんに紹介して頂いた、

 「動画置き場 - YouTube」
 https://www.youtube.com/channel/UCQhs8dsM5GIotfhJeWIjXqw/videos?shelf_id=0&view=0&sort=dd

を見直していますが、これらは、2年も前のものにもかかわらず、物理設定の様々な活用例が
実現されています。特に「hsp3gp 物理特性移動をモデルに」 は、自分が求めているもので、
「HSP 3.6」以前にこれを可能にしているのには、驚きです。いったい、どうやっているので
しょうか。「gppset」命令の使い方等とあわせて、どなたか、お教えいただけないでしょうか。



この記事に返信する


砂時 計

リンク

2019/11/12(Tue) 21:56:09|NO.88847

HSP3.5β4 ですでに gppset, gppapply が存在しています。
リファレンスによると gppset の項目の作成日は 2015/03/05 なので
その頃から物理演算機能は存在していたと思います。

私の場合はとりあえず存在する命令は使ってみる、
といったことをします。
結局動作がわからないことも多かったですが。

ご紹介の動画とは動作は全然違いますがサンプルの一つとしてご参考までに。
カーソルキーで青い箱をインパルスで前後左右に動かすコードです。
※向きを滑らかに変えつつその方向へ移動する方法は私にはわからないです。


#include "hgimg4.as" #define Q2 0.707 gpreset setcls CLSMODE_SOLID, $404040 setpos GPOBJ_CAMERA, 0, 20, 30 gplookat GPOBJ_CAMERA, 0, 1, 0 gpfloor id_floor1, 20.0, 20.0, 0x999999 setpos id_floor1, -20.0, 0.0, 0.0 gppbind id_floor1, 0.0, 0.8 gpfloor id_floor2, 20.0, 20.0, 0xffffff gppbind id_floor2, 0.0, 0.0 gpfloor id_floor3, 20.0, 20.0, 0x800000 setpos id_floor3, 20.0, 0.0, 0.0 gppbind id_floor3, 0.0, 1.2 gpbox id1, 2.0, 0x3333ff setpos id1, -20.0, 1.0, 3.0 gppbind id1, 1.0, 1.0 prmid = GPPSET_DAMPING gppset id1, prmid, 0.8, 1.0 vx.0 = 0.0, -1.0, 0.0, -Q2, 1.0, 0.0, Q2, 0.0, 0.0, -Q2, 0.0, 0.0, Q2, 0.0, 1.0, 0.0 vy.0 = 0.0, 0.0, -1.0, -Q2, 0.0, 0.0, -Q2, -1.0, 1.0, Q2, 0.0, 0.0, Q2, 0.0, 0.0, 0.0 coeff = 0.5 *main redraw 0 stick result, 15 index = result & 15 x = vx.index * coeff y = 0.0 z = vy.index * coeff if result & 16 { y = 16.0 } gppapply id1, GPPAPPLY_IMPULSE, x,y,z pos 8,8 getreq fps, SYSREQ_FPS mes strf("%6d [fps]", fps) mes "" + result gpdraw redraw 1 await 1000/60 goto *main



アキアキノヒロロ

リンク

2019/11/13(Wed) 02:13:35|NO.88848

 砂時 計 さん、ご返答ありがとうございます。

 私も質問のしっぱなしはよくないと思い、「gppset」の prmidパラメーターを色々替え、
数値をいじってやってみていましたが、「GPPSET_DAMPING」はまだでした。移動させる
のだから、「LINEAR_FACTOR」「LINEAR_VELOCITY」だろうと思い、これらを「ENABLE」
と組合せて試していましたが、うまくいっていませんでした。
「gppset id1, GPPSET_DAMPING」と「gppapply id1, GPPAPPLY_IMPULSE」を組合せるんですね。

 スクリプト、大変、勉強になりました。知識の乏しい自分には、理解に時間がかかりましたが、
失礼ですが、自分なりに分かりやすくコメントを入れながら、書換えてみました。

#include "hgimg4.as" //#define Q2 0.707 gpreset setcls CLSMODE_SOLID, $404040 setpos GPOBJ_CAMERA, 0, 20, 30*3 gplookat GPOBJ_CAMERA, 0, 1, 0 gpfloor id_floor, 80.0, 80.0, 0x999999 setangy id_floor, 0.0, 0.0, 0.1 gppbind id_floor, 0.0, 0.0 box_xy=2 model_x=0.0 : model_y=0.0 : model_z=0.0 gpload id_model,"res/tamane2" ; 珠音モデル読み込み setangr id_model, 0, 256/2, 0 setscale id_model, 0.1, 0.1, 0.1 setpos id_model, model_x, model_y, model_z gpact id_model gpbox id1, 2.0, 0x3333ff setpos id1, model_x, model_y+box_xy/2, model_z gppbind id1, 1.0, 1.0 ; DAMPING=(振動などの)減衰 gppset id1, GPPSET_DAMPING, 0.8, 1.0 ; X=linear反発(0〜1.0)直線的な ; Y=angular反発(0〜1.0)角々の //#define Q2 0.707 /* 1 : カーソルキー左(←) 2 : カーソルキー上(↑) 4 : カーソルキー右(→) 8 : カーソルキー下(↓) ( ) (←) (↑)(←↑) (→)(←→)(↑→)(←↑→) (↓)(←↓)(↑↓)(←↑↓)(→↓)(←→↓)(↑→↓)(←↑→↓) result 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 vx.0 = 0.0, -1.0, 0.0, -Q2, 1.0, 0.0, Q2, 0.0, 0.0, -Q2, 0.0, 0.0, Q2, 0.0, 1.0, 0.0 vz.0 = 0.0, 0.0, -1.0, -Q2, 0.0, 0.0, -Q2, -1.0, 1.0, Q2, 0.0, 0.0, Q2, 0.0, 0.0, 0.0 */ vx.0 = 0.0, -1.0, 0.0, -0.707, 1.0, 0.0, 0.707, 0.0, 0.0, -0.707, 0.0, 0.0, 0.707, 0.0, 1.0, 0.0 vz.0 = 0.0, 0.0, -1.0, -0.707, 0.0, 0.0, -0.707, -1.0, 1.0, 0.707, 0.0, 0.0, 0.707, 0.0, 0.0, 0.0 // coeff = 0.5 ; 移動単位 *main redraw 0 // stick result, 15 stick key, 15 // index = result & 15 x = vx.key * 0.5;(=coeff) y = 0.0 z = vz.key * 0.5;(=coeff) if key & 16 { ; if result & 16 16 : スペースキー y = 10.0 } gppapply id1, GPPAPPLY_IMPULSE, x,y,z ; 物理設定した [箱モデル] の座標を [珠音モデル] にコピー getpos id1, copy_x, copy_y, copy_z setpos id_model, copy_x, copy_y-box_xy/2+2, copy_z color 255,255,255 pos 50,10 getreq fps, SYSREQ_FPS mes ""+fps pos 50,30 mes "" + key pos 50,50 mes "x = " + x + " y = " + y + " z = " + z gpdraw redraw 1 await 1000/60 goto *main
 「sample/hgimg4」に入れてやっています。
 「stick」命令で変数に取得した数値を使って、[x][z]を配列で代入するのは、考えつきません
でした。こうすれば、命令が「gppapply」一つで済むんですね。

  [珠音モデル]の向きを(←)(→)キーで回転させて、その向きの角度から、三角関数で[x][z]を
求めて、代入すれば、どうにかなりそうな気がしてきました。ダメもとでやってみますので、
解決までの時間を頂きたく思います。



アキアキノヒロロ

リンク

2019/11/13(Wed) 14:09:50|NO.88852

 コンテストで使った方法でやってみました。

#include "hgimg4.as" gpreset setcls CLSMODE_SOLID, $404040 setpos GPOBJ_CAMERA, 0, 20, 30*3 gplookat GPOBJ_CAMERA, 0, 1, 0 gpfloor id_floor, 80.0, 80.0, 0x999999 // setangy id_floor, 0.0, 0.0, 0.1 gppbind id_floor, 0.0, 0.0 model_x=0.0 : model_y=0.0 : model_z=0.0 gpload id_model,"res/tamane2" ; 珠音モデル読み込み setpos id_model, model_x, model_y, model_z setscale id_model, 0.1, 0.1, 0.1 setangr id_model, 0, 256/2, 0 gpact id_model box_xy=2.0 gpbox id1, box_xy, 0x3333ff setpos id1, model_x, model_y+box_xy/2, model_z gppbind id1, 0.3, 0.0 ;「重さを軽く、摩擦係数を小さく」で、動きが軽くなる ; DAMPING=(振動などの)減衰 ; X=linear反発 は、[1.0] で動かなくなり、小さいほど、止まりがわるくなる ; Y=angular反発 は、よくわからない gppset id1, GPPSET_DAMPING, 0.8, 1.0 ; X=linear反発(0〜1.0)直線的な ; Y=angular反発(0〜1.0)角々の prot=1.0 ;旋回値(1旋回単位あたりに 1.0度旋回) prot_cnt=360/2 ;旋回カウント ([360/2] は、操縦モデルの現在の向きの [旋回カウント]) step=0.05 ;移動単位(1移動単位あたりに 0.05移動(前進/後退)) SP=0 ;速度ギア([P=0] [1速=1] [2速=2] [3速=3] [R=-1]) ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 *main // カーソルキーで動かす stick key, 15 ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 if key&1 { ; key&1 = [←]キー【左回転】 prot_cnt++ : if prot_cnt=360/prot : prot_cnt=0 } if key&4 { ; key&4 = [←]キー【右回転】 prot_cnt-- : if prot_cnt=-360/prot : prot_cnt=0 } rot=prot*prot_cnt setang id_model, 0.0, deg2rad(rot), 0.0 ; deg2rad(rot) = 度をラジアンに変換 ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 // step=0.05 ; 移動単位 SP=0 ; 速度ギア=SP(-1〜3) px = sin(deg2rad(rot)) * (step*SP) pz = cos(deg2rad(rot)) * (step*SP) if key=2 | key=8 { if key&2 : SP=3 ;【前進】速い ; key&2 = [↑]キー if key&8 : SP=-1 ;【後退】遅い ; key&8 = [↓]キー px = sin(deg2rad(rot)) * (step*SP) pz = cos(deg2rad(rot)) * (step*SP) ; IMPULSE = 衝動, 衝撃 = 瞬間的な衝撃を与える gppapply id1, GPPAPPLY_IMPULSE, px,0.0,pz } if key=16 { ; 16 : スペースキー y = 10.0 gppapply id1, GPPAPPLY_IMPULSE, px,y,pz } ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 ; 物理設定した [箱モデル] の座標を [珠音モデル] にコピー getpos id1, copy_x, copy_y, copy_z setpos id_model, copy_x, copy_y-box_xy/2+1, copy_z redraw 0 color 255,255,255 pos 50,10 getreq fps, SYSREQ_FPS mes ""+fps pos 50,30 mes "" + key pos 50,50 mes "x = " + copy_x + " y = " + copy_y + " z = " + copy_z gpdraw redraw 1 await 1000/60 goto *main
 なんとか形になりましたが、まだ、向きを変えながら進んだりは出来ていません。
 もう少し頑張ってみますが、お力添え頂けるとありがたいです。



アキアキノヒロロ

リンク

2019/11/13(Wed) 14:45:43|NO.88853

 すいません。
「 if key=2 | key=8 { 」のところを「 if key&2 { 」と「 if key&8 { 」の二つに分けて

if key&2 { SP=3 ;【前進】速い ; key&2 = [↑]キー px = sin(deg2rad(rot)) * (step*SP) pz = cos(deg2rad(rot)) * (step*SP) gppapply id1, GPPAPPLY_IMPULSE, px,0.0,pz } if key&8 { SP=-1 ;【後退】遅い ; key&8 = [↓]キー px = sin(deg2rad(rot)) * (step*SP) pz = cos(deg2rad(rot)) * (step*SP) gppapply id1, GPPAPPLY_IMPULSE, px,0.0,pz }
とすれば、向きを変えながら前進・後退ができました。

 これはこれでいいのですが、「物理設定を利用した動きの制御方法」で、他にもこういう
のがある、とかいうのがありましたら、お願いしたいです。



アキアキノヒロロ

リンク

2019/11/14(Thu) 06:20:30|NO.88861

 2017年 りんごふろ~ずん さんの「プロ生ちゃん、ハンマー!」、ずっと気になっていました。

 「技術的にはhgimg4の現状の機能をなるべく使い倒して」と、おっしゃっていましたが、
何かしら、その基本にしている方法が掴めてきたような気がしてきました。

 前のスレに載せたスクリプトに手を入れて、坂を上り下り。「プロ生ちゃん、ハンマー!」に
どことなく近づいたような.......... 。
 「sample/hgimg4」に入れてやっています。

#include "hgimg4.as" gpreset setcls CLSMODE_SOLID, $404040 setpos GPOBJ_CAMERA, -20, 30, 50 gplookat GPOBJ_CAMERA, 0, 1, 0 gpfloor id_floor1, 30.0, 90.0, 0x999999 setpos id_floor1, -44.5, -4.5, 0.0 setangy id_floor1, 0.0, 0.0, 0.3 ; 下り坂 gppbind id_floor1, 0.0, 0.5 ; 物理設定 gpfloor id_floor2, 60.5, 90.0, 0xaaaaaa ; 水平地 setpos id_floor2, 0.0, 0.0, 0.0 gppbind id_floor2, 0.0, 0.5 ; 物理設定 gpfloor id_floor3, 60.0, 90.0, 0x800000 setpos id_floor3, 51.0, 21.5, 0.0 setangy id_floor3, 0.0, 0.0, 0.8 ; 上り坂 gppbind id_floor3, 0.0, 0.5 ; 物理設定 gptexmat id_texmat, "res/qbox.png" gpbox id_box0, 2.0, -1, id_texmat ; 大箱/固定ノード setpos id_box0, 5, 1.0, 0 gppbind id_box0, 0.0, 0.5 ; 物理設定 gptexmat id_texmat, "res/qbox.png" gpbox id_box, 0.5, -1, id_texmat ; 小箱ノード setpos id_box, 5, 20, 0 gppbind id_box, 1, 0.5 ; 物理設定 model_x=0.0 : model_y=0.0 : model_z=0.0 gpload id_model,"res/tamane2" ; 珠音モデル読み込み setpos id_model, model_x, model_y, model_z setscale id_model, 0.01, 0.01, 0.01 gpact id_model box_xy=1.5 gpbox id1, box_xy, 0x3333ff setpos id1, model_x, model_y+box_xy/2, model_z gppbind id1, 1.0, 0.5 ;「重さを軽く、摩擦係数を小さく」で、動きが軽くなる setalpha id1, 128 ; DAMPING=(振動などの)減衰 ; X=linear反発 は、[1.0] で動かなくなり、小さいほど、止まりがわるくなる ; Y=angular反発 は、よくわからない gppset id1, GPPSET_DAMPING, 0.4, 1.0 ; X=linear反発(0〜1.0)直線的な ; Y=angular反発(0〜1.0)角々の prot=1.0 ;旋回値(1旋回単位あたりに 1.0度旋回) prot_cnt=360/4 ;旋回カウント ([360/2] は、操縦モデルの現在の向きの [旋回カウント]) step=0.05 ;移動単位(1移動単位あたりに 0.05移動(前進/後退)) SP=0 ;速度ギア([P=0] [1速=1] 〜 [6速=6] [R=-1]) ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 *main main_cnt++ // カーソルキーで動かす stick key, 15 ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 if key&1 { ; key&1 = [←]キー【左回転】 prot_cnt++ : if prot_cnt=360/prot : prot_cnt=0 // eventno= 3 ; 〓向き直る〓 "walk"クリップ ここにモデルのイベントを指定 } if key&4 { ; key&4 = [←]キー【右回転】 prot_cnt-- : if prot_cnt=-360/prot : prot_cnt=0 // eventno= 3 ; 〓向き直る〓 "walk"クリップ ここにモデルのイベントを指定 } rot=prot*prot_cnt setang id_model, 0.0, deg2rad(rot), 0.0 ; deg2rad(rot) = 度をラジアンに変換 ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 // step=0.05 ; 移動単位 SP=0 ; 速度ギア=SP(-1〜6) px = sin(deg2rad(rot)) * (step*SP) pz = cos(deg2rad(rot)) * (step*SP) if key&2 { SP=3 ;【前進】中速 ; key&2 = [↑]キー if copy_y>1 : SP=6 ; 高速(登坂兼用) px = sin(deg2rad(rot)) * (step*SP) pz = cos(deg2rad(rot)) * (step*SP) gppapply id1, GPPAPPLY_IMPULSE, px,0.0,pz // eventno= 1 ; 〓走行〓 "run"クリップ を [ BLEND=100 / SPEED(移動量)=(px,pz) ] で 再生 // エフェクト } if key&8 { SP=-1 ;【後退】遅い ; key&8 = [↓]キー px = sin(deg2rad(rot)) * (step*SP) pz = cos(deg2rad(rot)) * (step*SP) gppapply id1, GPPAPPLY_IMPULSE, px,0.0,pz // eventno= 2 ; 〓後ずさり〓 "run"クリップ を [ BLEND=100 / SPEED(移動量)=(-px/5,-pz/5) ] で 再生 // エフェクト } if key&16 { ; 16 : スペースキー y = 5.0 gppapply id1, GPPAPPLY_IMPULSE, px,y,pz // eventno= 3 ; 〓飛び上がる〓 "walk"クリップ ここにモデルのイベントを指定 // エフェクト/ギミック } gpact id_model,,2 if key>=1 : gpact id_model,"",1 ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 ; 物理設定した [箱モデル] の座標を [珠音モデル] にコピー getpos id1, copy_x, copy_y, copy_z setpos id_model, copy_x, copy_y-box_xy/2, copy_z if main_cnt>60*3 : setpos GPOBJ_CAMERA, copy_x, copy_y+5, copy_z+15 if copy_y<0 : setpos GPOBJ_CAMERA, copy_x, 5, copy_z+15 gplookat GPOBJ_CAMERA, copy_x, copy_y, copy_z redraw 0 gpdraw color 255,255,255 pos 50,10 getreq fps, SYSREQ_FPS mes ""+fps pos 50,30 mes "" + key pos 50,50 mes "x = " + copy_x + " y = " + copy_y + " z = " + copy_z redraw 1 await 1000/60 goto *main
 坂を上ったり、滑り降りたり、大箱の上に乗ったり、上の小箱を落としたり、してみて下さい。

 引き続き、「物理設定を利用した動きの制御方法」お願いします。



砂時 計

リンク

2019/11/14(Thu) 22:00:02|NO.88864

回転をトルクインパルスで(赤い箱)
回転を回転速度のセットで(緑の箱)
移動をリニア速度のセットで(青の箱)
行うサンプルの追加です。

また一番右の青い箱は、リニア減衰ではなく摩擦で止まるようにしてみました。


#include "hgimg4.as" gpreset setcls CLSMODE_SOLID, $404040 setpos GPOBJ_CAMERA, 0, 20, 30 gplookat GPOBJ_CAMERA, 0, 1, 0 gpfloor id_floor1, 20.0, 20.0, 0xffffff setpos id_floor1, -20.0, 0.0, 0.0 gppbind id_floor1, 0.0, 0.0 gpfloor id_floor2, 20.0, 20.0, 0xcccccc gppbind id_floor2, 0.0, 0.0 gpfloor id_floor3, 20.0, 20.0, 0x999999 setpos id_floor3, 20.0, 0.0, 0.0 gppbind id_floor3, 0.0, 0.1 // 摩擦 0.1 // トルクインパルス gpbox id1, 2.0, 0xff0000 setpos id1, -20.0, 8.0, 0.0 gppbind id1, 1.0, 0.0 prmid = GPPSET_DAMPING gppset id1, prmid, 0.0, 0.2 prmid = GPPSET_GRAVITY gppset id1, prmid, 0.0, 0.0, 0.0 prmid = GPPAPPLY_TORQUE_IMPULSE gppapply id1, prmid, 0.0, 2.0, 0.0 // 回転速度 gpbox id2, 2.0, 0x00cc00 setpos id2, 0.0, 1.0, 3.0 gppbind id2, 1.0, 0.0 prmid = GPPSET_DAMPING gppset id2, prmid, 0.0, 0.0 prmid = GPPSET_ANGULAR_VELOCITY gppset id2, prmid, 0.0, 1.0, 0.0 // 移動速度 gpbox id3, 2.0, 0x3333ff setpos id3, 20.0, 1.0, -3.0 gppbind id3, 1.0, 1.0 // 摩擦 1.0 prmid = GPPSET_DAMPING gppset id3, prmid, 0.0, 0.0 prmid = GPPSET_LINEAR_VELOCITY gppset id3, prmid, 0.0, 0.0, 4.0 *main redraw 0 pos 8,8 getreq fps, SYSREQ_FPS mes strf("%6d [fps]", fps) gpdraw redraw 1 await 1000/60 goto *main



アキアキノヒロロ

リンク

2019/11/15(Fri) 14:33:38|NO.88870

 毎回、サンプルを作っていただき、ありがとうございます。
今回もまた、失礼ながら、分かりやすくコメントを入れながら、書換えと実験をやってみました。

#include "hgimg4.as" *top clrobj pos 0,0 : button goto "again",*top gpreset setcls CLSMODE_SOLID, $404040 setpos GPOBJ_CAMERA, 0, 20, 50 gplookat GPOBJ_CAMERA, 0, 1, 0 // トルクインパルス;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 gpfloor id_floor1, 20.0, 20.0, 0xffffff setpos id_floor1, -20.0, 0.0, 0.0 gppbind id_floor1, 0.0, 0.0 // 摩擦 0.0 ;===================================================================== gpbox id1, 2.0, 0xff0000 setpos id1, -20.0, 8.0, 0.0 gppbind id1, 1.0, 0.0 // 摩擦 0.0 prmid = GPPSET_DAMPING ; 減衰 X=linear反発(0〜1.0), Y=angular反発(0〜1.0) gppset id1, prmid, 0.0, 0.0 prmid = GPPSET_GRAVITY ; X,Y,Z=重力 gppset id1, prmid, 0.0, 0.0, 0.0 ; X軸方向, Y軸方向, Z軸方向 prmid = GPPAPPLY_TORQUE_IMPULSE ; トルク(ねじる)力+衝撃を与える gppapply id1, prmid, 0.0, 2.0, 0.0 ; X軸回転, Y軸回転, Z軸回転 // 回転速度;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 gpfloor id_floor2, 20.0, 20.0, 0xcccccc setpos id_floor2, 0.0, 0.0, 0.0 gppbind id_floor2, 0.0, 0.0 // 摩擦 0.0 ;===================================================================== gpbox id2, 2.0, 0x00cc00 setpos id2, 0.0, 8.0, 3.0 gppbind id2, 1.0, 0.0 // 摩擦 0.0 prmid = GPPSET_DAMPING ; 減衰 X=linear反発(0〜1.0), Y=angular反発(0〜1.0) gppset id2, prmid, 0.0, 0.0 prmid = GPPSET_ANGULAR_VELOCITY ; X,Y,Z=アンギュラー(回転)ベロシティー(速度) gppset id2, prmid, 0.0, 1.0, 1.0 ; X軸角度から見る回転速度, Y軸角度から見る回転速度, Z軸角度から見る回転速度 // 移動速度;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 gpfloor id_floor3, 20.0, 20.0, 0x999999 setpos id_floor3, 20.0, 0.0, 0.0 gppbind id_floor3, 0.0, 0.0 // 摩擦 0.1 ;===================================================================== gpbox id3, 2.0, 0x3333ff setpos id3, 20.0, 1.0, -3.0 gppbind id3, 1.0, 0.0 // 摩擦 1.0 prmid = GPPSET_DAMPING ; 減衰 X=linear反発(0〜1.0), Y=angular反発(0〜1.0) gppset id3, prmid, 0.0, 0.0 prmid = GPPSET_LINEAR_VELOCITY ; X,Y,Z=リニア(直線)ベロシティー(速度) gppset id3, prmid, 0.0, 10.0, 4.0 ; X軸方向, Y軸方向, Z軸方向 ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 main_cnt=0 *main main_cnt++ if main_cnt=100 { prmid = GPPSET_GRAVITY ; X,Y,Z=引力 gppset id1, prmid, 0.0, -1.0, 0.0 ; X軸方向, Y軸方向, Z軸方向 } if main_cnt=200 { prmid = GPPSET_GRAVITY ; X,Y,Z=引力 gppset id1, prmid, 0.0, 0.0, 0.0 ; X軸方向, Y軸方向, Z軸方向 } if main_cnt=300 { prmid = GPPSET_GRAVITY ; X,Y,Z=引力 gppset id1, prmid, 0.0, 1.0, 0.0 ; X軸方向, Y軸方向, Z軸方向 } redraw 0 gpdraw color 255, 255, 255 : pos 10,50 getreq fps, SYSREQ_FPS mes strf("%6d [fps]", fps) mes ""+main_cnt redraw 1 await 1000/60 goto *main
 これで、命令の意味等わかったこと。

// [gppbind id, x, y]のY(摩擦)
=接する物体の片方でも 0 ならば、加えられた力の設定のまま

// [gppset DAMPING]...........(減衰)
=(加えられた)指定の種類の( Xなら直線的な / Yなら非直線的な )力が
指定の大きさで 減衰していく

// [gppset GRAVITY]...........(重力というより 引力(≠only下方向))
=..(引)力が 指定軸方向/指定の大きさで..働く

// [gppset ANGULAR_VELOCITY] (角運動速度=回転ベロシティー(速度))
=(回転)力が 指定軸中芯/指定速度で......働く

// [gppset LINEAR_VELOCITY] (リニア(直線)ベロシティー(速度))
=......力が 指定軸方向/指定速度で......働く
(注) *** [gppbind] の時点で重力が設定されていることに 留意 ***
[GRAVITY](引力)は..............重力に関わらず 常に働く
([GRAVITY]の [0,0,0]は 重力を無効にするが、時間がかかる)
(ただし、[0,0,0]以外の設定の場合は すぐ反映される)

[LINEAR_VELOCITY](直線速度)は..重力の支配内で 働く

// [gppapply TORQUE_IMPULSE](ねじる力で衝撃)
=指定軸回転のねじりの..衝撃

// [gppset] は main_loop の前設定のような印象をうけるが、main_loop内でも 設定可

// [gppapply] は main_loop の前で設定した場合は、main_loopに 入った最初の時点で 一度働くのみ
(ただし、main_loop内での設定では、もちろんその loop の度に働く)

 こう書き出すと、当り前のことだと言われそうですが、覚え書きと思ってお許し下さい。
ほかの命令についても、あたっていきたいと思います。



アキアキノヒロロ

リンク

2019/11/21(Thu) 16:33:20|NO.88894

 試すために、その都度スクリプトを書き換えるのが、面倒なので、割と楽に、
設定数値や命令の組合せ方を変更して、色々実行できるソフトを作ってみました。

 Gppbind_Gppset_Gppapply.zip
 https://drive.google.com/open?id=143iLyXYKWdTntynW2Q-MI87gwe2y09bh

 これで、今まで気付かないでいたことも、少しは分かってきそうな気がして
います。試してみて下さい。添付の解説「Read_Me.txt」をお読み下さい。

 また下記のスクリプト(これも「zip」に同梱)を実行してみてわかったことですが、
物理設定したモデルの角度を別モデルにコピーする場合、角度設定は
  [setangz](回転する順番 = Z→Y→X)  になるようです。

#include "hgimg4.as" gpreset setcls CLSMODE_SOLID, $404040 setpos GPOBJ_CAMERA, 0, 5, 10 gplookat GPOBJ_CAMERA, 0, 3, 0 gpfloor id_floor2, 20.0, 20.0, 0xcccccc gppbind id_floor2, 0.0, 0.0 // 回転速度 gptexmat id_texmat, "res/qbox.png" ; 大[?箱]モデル読み込み(半透明) gpbox id1, 2.0, -1, id_texmat setpos id1, 0.0, 1.0+5.0, 0.0 gppbind id1, 1.0, 0.0 setalpha id1, 96 gptexmat id_texmat, "res/qbox.png" ; 小[?箱]モデル読み込み gpbox id2, 1.5, -1, id_texmat setpos id2, 0.0, 1.0+5.0, 0.0 prmid = GPPSET_DAMPING gppset id1, prmid, 0.0, 0.0 prmid = GPPSET_ANGULAR_VELOCITY gppset id1, prmid, 3.0, 4.0, 5.0 *main redraw 0 gpdraw pos 8,8 getreq fps, SYSREQ_FPS mes strf("%6d [fps]", fps) ;==================================================================== ; 物理設定した [大[?箱]モデル] の座標/角度を [小[?箱]モデル] にコピー getpos id1, copy_x, copy_y, copy_z setpos id2, copy_x, copy_y, copy_z ; 角度設定は [setangz](回転する順番 = Z→Y→X) getang id1, copy_angx, copy_angy, copy_angz setangz id2, copy_angx, copy_angy, copy_angz ; ( setang = X→Y→Z / setangy = Y→X→Z / setangz = Z→Y→X ) ;==================================================================== redraw 1 await 1000/60 goto *main
 以前と同様、「HSP バージョン 3.6β1」「sample/hgimg4」に入れてやっています。



アキアキノヒロロ

リンク

2019/11/21(Thu) 16:47:49|NO.88895

 追記です。
 「gppset」命令のヘルプ「GPPSET_KINEMATIC」の項には、
   X=Kinematic設定のON/OFF(0=無効)
とあります。「Kinematic」は、「運動学的」という意味だそうですが、
どうも試した感じでは、(1=無効)/(0=有効)のように思えるのですが、
どうなんでしょうか。



アキアキノヒロロ

リンク

2019/11/25(Mon) 21:26:52|NO.88926

 以前、別に立てたスレ「物理設定を行なうgpbモデルについて」でも申しましたが、
他の方もおっしゃっているように、「gpbモデル」は物理挙動の不自然さが目につきます。

 何故なのか、色々試してみたところ、「gpbモデル」に「gppbind」設定する時点の、
その「gpbモデル」の位置設定の違いが原因のように思えてきました。
 分かりやすくするため、「球体モデル」でやっています。「gpbモデルノードの場合は
モデル全体を包み込むバウンディング球が使用」される訳ですから、「球体モデル」なら、
基本的な動きをそのまま見られるだろう、と思ったことも、その理由です。
 で、以下、その実験に使ったスクリプトです。

「gpbモデル(ボール)」物理挙動テスト.zip
 https://drive.google.com/file/d/1cjwGmk-oi6GKJL4CajYLSobqGTX5EhZ0/view?usp=sharing

#include "hgimg4.as" setcls CLSMODE_SOLID, $808080 ; 画面クリア設定 c_x=-13.0 : c_y=3.0 : c_z=25.0 ; カメラ位置 *set_top clrobj pos 0,0 objsize 100,35 button goto "set_top",*set_top button gosub "VELOCITY",*VELOCITY button gosub "IMPULSE",*IMPULSE gpreset setpos GPOBJ_CAMERA, c_x, c_y, c_z ; カメラ位置を設定 gplookat GPOBJ_CAMERA, -5, 8, 0 ; カメラから指定した座標を見る gpfloor id_floor, 40,40, $404040 ; 床ノードを追加 gppbind id_floor, 0 ; 床の物理設定を行なう ;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ;[大箱] gptexmat id_texmat, "res/qbox.png" gpbox id_box0, 2.0, -1, id_texmat ; 大箱/固定ノード setpos id_box0, -5.0, 1.0, -0.0 gppbind id_box0, 0.0, 0.5 ; 物理設定 ;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ;[ボール] plus_x(0)=0.0 : plus_y(0)=0.0 : plus_z(0)=0.0 plus_x(1)=10.0 : plus_y(1)=5.0 : plus_z(1)=0.0 ;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ repeat 2 gpload id_model(cnt),"res/sky/sky_ball" ; モデル読み込み setscale id_model(cnt), 0.1, 0.1, 0.1 setpos id_model(cnt), 0.0+plus_x(cnt), 0.0001+plus_y(cnt), 0.0+plus_z(cnt) gppbind id_model(cnt), 1.0, 0.5 ; モデルの物理設定を行なう loop ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 repeat stick key,15 if key&128 : end ; カーソルキーでカメラ位置を動かす if key&1 : c_x=c_x-0.2 : setpos GPOBJ_CAMERA, c_x, c_y, c_z if key&4 : c_x=c_x+0.2 : setpos GPOBJ_CAMERA, c_x, c_y, c_z if key&8 : c_z=c_z+0.2 : setpos GPOBJ_CAMERA, c_x, c_y, c_z if key&2 : c_z=c_z-0.2 : setpos GPOBJ_CAMERA, c_x, c_y, c_z redraw 0 ; 描画開始 gpdraw ; シーンの描画 redraw 1 ; 描画終了 await 1000/60 ; 待ち時間 loop ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 ;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ *VELOCITY repeat 2 gppset id_model(cnt), GPPSET_ANGULAR_VELOCITY, 0, 0, 15.0 gppset id_model(cnt), GPPSET_LINEAR_VELOCITY, -1.0, 0, 0 loop return ;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ *IMPULSE repeat 2 gppapply id_model(cnt), GPPAPPLY_IMPULSE, 0.0, 10.0, 0.0 loop return ;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 [set_top]ボタンで、初期設定で再開。
 [VELOCITY] / [IMPULSE]ボタンで、位置設定の違う2つの「球体モデル」に対して、
同じ [VELOCITY] / [IMPULSE]の命令を実行。これらのボタンを何度か押して、様子を
見て下さい。
 この様子から、「gpbモデル」に自然な物理挙動を再現させるには、その初期設定の
位置を「0.0, 00, 0.0」にする必要がありそうに思います。ただ、高さを「0.0」とすると、
「床」を突き破って、下に落ちてしまうので、我慢できる範囲で「0.0」に近い数値にする。

 位置の数値を色々変えてやってみて下さい。
 



アキアキノヒロロ

リンク

2019/11/27(Wed) 14:46:43|NO.88929

 いつものように、「hgimg4」のこととなると、なかなか反応がなく、一人相撲状態です。

 不自然な物理挙動になるのは何故なのか。以下、初心者レベルの自分の、当てずっぽうです。

 「gpbモデル」の場合、物理挙動の再現に際して、物理計算の起点を「gpbモデル」の初期位置では
なく、「0.0, 0.0, 0.0」としており、それとの位置関係で物理挙動を計算処理していて、そのズレが
計算のズレになって、不自然な物理挙動になるのでは? ということです。
 理数系でない頭で、ひねり出したこじつけですが。

 前の実験を少し改良してみました。

「gpbモデル(ボール)」物理挙動テスト_No2.zip
 https://drive.google.com/open?id=1uquqlJYfTZM2-Dex-Jg_c49kqVrBEkg7

 ピンク色と水色の直方体、薄紫色と薄水色の球体、緑色?の立方体、これら5つの「gpbモデル」に
「gppbind」で「1.0, 0.5」の同じ物理設定をしています。かつ、2つの直方体には、その位置を逐次
コピーする球体(可視化したバウンディング球を想定)を付加。
(この想定バウンディング球は、[alpha on/off]ボタンで、表示/非表示)
 なお、「床」中央の「黄地に赤X」は、「0.0, 0.0, 0.0」の位置表示です。

 [set_top]ボタンで、初期設定で再開。
 [VELOCITY] / [IMPULSE]ボタンで、位置設定の違うこれらの「gpbモデル」に対して、同じ内容の
[VELOCITY] / [IMPULSE]の命令を実行。

 [only_ball on/off]ボタンは、これら5つの「gpbモデル」に代わって、2つの直方体の初期位置を
初期設定とする2つの「球体モデル」で、再開。この場合では、[VELOCITY] / [IMPULSE]ボタンは、
この2つの「gpbモデル」に対してです。

 「.exe」での実行のほかに、同梱のスクリプトで、「gpbモデル」の初期位置の数値を変えるなど
色々な条件でやってみて下さい。



アキアキノヒロロ

リンク

2019/11/27(Wed) 16:20:09|NO.88930

[only_ball on/off]ボタンの説明、下記のように変更します。すいません。

[only_ball on/off]ボタンは、これら5つの「gpbモデル」に代わって、2つの直方体の初期位置を
初期設定とする2つの「球体モデル」と、もとと同じ「緑色?の立方体」で、再開。この場合では、
[VELOCITY] /[IMPULSE]ボタンは、この3つの「gpbモデル」に対してです。再度クリックした場合、
もとの5つの「gpbモデル」に戻って、再開。



アキアキノヒロロ

リンク

2019/12/8(Sun) 18:10:12|NO.89024

 このスレの「NO.88861」でやってみたスクリプトを元に、サッカーゲームのようなものを
作ってみています。

 ボールはもちろん球状の「gpbモデル」です。「プレーヤーモデル」にコピーする物理挙動
のためのモデルは、初め[箱モデル]にしていましたが、これも球状の「gpbモデル」です。
 一度物理設定したモデルは角度も操作できないので、[箱モデル]では、X軸方向、Z軸方向
以外(=斜め方向)には、ボールを弾けません。無理矢理、[箱モデル]の角度を動かしてみた
ところ、すぐX軸、Z軸方向に向き直ってしまいます。物理設定すると、そのように方向づけ
が固定されるようです。他からの物理的な力が働いて、向きがかわることはあっても、望む角度
の数値を設定することは出来ません。
 で、ボールを色々な方向に蹴ることができるようにと、「球状モデル」に替えました。
ただし、[箱モデル]以外の「gpbモデル」は、以前申したように、その位置設定がやっかいです。
「x=0.0, z=0.0」で、yを「0.0」にできるだけ近い数値にするのがいいようですが、初期の
位置を「x=0.0, z=0.0」にしか出来ないのは、不都合です。かと言って、他の位置にした場合、
「gppapply」で動かしているうちに、だんだん動きがおかしくなってきてしまいます。これを
防ぐため、「球状モデル」に対して「GPPSET_DAMPING」で、反発を減衰させるといいようです。
動きがおかしくなるのは、linear反発ではなく、angular反発のせいのようなので、パラメーターの
「Y=angular反発(0〜1.0)」を「1.0」にして、減衰させます。「X=linear反発(0〜1.0)」は様子を
見て決めてください。
 そして、位置yですが、これは、[箱モデル]の場合がそうであるように、そのモデルの一番下が
「0.0」になるような高さに設定するのがいいようです。[箱モデル]の場合、立方体の一辺の長さ
(=高さ)の1/2にするのと同じです。
 このように「球状モデル」の位置を設定したうえで、その位置を「プレーヤーモデル」にコピー
する。yは、「プレーヤーモデル」に合わせてずらします。あとは、「NO.88861」でのように、
「球状モデル」を「gppapply」で動かす。

 これでどうにか、かたちになりますが、これら以前の問題として、気付いたことがあります。
 物理設定で、物理挙動を再現しようとする場合、スケールはできるだけ小さくしたほうが、
不自然さも目立たなくなり、また不都合なことも起こりづらいようです。何故なのか。物理挙動
の計算結果の誤差がそれだけ、小さくなるからか、などと思っていますが、私にはわかりません。

 以上、あれこれやってみて、気付いたことのいくつかです。



アキアキノヒロロ

リンク

2019/12/12(Thu) 23:50:04|NO.89045

 「hgimg4」は人気がないのか、相変わらず、また、一人相撲状態になってきました。
寂しい。

 コンテストに出したものの手直しと平行して、擬似サッカーゲームめいたものをいじり始め
ています。そこで気付いたことをここにまとめておこうと思います。

● 物理挙動を「gpbモデル」に再現しようとする場合、その「gpbモデル」自体に物理設定
するのではなく、一旦、別に作成した「球状モデル」または「箱モデル」に物理設定し、その
動きをコピーする。

● スケールのできるだけ小さい「球状(箱)モデル」を作成し、それを「x=0.0, z=0.0」に
できるだけ近い位置に、yはその「球状(箱)モデル」の一番下が「0.0」になるような高さに
設定する。
 「gppapply」で動かしているうちに、angular反発のせいで、だんだん動きがおかしくなる
のを防ぐため、「球状(箱)モデル」に対して「GPPSET_DAMPING」で、パラメーターの
「Y=angular反発(0〜1.0)」を「1.0」にして、減衰させるよう設定しておく。

● 「球状(箱)モデル」のスケールは、できるだけ小さくしたほうが、不自然さも目立たず、
また不都合なことも起こりづらいので、それに合わせて、目的の「gpbモデル」のスケールも
小さくし、カメラ位置の調節で、実際の画面上に表示される大きさが望む大きさになるように
する。他のものも、この大きさを基準に決める。完成時には「球状(箱)モデル」を透明化。

● 移動命令は、「gppapply id, GPPAPPLY_IMPULSE, x, y, z」が基本になる。設定する数値
の大きさで移動する力の大きさが決まり、その「x : y : z」の比率で移動方向が決まる。なの
で、比率をうまく設定することで、移動方向を目的の方向に合わせることが出来るはず。逆に、
移動方向の角度から、それぞれの軸方向の数値を決めることも。
 初期の「gppbind」設定で、Y方向には重力が掛かっているので、Y方向移動は、それとの
対比で動く。

● 「gppapply id, GPPAPPLY_IMPULSE, x, y, z」で、目的の位置に移動させるには、一工夫
が必要になる。「setpos」は出来ないものの、動かそうとする「球状(箱)モデル」の位置を
「getpos」で取得し、動かそうとする目的の位置との、位置関係、X座標の差 / Y座標の差 /
Z座標の差 を求めながら、その差が「0」になるまで、「GPPAPPLY_IMPULSE」で移動させ、
行き過ぎたら、マイナス移動させるようにすればいい。この時の「各座標の差の割合(比率)」
が、そのまま、その進行方向になるはず。こうすれば、ある程度は、目的の位置に移動させら
れる。

● 「gppapply」の他の命令も使えないことはないが、キャラクタの移動操作には、あまり
向かない。キャラクタではないオブジェクトに働く力として使うほうが自然。キャラクタ
が、ある物体に対して力を加える場合など。ただ、飛行機のようなものの操作には、可能か。

● 「gppset」命令は、「gppapply」命令する場合の条件付けといった働きになるものと、
常に一定の動きをさせるようなものとがある。「GPPSET_DAMPING」のように、前もって設定
しておく場合だけでなく、[main_loop]内での「gppapply」命令と組合せて、同時に使うこと
も考えられる。

● 操作対象としてのキャラクタでなく、それ以外の物理設定したものを自動的に動かすには、
「if」条件に、両者の位置関係を使ったり、[main_loop]のカウント数をとったり、何らかの
アクションをタイミングとしたりして、「gppapply」命令を発するようにすればいい。また、
「GPPSET_KINEMATIC」で一時的に物理挙動を「ON/OFF」するなど。
 ただし、「GPPSET_KINEMATIC」設定の意味は、物理挙動を無効にするスイッチ(ストップ)
を入れるのが「ON」(= 1 )であり、物理挙動を無効にするスイッチを切るのが「OFF」(= 0 )
になっているようで、間違えやすい。また、「GPPSET_ENABLE」は「GPPSET_KINEMATIC」との
関係や、その「ON/OFF」の意味が定かでない。

● 物理設定したものの位置は、取得できても設定はできないので、「rnd」とはまた違った
意味で、予測できない動きになる。

 これら、気付いたことをもとに、「hgimg4」のサッカーゲームを作っていますが、相手の
動きが読めず、ボールを奪われたり、じゃまされたりもする、それなりのゲームにはなって
きています。作っている本人の腕がないのか、なかなかシュートが決まりません。

 こんなふうに命令を使えば、こんな場面のこんなことに使えるんじゃないか、というような
アイデア、ないでしょうか。
 他人のふんどしで相撲をとるようで心苦しいですが、それよりも、一人相撲が厳しいです。



アキアキノヒロロ

リンク

2019/12/17(Tue) 17:59:02|NO.89074

 ゲーム作りを進めていて気付いたことです。「getangr」のヘルプで

「角度の単位は整数で0〜255で一周する値を使用します。」

とありますが、実際にこの命令で取得してみると、「-63〜64」、「128 / 0 / -128」で、変動する数値になります。
 Y軸回転するモデルを例にしたスクリプトを載せます。例のごとく「sample/hgimg4」に入れてやっています。

#include "hgimg4.as" gpreset setcls CLSMODE_SOLID, $404040 gpload id,"res/tamane2" ; モデル読み込み setscale id, 0.05, 0.05, 0.05 setpos id, 0.0, 0.0, 0.0 gpfloor id_floor, 30, 30, $00ffff ; 床ノードを追加 setpos GPOBJ_CAMERA, 0, 5, 30 ; カメラ位置を設定 repeat addangr id, 0, 1, 0 ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 getangr id, angr_x, angr_y, angr_z if angr_x=0 : y=angr_y+64 if angr_x=128 | angr_x=-128 : y=192-angr_y angr255_y = y - 64 : if angr255_y < 0 : angr255_y = 192 + y ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 gplookat GPOBJ_CAMERA, 0,5,0 ; カメラから指定した座標を見る redraw 0 ; 描画開始 gpdraw ; シーンの描画 font "",30 pos 20,10 color 255,255,255 mes "getangr id, (angr_x), (angr_y), (angr_z)" color 255,255,0 mes "[ angr ] = "+ angr_x +" / "+ angr_y +" / "+ angr_z ; [id_modelの角度] mes "" color 255,255,255 mes "if (angr_x) = 0 : y = (angr_y) + 64" mes "if (angr_x) = 128 | (angr_x) = -128 : y = 192 - (angr_y)" mes "(angr255_y) = y - 64 : if (angr255_y) < 0 : (angr255_y) = 192 + y" color 255,255,0 mes "[ angr255_y ] = "+angr255_y redraw 1 ; 描画終了 await 1000/60 *3 ; 待ち時間 loop
 これで見ると、Y軸回転は、正面向き =「0」、右真横 =「64」、真後ろ向き =「0」、左真横 =「-64」というように
増減しています。
 X軸回転、Z軸回転の数値が、ともに「0」の時は、前方向に向いていて、Y軸が「-63〜64」の間で変化することで、
向きがずれていきます。X軸、Z軸回転の数値が、ともに「128」か「-128」の時は、後ろ方向に向いていて、
Y軸が「-63〜64」の間で変化することで、向きがずれていきます。
 決して、Y軸のみが「0〜255」で動いている訳ではないようです。ただし、このような数値変動は、取得時に現れる
もので、「setangr」の設定時は、Y軸の「0〜255」の数値設定でもいいし、X軸、Z軸の「128 / 0 / -128」と組合せた
Y軸の「-63〜64」の数値設定でもいいようです。
 なので、設定時は問題ないのですが、取得時には、一つの軸だけでなく、他の軸にも目配りし、取得した数値を
「0〜255」の数値に変換するなど、注意が必要です。

 物理設定とは、直接関係するものではないですし、また、とっくに知られていることかも知れません。
しかし、物理設定を利用した動きの制御をあれこれ考えていて、角度(回転)の制御でこの問題に引っかかったので、
付け加えさせて頂きます。



アキアキノヒロロ

リンク

2020/1/7(Tue) 12:22:26|NO.89194

 相変わらず、「物理設定を利用した動きの制御方法」のまわりをウロウロしています。

 「NO.89024/89045」で触れたサッカーゲームについてです。「プレーヤーモデル」にコピー
する物理挙動のためのモデルを、球状の「gpbモデル」にし、その物理挙動の反発の不自然さを
「GPPSET_DAMPING」で減衰させる、と言った方法を取っていました。しかし、「gpbモデル」
では、激しい動きを続けているうちに、やはり不自然さが目についてきてしまいます。そこで、
ぶつかって起きるはずの、本来の物理挙動をやめました。

 どういうことかと言うと、本来は、この球状「gpbモデル」とサッカーボール(球状gpbモデル)が、
ぶつかって物理挙動を起こし、実際にボールを蹴る、ということになるはずの訳ですが、その
ぶつかる直前のタイミングで、「プレーヤーモデル」の向いている方向に動くように、サッカー
ボール(球状gpbモデル)に対して「gppapply id, GPPAPPLY_IMPULSE, x, y, z」を働かせるのです。
こうすれば、コピー元としての物理挙動のためのモデルを、球状の「gpbモデル」とする必要が
なくなり、「箱モデル」を使うことが出来ます。「箱モデル」なら、不自然さは心配しなくて
すみます。そして、「箱モデル」自体の向きが設定できなくとも、サッカーボールの蹴る方向に
問題ない訳です。ただし、サッカーボール自体は、球状「gpbモデル」なので、初期の設定位置は
「x=0.0, z=0.0」とします。このボールの扱いには、相変わらず悩まされていますが。特に、
ゴール決定後の再設定です。

 これらに関してだけでなく、何か「物理設定を利用した動きの制御方法」一般について、広く
アイデアを頂けると、ありがたいです。

 なお、別スレ「「hgimg4.as」の画面の大きさを変える方法」で、この「サッカーゲーム」を
紹介させて頂きましたので、試していただけるとうれしいです。‥‥‥「NO.89130」


 4modeSoccerGame.zip
 https://drive.google.com/open?id=1kXzvIlYU6vUPwLo36zMEYYkWu7G6zFBB



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