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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0115
名無三ベクトルを求めたくて8解決


名無三

リンク

2019/1/15(Tue) 19:45:28|NO.86323

再び3d戦車シミュを作ろうとdxlibを用いて作業しております。
過去に悩んでいた砲塔の昇降などについては簡単に実装できたのですが、
仰俯角と射界の2軸を用いて砲を任意のベクトルに向ける方法が思いつきません…
どなたか知恵をお貸しください。
20時に帰宅できますので、その際にzipを添付します。
hspというより数学な案件ですが、よろしくお願いします



この記事に返信する


名無三

リンク

2019/1/15(Tue) 20:36:48|NO.86325




GENKI

リンク

2019/1/16(Wed) 00:51:27|NO.86326

> 仰俯角と射界の2軸

射界はこの場合、方位角のことでしょうか?
だとすると極座標系ですね。ということはそれぞれ分けて、平面の2ベクトルで考えて良さそうですね。
2ベクトルの内積を取ればCOSが出ます。外積を取るとSINが出ます。
SINの符号で右か左かがわかります。
ACOSかASINを取れば角度が出てきます。

解説書としては高校数学の教科書が最も最良の資料ですのでご活用ください。



名無三

リンク

2019/1/16(Wed) 06:32:03|NO.86329

やっぱりそれしかないか…ではなくてですね、
砲塔には旋回と仰俯角がありまして、ベクトル積ではそれらの合成角しか求められないじゃないですか…
それぞれの角度が欲しいので、例えば砲塔yベクトルに垂直な視点から投影した際に砲yベクトルと向かせたい
ベクトルとにできる角度差を求めるとかが必要なんですよ…(例での計算はこちらで出した案です。完成はしておりません)



GENKI

リンク

2019/1/16(Wed) 22:52:40|NO.86335

あーそうか。戦車自身も動くからどんな姿勢かわからないのか。


> 砲塔には旋回と仰俯角がありまして、ベクトル積ではそれらの合成角しか求められないじゃないですか…

今の砲の向きのベクトル と これから向けたい方向のベクトル をそのまま使うとそうなりますね。
まず車体を基準としたローカル座標系に2つのベクトルを持ってきます。
こうすると旋回方向と仰俯角方向のそれぞれを分けて考えることができるのでわかりやすくなると思います。



DXライブラリにこういう計算してくれる関数とか用意されてたりしないんでしょうか。
私はこのライブラリ使ったことないのでわかりませんが。



名無三

リンク

2019/1/20(Sun) 07:18:58|NO.86360

旋回は単純な角度差、仰俯角は+-0度のベクトルを作って対応できました!

https://drive.google.com/file/d/153R8F9s9idvic0N6HVjLXsXif48eOh4k/view?usp=sharing

ですが、sinの値を絶対値でしか取れてないので俯角が出せません…外積の成分から+-とる方法
はありますか?



暇人

リンク

2019/1/21(Mon) 19:52:08|NO.86367

NO.86360の奴を使用

ファイル「6_1 game_core.hsp」内の

> if msr=0{
> coc=atan(sin((y_trtrad(0)-y_trt_r_rad(0))),cos((y_trtrad(0)-y_trt_r_rad(0))))/10.
> if coc>=limits(0){mt=limits(0)}
> if coc<limits(0) and coc>-limits(0){mt=coc}
> if coc<=-limits(0){mt=-limits(0)}
> y_trt_r_rad(0)+mt

> coc=(atan(mit,oxf)+x_trt_r_rad(0))/10.
> if coc>=limitsx(0){mt=limits(0)}
> if coc<limitsx(0) and coc>-limitsx(0){mt=coc}
> if coc<=-limitsx(0){mt=-limitsx(0)}
> x_trt_r_rad(0)-mt
> }
を以下と置き換え

if msr=0{ mt=limitf( atan(sin((y_trtrad(0)-y_trt_r_rad(0))),cos((y_trtrad(0)-y_trt_r_rad(0))))/10. ,-limits(0),limits(0)) y_trt_r_rad(0)+mt mt=limitf((atan(mit,oxf)+x_trt_r_rad(0))/10.,-limitsx(0),limitsx(0)) x_trt_r_rad(0)=limitf(x_trt_r_rad(0)-mt,-deg2rad(30.0),deg2rad(5.0)) //俯角5度から仰角-30度まで }


ファイル「6_5 game_veh.hsp」内の

> oxf=-(ax*bx+ay*by+az*bz)/(sqrt( powf(ax,2)+powf(ay,2)+powf(az,2) )*sqrt( powf(bx,2)+powf(by,2)+powf(bz,2) ))//cos
> mit=sqrt(1.-powf(oxf,2))//sin<<<<<<<<<<<<<<
を以下と置き換え

bxyz_sqr=sqrt( powf(bx,2)+powf(by,2)+powf(bz,2) ) oxf=-(ax*bx+ay*by+az*bz)/(sqrt( powf(ax,2)+powf(ay,2)+powf(az,2) )*bxyz_sqr)//cos mit=sqrt(1.-powf(oxf,2))//sin<<<<<<<<<<<<<< if (ay+by/bxyz_sqr)<0.0 {mit*-1} //カメラのYベクトルが戦車のYベクトルより下向きなら負値に変更



GENKI

リンク

2019/1/21(Mon) 22:09:40|NO.86370

解決に近づいたようで何よりです。

> sinの値を絶対値でしか取れてないので

外積結果からsinを算出するのでは…?すみませんスクリプトは見れてません。

念の為復習…3次元ベクトルの外積すると次のようなベクトルが算出されます。
・2ベクトルの間にできる平行四辺形面積と同じ大きさ
・2ベクトルに垂直方向
・外積を取る順番を逆にすると方向(プラスマイナス)が逆になる



名無三

リンク

2019/1/25(Fri) 20:57:44|NO.86394

返信遅れてしまい申し訳ありません。暇人氏のコードお借りします。
アドバイスありがとうございました!



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