3D弾幕における自機狙いについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
夢幻ノ月夜
記事: 133
登録日時: 4年前
住所: Stens;Gate世界線

3D弾幕における自機狙いについて

#1

投稿記事 by 夢幻ノ月夜 » 2年前

Unityを使った3D弾幕を作っているのですが、自機狙い(2点間の角度の取得)が上手くいきません。
速度(Speed)と二つの角度(AngleX,AngleY)を使った球座標で実装しているのですが

コード:

AngleX = Mathf.Acos(Pos.z / Mathf.Sqrt(Pos.x * Pos.x + Pos.y * Pos.y + Pos.z * Pos.z));
AngleY = Mathf.Acos(Pos.x / (Mathf.Sqrt(Pos.x * Pos.x + Pos.y * Pos.y)));
という風にしても上手くいきません。
弾の移動のほうは、

コード:

MoveVec.x = speed * Mathf.Sin (AngleX) * Mathf.Cos (AngleY);
MoveVec.y = speed * Mathf.Sin (AngleX) * Mathf.Sin (AngleY);
MoveVec.z = speed * Mathf.Cos (AngleX);
という風にしています
どちらかが、または両方が間違っているのでしょうか?
毎回ゲーム作ろうとするたびに壁にぶち当たる

アバター
みけCAT
記事: 6235
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: 3D弾幕における自機狙いについて

#2

投稿記事 by みけCAT » 2年前

角度の取得にこだわる必要はありますか?
「弾(の発射位置)→自機のベクトル」をAとして、
自機狙いの弾の移動速度ベクトルを「A÷Aの長さ×弾の移動速度」とするわけにはいかないでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6235
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: 3D弾幕における自機狙いについて

#3

投稿記事 by みけCAT » 2年前

夢幻ノ月夜 さんが書きました:

コード:

MoveVec.x = speed * Mathf.Sin (AngleX) * Mathf.Cos (AngleY);
MoveVec.y = speed * Mathf.Sin (AngleX) * Mathf.Sin (AngleY);
MoveVec.z = speed * Mathf.Cos (AngleX);
まず、角度によるベクトルの回転の状況を整理します。(Unityの座標系にあっているかはわかりません)
kakudo-kaiten-20170111.png
角度による回転
kakudo-kaiten-20170111.png (12.09 KiB) 閲覧数: 1450 回
この図のように、夢幻ノ月夜さんの式は、
z軸の正の方向を向いているベクトルをx軸のまわりでz軸からy軸に向かう方向にAngleX回転した後、
z軸のまわりでy軸からx軸に向かう方向にAngleY回転したベクトルであると考えられます。
したがって、逆にこの回転後のベクトルが与えられた時に、それからAngleXおよびAngleYを求めればいいことがわかります。
すなわち…あれ?あっている気がしますね。
自分もなにか勘違いをしているのでしょうか?
夢幻ノ月夜 さんが書きました:Unityを使った3D弾幕を作っているのですが、自機狙い(2点間の角度の取得)が上手くいきません。
具体的にどう上手くいかないのですか?
どのような状況においてどのような動作を期待し、観測される動作はどうなのですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Enter2528

Re: 3D弾幕における自機狙いについて

#4

投稿記事 by Enter2528 » 2年前

みけCAT殿が言っている通り、ベクトル計算による間違いは恐らくないと思われます。
他にショットの発射部分のコードなどを再度確認してみては?

あと一つ思ったのが、Unityでその計算方法を行うのはあまり効率がよくないと思われます。
私もUnityで3Dシューティングゲームを作ったことがあるのですが、三角関数で計算するのは2Dと違ってあとあと面倒なことが増えるような気がしました。
UnityにQuaternionというクラスがあるのはご存知ですか?
Unity内のオブジェクトの回転度なども、一見Vector3を使っているように見えますが、プログラム内ではQuaternionというクラスが使われています。

なんとこのQuaternion、移動ベクトルに変換することができるのです。参考
transform.forceで進行方向ベクトルを表すのは知っていると思いますが、
このtransform.forceは

コード:

var dir = transform.rotation * Vector3.force;
このコードと意味は一緒なんです。
このように、Quaternionを応用するとベクトルから角度を求めることも簡単にできますし、もっと効率よくショットを動かすことができるのではないでしょうか。

アバター
夢幻ノ月夜
記事: 133
登録日時: 4年前
住所: Stens;Gate世界線

Re: 3D弾幕における自機狙いについて

#5

投稿記事 by 夢幻ノ月夜 » 2年前

みけCAT さんが書きました:
夢幻ノ月夜 さんが書きました:

コード:

MoveVec.x = speed * Mathf.Sin (AngleX) * Mathf.Cos (AngleY);
MoveVec.y = speed * Mathf.Sin (AngleX) * Mathf.Sin (AngleY);
MoveVec.z = speed * Mathf.Cos (AngleX);
まず、角度によるベクトルの回転の状況を整理します。(Unityの座標系にあっているかはわかりません)
kakudo-kaiten-20170111.png
この図のように、夢幻ノ月夜さんの式は、
z軸の正の方向を向いているベクトルをx軸のまわりでz軸からy軸に向かう方向にAngleX回転した後、
z軸のまわりでy軸からx軸に向かう方向にAngleY回転したベクトルであると考えられます。
したがって、逆にこの回転後のベクトルが与えられた時に、それからAngleXおよびAngleYを求めればいいことがわかります。
すなわち…あれ?あっている気がしますね。
自分もなにか勘違いをしているのでしょうか?
夢幻ノ月夜 さんが書きました:Unityを使った3D弾幕を作っているのですが、自機狙い(2点間の角度の取得)が上手くいきません。
具体的にどう上手くいかないのですか?
どのような状況においてどのような動作を期待し、観測される動作はどうなのですか?
常に自機の方向を中心に弾幕を展開するようにしたいのですが、
移動させてみると、あさっての方向を向いてしまいます
毎回ゲーム作ろうとするたびに壁にぶち当たる

Math

Re: 3D弾幕における自機狙いについて

#6

投稿記事 by Math » 2年前

もっと具体的にhttp://noranuk0.hatenablog.com/entry/2016/10/29/235004みたいに画をつけて説明してもらわないとわからない。スクリプト全体を載せて下さい。Windows10,Unity5.4.1f1(C# VS2015 for Unity)で作って見ましょう。まずオブジェクトは何で作ったのかな。(弾幕はプレハブ化してる?)

閉鎖

“C言語何でも質問掲示板” へ戻る