|
|
|
2022/5/31(Tue) 05:58:37|NO.96519
hgimg4にて、タイトルの通りオブジェクトが別のオブジェクトにゆっくり旋回する挙動を作りたいのですが、
自力ではうまく出来ませんでしたので、ご教授願いたく存じます。
イメージ的には、砲台が回転しプレイヤーキャラを狙う敵キャラのようなものです。
#include "hgimg4dx.as"
title "HGIMG4 Test"
gpreset
setcls CLSMODE_SOLID, 0
setpos GPOBJ_CAMERA, 0, 100.0, 70.0
setang GPOBJ_CAMERA, -1.0, 0.0, 0.0
gpload id_tamane_A, "res\\tamane"
setscale id_tamane_A, 0.05, 0.05, 0.05
gpload id_tamane_B, "res\\tamane"
setscale id_tamane_B, 0.05, 0.05, 0.05
setpos id_tamane_B, 20.0, 0, 20.0
gpfloor ID_floor, 100.0, 100.0, $555555
repeat
//tamane_Bの移動
stick key, 1 + 2 + 4 + 8
if key&1 : addpos id_tamane_B, -0.2, 0
if key&4 : addpos id_tamane_B, 0.2, 0
if key&8 : addpos id_tamane_B, 0, 0 , 0.2
if key&2 : addpos id_tamane_B, 0, 0 , -0.2
//tamane_Aがtamane_Bを向く
getpos id_tamane_B, x, y, z
gplookat id_tamane_A, -x, 0.0, -z
redraw 0
gpdraw
redraw 1
await 1000/60
loop
たまねA(中心に位置)がたまねB(十字キーで移動できる)を向くという上記プログラムを作成しましたが、
これでは瞬間的に向いてしまうので、作りたい「ゆっくり向く」挙動とは異なります。
2つのオブジェクトのy位置(高さ)は等しく、回転軸もy軸のみの挙動です。
回転させたいオブジェクトの現在の向きと、向きたいオブジェクトへの向きとの角度を計算して、その角度から右に向くか左に向くか判別すればいいのかな、と
考えましたが、プログラムに落とし込むのがうまく出来なかったのでよろしければ教えていただきたく存じます。
| |
|
2022/5/31(Tue) 19:42:51|NO.96527
水平の方角のみでよいとのことでしたので以下のような方法はいかがでしょうか。
両方とも珠音だと不思議な感じだったので
狙われる側はスペースシップモデルに変更してあります。
#include "hgimg4dx.as"
title "HGIMG4 Test"
gpreset
setcls CLSMODE_SOLID, 0
setpos GPOBJ_CAMERA, 0, 100.0, 70.0
setang GPOBJ_CAMERA, -1.0, 0.0, 0.0
gpload id_tamane_A, "res\\tamane"
setscale id_tamane_A, 0.05, 0.05, 0.05
gpload id_tamane_B, "res\\sphaceship"
//setscale id_tamane_B, 0.05, 0.05, 0.05
setpos id_tamane_B, 20.0, 0.0, 20.0
gpfloor ID_floor, 100.0, 100.0, $555555
// 1回に回転する最大角(rad)
max_rot_speed = M_PI * 0.5 / 180.0
// 方角向き
cur_ey = 0.0
ddim v, 4
repeat
//tamane_Bの移動
stick key, 1 + 2 + 4 + 8
if key&1 : addpos id_tamane_B, -0.2, 0
if key&4 : addpos id_tamane_B, 0.2, 0
if key&8 : addpos id_tamane_B, 0, 0 , 0.2
if key&2 : addpos id_tamane_B, 0, 0 , -0.2
//tamane_Aがtamane_Bを向く
getpos id_tamane_B, x, y, z
getpos id_tamane_A, px, py, pz
v.0 = px
v.1 = py
v.2 = pz
fvface v, x, y, z
// -v.1 が方角回転量。-π〜+πの値を取る
// tamane はZ軸+がモデル正面なので +πする
target_ey = - v.1 + M_PI
diff = target_ey - cur_ey
if diff >= M_PI {
target_ey -= M_PI * 2.0
} else {
if diff < - M_PI {
target_ey += M_PI * 2.0
}
}
diff = target_ey - cur_ey
if diff < 0.0 {
sign = -1.0
} else {
sign = 1.0
}
ay = limitf(absf(diff), 0.0, max_rot_speed)
cur_ey += sign * ay
// mod 2π で 0〜2πの範囲へ修正する
if cur_ey < 0.0 {
cur_ey += M_PI * 2.0
}
if cur_ey >= M_PI * 2.0 {
cur_ey -= M_PI * 2.0
}
// 方向をセットする
setangy id_tamane_A, 0.0, cur_ey, 0.0
// setangy id_tamane_A, - v.0, cur_ey, 0.0
redraw 0
gpdraw
redraw 1
await 1000/60
loop
| |
|
2022/6/1(Wed) 21:58:31|NO.96534
atanを使うと、こんな感じですね
#include "hgimg4dx.as"
title "HGIMG4 Test"
gpreset
setcls CLSMODE_SOLID, 0
setpos GPOBJ_CAMERA, 0, 100.0, 70.0
setang GPOBJ_CAMERA, -1.0, 0.0, 0.0
gpload id_tamane_A, "res\\tamane"
setscale id_tamane_A, 0.05, 0.05, 0.05
gpload id_tamane_B, "res\\tamane"
setscale id_tamane_B, 0.05, 0.05, 0.05
setpos id_tamane_B, 20.0, 0, 20.0
gpfloor ID_floor, 100.0, 100.0, $555555
a=0.0
repeat
//tamane_Bの移動
stick key, 1 + 2 + 4 + 8
if key&1 : addpos id_tamane_B, -0.2, 0
if key&4 : addpos id_tamane_B, 0.2, 0
if key&8 : addpos id_tamane_B, 0, 0 , 0.2
if key&2 : addpos id_tamane_B, 0, 0 , -0.2
//tamane_Aがtamane_Bを向く
getpos id_tamane_B, x, y, z
b=atan(x,z)-a
if b<-M_PI : b+=M_PI*2
if b>M_PI : b-=M_PI*2
if b>0 : a+=0.01 : else : a-=0.01
setang id_tamane_A,0.0,a
redraw 0
gpdraw
redraw 1
await 1000/60
loop
|
|
2022/6/2(Thu) 15:29:58|NO.96537
お二人方、サンプルプログラムを交えて解決法をご提示いただきありがとうございます。
fvface関数などでベクトルの回転量を求めたり、アークタンジェントを用いて角度を求める方法があるのですね。
大変勉強になりました、参考にさせていただきます。
解決とさせていただきます。どうもありがとうございました。
|
|