回転角度の取り扱いについて(DXライブラリ)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Priest
記事: 123
登録日時: 12年前
住所: 愛知

回転角度の取り扱いについて(DXライブラリ)

#1

投稿記事 by Priest » 12年前

c言語+DXライブラリで3次元シューティングを作っています。

まずは、こちらをご覧ください。
Fail0.png
このように、キャラクタの向いている方向を軸として放射状に展開するような弾を撃ちたいのです。
垂直方向の角度がついていない場合、以上のように美しい円を描きます。

そして、真下(真上)を向いたときの射撃をしてみた画像です。
Fail1.png
全然美しくないです。

これを、どのような角度からのカメラから見ても最初の画像のような円形を描くようにしたいのですが難航しています。

弾の回転角度を計算する式は以下のようになっています。
Bullet[j].Rotは弾の向きです。
Vec2はキャラクタの向きです。
Timeはゲーム内の時間で、弾の回転を少しづつ変えながら円形に射出するといった具合になります。

コード:

Bullet[j].Rot.x=Vec2.x+0.5*cos(Time/100.0f*12*DX_PI);
Bullet[j].Rot.y=Vec2.y+0.5*sin(Time/100.0f*12*DX_PI);
Bullet[j].Rot.z=Vec2.z;
おそらく、なんらかの補正値をくわえる必要があると思っています。
ですが、その補正値をどのように決定すればいいのか分からなくなってしまいました。

コード:

Bullet[j].Rot.x=Vec2.x+0.5*cos(Time/100.0f*12*DX_PI)*(補正値);
Bullet[j].Rot.y=Vec2.y+0.5*sin(Time/100.0f*12*DX_PI)*(補正値);
Bullet[j].Rot.z=Vec2.z;
下記トピックが参考になりそうな感じです。

DirectXで視点の回転がうまくいかない
http://dixq.net/forum/viewtopic.php?f=3&t=12461

このままでは仕様ということにしなければなりません。
ご助言よろしくお願いいたします。

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 回転角度の取り扱いについて(DXライブラリ)

#2

投稿記事 by softya(ソフト屋) » 12年前

この角度情報は、どのようにして弾に反映されるのかって事が重要です。
どの様にしていますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Priest
記事: 123
登録日時: 12年前
住所: 愛知

Re: 回転角度の取り扱いについて(DXライブラリ)

#3

投稿記事 by Priest » 12年前

よく考えたらそうでした。

ちょっと試行錯誤が入った計算式なので汚いかもしれません。

追記:貼りつける式をミスしました。

コード:

Bullet[i].NPos.x=Bullet[i].Pos.x+Bullet[i].Spd*sin(Bullet[i].Rot.x+1.0f/2.0f*DX_PI)*cos(1.0f/2.0f*DX_PI-Bullet[i].Rot.y);
Bullet[i].NPos.y=Bullet[i].Pos.y+Bullet[i].Spd*cos(Bullet[i].Rot.x+1.0f/2.0f*DX_PI);
Bullet[i].NPos.z=Bullet[i].Pos.z+Bullet[i].Spd*sin(Bullet[i].Rot.x+1.0f/2.0f*DX_PI)*sin(1.0f/2.0f*DX_PI-Bullet[i].Rot.y);

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 回転角度の取り扱いについて(DXライブラリ)

#4

投稿記事 by softya(ソフト屋) » 12年前

行列を使ったほうが簡単だと思いますが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Priest
記事: 123
登録日時: 12年前
住所: 愛知

Re: 回転角度の取り扱いについて(DXライブラリ)

#5

投稿記事 by Priest » 12年前

行列を使ってみました。
状況は緩和されませんでした。

コード:

VECTOR Vector={0,0,1};
MATRIX Matrix=MGetIdent();
Matrix=MMult(Matrix, MGetRotX(Bullet[i].Rot.x));
Matrix=MMult(Matrix, MGetRotY(Bullet[i].Rot.y));
Matrix=MMult(Matrix, MGetRotZ(Bullet[i].Rot.z));
Vector=VTransform(Vector,Matrix);

Bullet[i].NPos.x=Bullet[i].Pos.x+Bullet[i].Spd*Vector.x;
Bullet[i].NPos.y=Bullet[i].Pos.y+Bullet[i].Spd*Vector.y;
Bullet[i].NPos.z=Bullet[i].Pos.z+Bullet[i].Spd*Vector.z;

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

Priest
記事: 123
登録日時: 12年前
住所: 愛知

Re: 回転角度の取り扱いについて(DXライブラリ)

#6

投稿記事 by Priest » 12年前

bullet.png
示したトピックでメルカトル図法という言葉が出ていましたが、
つまり上を向けば向くほど、画像のように弾の軌跡を変更しないといけないということでしょうか?

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 回転角度の取り扱いについて(DXライブラリ)

#7

投稿記事 by softya(ソフト屋) » 12年前

まず行列は掛け算する順番が重要です。
あと自キャラの回転行列と掛けあわせてないもの問題です。

こんな感じでうまく発射されませんか?
MATRIX TamaRotateMatrix = MMult( MMult( MGetRotZ( RotZ ), MGetRotX( RotX ) ), MGetRotY( RotY ) );//回転マトリクス
TamaRotateMatrix = MMult( TamaRotateMatrix , my.rotateMatrix );
Vector=VTransform(Vector,TamaRotateMatrix );
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Priest
記事: 123
登録日時: 12年前
住所: 愛知

Re: 回転角度の取り扱いについて(DXライブラリ)

#8

投稿記事 by Priest » 12年前

なんということでしょう。完璧です。

本当にありがとうございました。
大きな原因としては、今までキャラの回転行列を弾の回転行列に乗算するのではなく、単純に加算していたことでした。
Perfect.png
つ:解決押し忘れです。

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 回転角度の取り扱いについて(DXライブラリ)

#9

投稿記事 by softya(ソフト屋) » 12年前

3Dってややっこしいですよね。
こういうのが挫折者を生むのですが。

それとゲーム全容を知らないのでジンバルロックを起こす状況があるかも知れないので、色々テストしてみて下さい。
「ジンバルロックを体験してみよう!2(PV3Dジャイロスコープ編) - wonderfl build flash online」
http://wonderfl.net/c/uTHS
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Priest
記事: 123
登録日時: 12年前
住所: 愛知

Re: 回転角度の取り扱いについて(DXライブラリ)

#10

投稿記事 by Priest » 12年前

4次元の世界の住人じゃなくてよかったですね!
もしそうなったら諦めてました。

ご指摘の内容も時々確認してみます。

ありがとでした!

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

閉鎖

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