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


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0505
にゃんちゃん3次元ベクトルの操作4解決


にゃんちゃん

リンク

2016/5/5(Thu) 21:19:34|NO.75382

こんにちは。3Dゲームの基礎を勉強しようと思い立ったのですが、最初の段階で躓いてしまいました。
なお、HSPのアルゴリズムというよりは、数学的な話になると思いますので、不適切でしたら申し訳ありません。
2DのFPSの処理(弾の発射、敵からの狙い撃ち等)は問題なく実装できる状態です。この二つを3Dで考えることにします。
座標軸は、xを左右、Zを前後、Yを上下とします。
とりあえず、移動寮をベクトルデータに出力することを目標にします。
重力とかそういうめんどくさいことは気にしません。
弾を発射する場合、2Dなら
x=cos(角度) z=sin(角度)
でベクトルに落とせますが、これに上下の回転を加える方法が分かりません。
また、敵から時機を狙う場合、
atan(自y-敵y,自x-敵x)
で角度を算出し、それを使ってベクトルに落とすことができますが、こちらも3Dになった瞬間分からなくなってしまいました。

ベクトルまでは数学でちゃんとやりましたが、行列はまったく学習せずにきてしまったので、ネット上のリソースでは理解できませんでした。
3次元空間への弾の発射と狙い撃ちは、通常どのように実装するものなのでしょうか?



この記事に返信する


にゃんちゃん

リンク

2016/5/5(Thu) 21:21:49|NO.75383

すみません、atanのところで座標軸がずれた状態で投下してしまいました。yではなくzになります。失礼しました。



Velgail

リンク

2016/5/5(Thu) 22:52:07|NO.75384

あまり詳しく書こうとしても、私の説明では十分に説明できないと思うので、キーワードを幾つか。

・極座標系
自分の位置から、「どの方向」に「どのくらい遠く」で表す座標系。

・球座標
3次元の極座標。長さと、2つの角度で位置を示す。

とりあえず、ベクトルの知識のみで出来るはずなので、極座標系について学習することをお勧めします。

(ヒント:球座標は、長さと「2つの角度」で位置を表す。2つの角度をどう計算するか・どう利用するか? が答え)



GENKI

リンク

2016/5/6(Fri) 00:46:54|NO.75387

参考資料に一番いいのは、高校数学の教科書とノートです。
でも手元に無いですよね…。なので少し解説です。

2つの角度と長さからベクトルを求めるには、順番に2回に分けて回転させてやればOKです。
最初の座標は、X軸方向にベクトルの長さを取った位置。これをZ軸方向に回転させた後にY軸方向に回転させます。
Z軸方向に回転させるとx,yの座標が出ます。次にY軸方向に回転させるので、まだxは決まりませんがyは決まりです。
これをY軸方向に回転させると、xとzが決まります。これでx,y,zが出てきます。

> atan(自y-敵y,自x-敵x)
> で角度を算出し、それを使ってベクトルに落とすことができますが、こちらも3Dになった瞬間分からなくなってしまいました。
(自x-敵x,自y-敵y)でもう敵から自機に向かう方向のベクトル出てますよ。
ベクトルの長さが気に入らないのであれば、
算出したベクトル「自-敵」を長さ sqrt((自x-敵x)*(自x-敵x)+(自y-敵y)*(自y-敵y)) で割ってやれば、
単位ベクトル(長さが1のベクトル)が出るので、出てきた単位ベクトルにほしい長さをかけてやればほしいベクトルが出来ます。

基本的に3Dのベクトルも2Dのベクトルも同じようなものです。
(自x-敵x,自y-敵y,自z-敵z)
で敵から自機に向かう方向のベクトルがでています。これを長さ
xx = (自x-敵x)*(自x-敵x)
yy = (自y-敵y)*(自y-敵y)
zz = (自z-敵z)*(自z-敵z)
長さ = sqrt(xx+yy+zz)
で割れば単位ベクトルが出ます。
単位ベクトル=((自x-敵x)/長さ,(自y-敵y)/長さ,(自z-敵z)/長さ)
あとはこれにほしい長さをかけてやればいいだけです。
座標軸からの角度に一度戻すより簡単です。


蛇足ですが、3Dプログラミングを始めるときは、手元に座標軸の実物モデルを置いておくといいですよ。
割り箸と輪ゴム(木工ボンド)でXYZの座標軸を作って手元に置いておくだけで作業しやすくなります。



にゃんちゃん

リンク

2016/5/6(Fri) 09:58:57|NO.75390

お教えいただきありがとうございます。
球座標と極座標もちょっと読みつつ整理していたら、確かに上下方向の処理をちょっと足すだけで実装できたみたいです。

発射角とベクトルは

theta1=deg2rad(90)//平面状の角度 theta2=deg2rad(45)//垂直方向の角度 x=cos(theta1)*cos(theta2) z=sin(theta1)*cos(theta2) y=sin(theta2) dialog strf("x=%.2f / y=%.2f / z=%.2f",x,y,z)
こんな感じにしたら、期待通りの動作になりました。上下方向の角度の扱いが数学的におかしくなったかもしれませんが、
正面を向いて0度、真上を見たら90度、真下を見たら-90度
と仮定して正しく計算されていると思います。

敵からみたベクトルは

//テストなので、uは時機、eは敵機 ux=0 uy=0 uz=0 ex=1 ey=1 ez=1 vector=ux-ex,uy-ey,uz-ez dialog strf("x=%d / y=%d / z=%d",vector.0,vector.1,vector.2) <.pre> 角度を出してから計算しようとしていたのがいけなかったようです、というかなんで思いつかなかったのか。 これで、後はベクトルのノーマライズ関数でも作っておいて適当に放り込めば出来上がりですね。とてもすっきりしました。 お二方ありがとうございました。



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