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


HSPTV!掲示板


未解決 解決 停止 削除要請

2022
0531
除菌[hgimg4]オブジェクトが、別のオブジェクトにゆっくり向く挙動の作り方について3解決


除菌

リンク

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



kinokawa

リンク

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関数などでベクトルの回転量を求めたり、アークタンジェントを用いて角度を求める方法があるのですね。
大変勉強になりました、参考にさせていただきます。

解決とさせていただきます。どうもありがとうございました。



記事削除

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

NO.96519への返信

マスコット

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

名前

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

削除用パスワード

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

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

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