合計 昨日 今日

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

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: 夢幻ノ月夜
[URL]
中級者(14,462 ポイント)
Date: 2017年1月10日(火) 17:15
No: 1
(OFFLINE)

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

Unityを使った3D弾幕を作っているのですが、自機狙い(2点間の角度の取得)が上手くいきません。
速度(Speed)と二つの角度(AngleX,AngleY)を使った球座標で実装しているのですが
コード[C#]: 全て選択
1
2
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)));

という風にしても上手くいきません。
弾の移動のほうは、
コード[C#]: 全て選択
1
2
3
MoveVec.x = speed * Mathf.Sin (AngleX) * Mathf.Cos (AngleY);
MoveVec.y = speed * Mathf.Sin (AngleX) * Mathf.Sin (AngleY);
MoveVec.z = speed * Mathf.Cos (AngleX);

という風にしています
どちらかが、または両方が間違っているのでしょうか?
音ゲーにハマってしまった
もう俺は戻れない

Name: みけCAT
[URL]
伝説なるハッカー(670,973 ポイント)
Date: 2017年1月11日(水) 00:33
No: 2
(ONLINE)

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

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

Name: みけCAT
[URL]
伝説なるハッカー(670,973 ポイント)
Date: 2017年1月11日(水) 01:13
No: 3
(ONLINE)

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

夢幻ノ月夜 さんが書きました:
コード[C#]: 全て選択
1
2
3
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) 表示数: 699 回

この図のように、夢幻ノ月夜さんの式は、
z軸の正の方向を向いているベクトルをx軸のまわりでz軸からy軸に向かう方向にAngleX回転した後、
z軸のまわりでy軸からx軸に向かう方向にAngleY回転したベクトルであると考えられます。
したがって、逆にこの回転後のベクトルが与えられた時に、それからAngleXおよびAngleYを求めればいいことがわかります。
すなわち…あれ?あっている気がしますね。
自分もなにか勘違いをしているのでしょうか?

夢幻ノ月夜 さんが書きました:Unityを使った3D弾幕を作っているのですが、自機狙い(2点間の角度の取得)が上手くいきません。

具体的にどう上手くいかないのですか?
どのような状況においてどのような動作を期待し、観測される動作はどうなのですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Name: Enter2528
[URL]
Date: 2017年1月11日(水) 17:26
No: 4
(OFFLINE)

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

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

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

なんとこのQuaternion、移動ベクトルに変換することができるのです。参考
transform.forceで進行方向ベクトルを表すのは知っていると思いますが、
このtransform.forceは
コード[C#]: 全て選択
1
var dir = transform.rotation * Vector3.force;

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

Name: 夢幻ノ月夜
[URL]
中級者(14,462 ポイント)
Date: 2017年1月11日(水) 21:34
No: 5
(OFFLINE)

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

みけCAT さんが書きました:
夢幻ノ月夜 さんが書きました:
コード[C#]: 全て選択
1
2
3
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点間の角度の取得)が上手くいきません。

具体的にどう上手くいかないのですか?
どのような状況においてどのような動作を期待し、観測される動作はどうなのですか?


常に自機の方向を中心に弾幕を展開するようにしたいのですが、
移動させてみると、あさっての方向を向いてしまいます
音ゲーにハマってしまった
もう俺は戻れない

Name: Math
[URL]
Date: 2017年1月11日(水) 23:03
No: 6
(OFFLINE)

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

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


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: a5ua & ゲスト[21人]