行列にXYZ座標と回転の情報を

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
紅葉

行列にXYZ座標と回転の情報を

#1

投稿記事 by 紅葉 » 16年前

またまた質問なのですが
行列にXYZ座標と回転の情報を入れたいのですがうまくいきません。
 D3DXMATRIX mPos,mRot;
 D3DXMatrixIdentity(&mPos);
 D3DXMatrixIdentity(&mRot);
 D3DXMatrixIdentity(&GRoll.Ball.Mat);
 D3DXMatrixTranslation(&mPos, GRoll.Ball.Pos.x, GRoll.Ball.Pos.y, GRoll.Ball.Pos.z);
 D3DXMatrixRotationYawPitchRoll(&mRot, GRoll.Ball.Rot.Yaw, GRoll.Ball.Rot.Pit, GRoll.Ball.Rot.Rol);
 D3DXMatrixMultiply(&GRoll.Ball.Mat,&mRot,&mPos);
GRoll.Ball.Matのみグローバル変数のMatrix型です。
どこが間違えているか御指摘頂けないでしょうか?

box

Re:行列にXYZ座標と回転の情報を

#2

投稿記事 by box » 16年前

> 行列にXYZ座標と回転の情報を入れたいのですがうまくいきません。

毎度のお願いですが、「うまくいきません」だけではなくて、
「どのように」うまくいかないか、例えば
 ・コンパイル時にこんなエラーメッセージが出る
 ・実行時にこんなエラーメッセージが出る
というようなことを「具体的に」提示していただけますか?

具体的な回答は、具体的な質問から生まれます。

紅葉

Re:行列にXYZ座標と回転の情報を

#3

投稿記事 by 紅葉 » 16年前

エラーなどはでないのですが
実行時に違った値が入ってしまいます。
デバックで行列でと座標と回転を直接入れる2パターンで描画しても
違う結果になっています。

VS2005
Xp
C++
DirectX
上記の者でコンパイルしています。

紅葉

Re:行列にXYZ座標と回転の情報を

#4

投稿記事 by 紅葉 » 16年前

やはり行列に入れることはできないのでしょうか?

GPGA

Re:行列にXYZ座標と回転の情報を

#5

投稿記事 by GPGA » 16年前

あなたの文章があまりにも分かりづらいので、誰も回答できないだけです。
boxさんもおっしゃっていますが、具体的な回答は、具体的な質問から生まれます。

>実行時に違った値が入ってしまいます。
まずこの文章、期待した値にならないということが書かれていますが
望む結果と実際の結果が記述されていないため、回答しようがありません。

>デバックで行列でと座標と回転を直接入れる2パターンで描画
これもよくわかりません。
行列を使った場合の描画のプログラムと
座標、回転を直接入れるプログラムを提示していただければ、まだ回答することもできますが・・・。

紅葉

Re:行列にXYZ座標と回転の情報を

#6

投稿記事 by 紅葉 » 16年前

ソースになります。
2つ描画しています。
これが同じ結果になりません。
また床の傾きに応じた回転をしたいのですがうまくいきません。

紅葉

Re:行列にXYZ座標と回転の情報を

#7

投稿記事 by 紅葉 » 16年前

DATAになります。
testの解凍した直下に解凍したものを入れてください。

紅葉

Re:行列にXYZ座標と回転の情報を

#8

投稿記事 by 紅葉 » 16年前

>>GPGA 様
一応、ソースをあげときました。
よろしければ見ていただけますと助かります。

GPGA

Re:行列にXYZ座標と回転の情報を

#9

投稿記事 by GPGA » 16年前

ボールの回転の扱いが、1.0で一周になっているのが原因です。
D3DXMatrixRotationYawPitchRoll関数に指定する値はラジアンなので
ラジアン値に変換する必要があります。

D3DXMatrixRotationYawPitchRoll(&mRot, GRoll.Ball.Rot.Yaw, GRoll.Ball.Rot.Pit, GRoll.Ball.Rot.Rol);
↓
const float yaw = F(RAD(GRoll.Ball.Rot.Yaw));
const float pit = F(RAD(GRoll.Ball.Rot.Pit));
const float rol = F(RAD(GRoll.Ball.Rot.Rol));
D3DXMatrixRotationYawPitchRoll(&mRot, yaw, pit, rol);

FマクロとRADマクロは、このプログラムのライブラリで定義されていたので
そのまま使用しています。
 

GPGA

Re:行列にXYZ座標と回転の情報を

#10

投稿記事 by GPGA » 16年前

訂正
×ボールの回転の扱いが、1.0で一周になっているのが原因です。
○ボールの回転を、角度で扱っているのが原因です。

紅葉

Re:行列にXYZ座標と回転の情報を

#11

投稿記事 by 紅葉 » 16年前

できました>< 天才ですね・・・
もうひとつ問題点があるのですが
Gs_DrawModel(GRoll.Ball.Pos.x,GRoll.Ball.Pos.y,GRoll.Ball.Pos.z,M_BOX,1,1,1,GRoll.Ball.Rot.Yaw+GRoll.Ball.AxisCnt,GRoll.Ball.Rot.Pit,GRoll.Ball.Rot.Rol);

を
	Gs_DrawModel(GRoll.Ball.Pos.x,GRoll.Ball.Pos.y,GRoll.Ball.Pos.z,M_BOX,1,1,1,GRoll.Ball.Rot.Yaw,GRoll.Ball.Rot.Pit,GRoll.Ball.Rot.Rol);
に変えていただくとわかると思うのですが
マウスで操作すると面にそった角度で転がります。

この角度で回転するようにしたいですがうまくいきません。
説明が下手で申し訳ないのですがどのように書けばうまく回るでしょうか?

GPGA

Re:行列にXYZ座標と回転の情報を

#12

投稿記事 by GPGA » 16年前

Gs_DrawModel関数を使用する方法だと(個人的に)説明しづらいので
Gs_DrawKanadeAxis関数を使用する方法で説明します。

今回の問題は、すでに正規化された角度に対して、Yに回転角度を足しこむためにおかしくなっています。
一度Y回転させた後に、正規化された角度の行列計算入れることで、正しく動作します。
D3DXMATRIX		mat;

// 初期化
D3DXMatrixIdentity(&GRoll.Ball.Mat);

// まずY回転
D3DXMatrixRotationY(&mat, F(RAD(GRoll.Ball.AxisCnt)));
GRoll.Ball.Mat *= mat;

// その後、正規化された角度にする
const float yaw = F(RAD(GRoll.Ball.Rot.Yaw));
const float pit = F(RAD(GRoll.Ball.Rot.Pit));
const float rol = F(RAD(GRoll.Ball.Rot.Rol));
D3DXMatrixRotationYawPitchRoll(&mat, yaw, pit, rol);
GRoll.Ball.Mat *= mat;

// 最後に移動
D3DXMatrixTranslation(&mat, GRoll.Ball.Pos.x, GRoll.Ball.Pos.y, GRoll.Ball.Pos.z);
GRoll.Ball.Mat *= mat;

紅葉

Re:行列にXYZ座標と回転の情報を

#13

投稿記事 by 紅葉 » 16年前

できました><
本当にありがとうございます。
助かりました。

閉鎖

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