ボックスの回転について

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

ボックスの回転について

#1

投稿記事 by 紅葉 » 16年前

ボックスの回転をマウスで操作したいのですが
2回目のクリックで元の座標に初期化されてしまいます。
できればドラッグを離したら軸がリセットされるようにソースを書きたいです。
よろしくお願いします。

紅葉

説明が分かりにくかったかもしれないので

#2

投稿記事 by 紅葉 » 16年前

軸はリセットされますが(リセットされなくても)

再度クリックしても今みたいに画面が最初の状態に戻らなくしたいです。

画面で見えている箱の状態から再度回転を始めたいです。

紅葉

Re:説明が分かりにくかったかもしれないので

#3

投稿記事 by 紅葉 » 16年前

やはり解けないでしょうか?
難しい質問をしてしまい本当に申し訳ないです。

バグ

Re:説明が分かりにくかったかもしれないので

#4

投稿記事 by バグ » 16年前

デバッグしてみようかと思ったのですが、うちの環境だと"d3d9.h"が無いのでビルドできないです(T-T)

紅葉

Re:説明が分かりにくかったかもしれないので

#5

投稿記事 by 紅葉 » 16年前

>>バグさん
わざわざすいません><
調べようとしてくれて、ありがとうございます。
一応、SRCのGameMain.cppが今回の難題なので
もしそちらを見ることがあり、何かありましたら連絡ください。

やそ

Re:説明が分かりにくかったかもしれないので

#6

投稿記事 by やそ » 16年前

>一応、SRCのGameMain.cppが今回の難題なので
とありますが、結局

>デバッグしてみようかと思ったのですが、うちの環境だと"d3d9.h"が無いのでビルドできないです(T-T)
に行き着くのではないでしょうか?

Justy

Re:説明が分かりにくかったかもしれないので

#7

投稿記事 by Justy » 16年前


>できればドラッグを離したら軸がリセットされるようにソースを書きたいです。

 他のスレとは違い、これはいい線いってるじゃないですか。
 あとほんの数カ所改善するだけでうまくいきます。

 MeshMat()で。
 mAxisと Angからクォータニオンを出して、それをそのまま行列に変換し箱の姿勢としていますが、
問題は次にマウスがクリックされた時 mAxisを構築し直すので回転が元に戻ってしまっています。

 そこで、MouseReport()でマウスが離された時、その時点でのオブジェクトの姿勢を
記憶し(これはクォータニオンで覚えておけばいいでしょう)mAxisと Angを
初期化しておきます。
(記憶しようとした形跡はあるようですが・・・)

 で、MeshMat()で、mAxisと Angからクォータニオンを求めた後、
記憶したクォータニオンを掛け合わせ、それを最終的な箱の姿勢とすれば完成です。


 注意が必要なのは、姿勢を記憶する際に mAxisと Angから求められる
クォータニオンを記憶するのではなく、その時点でのオブジェクトの姿勢を記憶する
ところです。

紅葉

Re:説明が分かりにくかったかもしれないので

#8

投稿記事 by 紅葉 » 16年前

とりあえず間に合わせのの知識と今までの Justy さんから頂いたものを解析し
なんとか今の状況までたどり着くことができました。(説明が上手なのでw)
本当にありがとうございます。

Justyさんが言っていることをやろうとしたのですが、失敗いたしました><
現在、マウスを離したとき(Mouse.Pul &_lMOUSE)姿勢の記憶の仕方と
それを前の物との掛け合わせ方がわからないです。
これ以上は自らの手ではできそうにないのですが、
丸投げのつもりはないですが、再度書いたものを頂けないでしょうか?

できれば今日、制作での集まりが午後からあるのでそれまでに完成させたいです。
もちろん Justy さんの都合もありますので時間があればで構いません><

Justy

Re:説明が分かりにくかったかもしれないので

#9

