|
|
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
|
|