投稿記事 by Justy » 16年前


 > 再度書いたものを頂けないでしょうか

 すみませんが、コードを書いて試しているわけではないので、ないです。
 なので不明点があれば、その都度ピンポイントで訊いてもらった方がいいかと思います。



 > マウスを離したとき(Mouse.Pul &_lMOUSE)姿勢の記憶の仕方と
 > それを前の物との掛け合わせ方がわからないです。

 実はこの2つの処理の内容はほぼ同じです。
 どちらもその時点での姿勢を求めるだけなので。

 記憶したクォータニオンを q1、mAxisと Angから出したクォータニオン q2、とすると
q1 * q2を行い、この結果を記憶したり、表示時の姿勢とすればOKです。

紅葉

無題

#10

投稿記事 by 紅葉 » 16年前

Justyさん
多分、同じようなことを書いたのですがmAxis等をがVECTER型で用意したせいか
まずクォータニオンに保存できませんでした・・・
また姿勢の掛け合わせ型?が理解できないです。

紅葉

無題

#11

投稿記事 by 紅葉 » 16年前

連続したレスになりすいません。

やり方は何となくわかっていますが、今の私では上の理由などから
コードを書けないです。

どうか書いては頂けないでしょうか?

Justy

Re:無題

#12

投稿記事 by Justy » 16年前


>mAxis等をがVECTER型で用意したせいか
>まずクォータニオンに保存できませんでした・

 投稿されたコードを見ると
D3DXQuaternionRotationAxis(&Box.Qrt,&(mAxis),D3DXToRadian(Ang));
 と、mAxisと Angからクォータニオンを出していますよ。
 これがまさにその処理です。


 姿勢の掛け合わせは、D3DXQuaternionMultiply()を使ってもできますし、
 q = q1 * q2と書いてもいいですし、q1 *= q2と書くこともできます。

紅葉

Re:無題

#13

投稿記事 by 紅葉 » 16年前

何度やっても添付したexeの実行結果になってしまいます。

DATAがある階層に保存してください。

昨日からコードは違いますが同じように書いてます。

しかし実行結果は添付したものになってしまいます。

すいません・・・ファイルのサイズ上exeは添付できませんでした。

Justy

Re:無題

#14

投稿記事 by Justy » 16年前

 幾つか前の説明をもう1度読み直して下さい。

1 q1 * q2の q1は記憶したクォータニオンで、q2はmAxisと Angから出したクォータニオンと
書いたと思いますが、
D3DXQuaternionMultiply(&Box.Qrt,&Box.Qrt,&OldQ);の処理は逆になっています。

 クォータニオンの積は、自然数の積と違って可換ではなく、a*bと b*aの結果は異なりますので
注意して下さい。


2 マウスを離した時
D3DXQuaternionRotationAxis(&OldQ,&(mAxis),D3DXToRadian(Ang));
という処理で、OldQに姿勢を保存していますが、この姿勢というのは
そのドラッグにおける姿勢の変化しか出していません。

 「注意が必要なのは、姿勢を記憶する際に mAxisと Angから求められる
クォータニオンを記憶するのではなく、その時点でのオブジェクトの姿勢を記憶する
ところです。 」

 と書いた通り、ここでは「その時点でのオブジェクトの姿勢」にしなければなりません。

 従って、mAxisと Angのクォータニオンはいきなり OldQに入れず、別の変数(ローカル変数で十分です)の方に入れ、
1と同じように OldQとその変数を掛け合わせたものを OldQとしてみて下さい。

 あと、mAxisと Angの初期化が行われていません。
 mAxisと Angから出される姿勢をここで OldQに反映させているので、
一端初期化して mAxisと Angから回転が行われないようにする必要があります。

Justy

Re:無題

#15

投稿記事 by Justy » 16年前

 あ、そうだ。1つ忘れていました。

 一応今回コードをテストするときは、カメラの位置を 0, 0, Xにしておいて下さい。
 というのも、添付のコードも私の修正案もカメラについては一切考慮していないので、
カメラの位置がオブジェクトの真正面に無い場合、ずれます。

 このずれを解決するにはカメラの向きを考慮に入れて、オブジェクトを回転させればいいのですが、
また話が複雑になるので、とりあえず今はこのままということで。

紅葉

Re:無題

#16

投稿記事 by 紅葉 » 16年前

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

閉鎖

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