3Dでの移動計算

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

3Dでの移動計算

#1

投稿記事 by 紅葉 » 16年前

どうしてもわからないのでまた質問させていただきました><

3D上で床の角度をみてボールを転がせるということを書きたいのですが
物理学が苦手でどなたかご教授願えないでしょうか?

添付したライブラリのGameMain内のBallMove()を変更して
床の角度にあった方向にボールが落下するプログラムをかきたいです。

お時間のある時で構いませんのでよろしくお願いします。

たいちう

Re:3Dでの移動計算

#2

投稿記事 by たいちう » 16年前

床面の法線ベクトルをxy平面に射影することで、
ボールの受ける力の向きと大きさが分かるのではないかと。
後はその向きに動かすなり、その向きの加速度を与えるなりすれば良いかと。

それとも全然別の話ですか?

紅葉

Re:3Dでの移動計算

#3

投稿記事 by 紅葉 » 16年前

とりあえず加速度などは考えずにその方向に転がってくれればいいです。
射影の意味がわからないのですが具体的にどのようなことを書けばいいのでしょうか?

たいちう

Re:3Dでの移動計算

#4

投稿記事 by たいちう » 16年前

法線ベクトルのx成分とy成分です。
これをボールのx座標とy座標に足したら良いでしょう。速度を調節して。
z座標については斜面に沿う形にしないとボールが浮いてしまいます。

紅葉

Re:3Dでの移動計算

#5

投稿記事 by 紅葉 » 16年前

法線ベクトルの使い方を見たのですが理解できないので
申し訳ないのですが書き方を教えていただけないでしょうか?
添付してあるものは現在の中身です。

たいちう

Re:3Dでの移動計算

#6

投稿記事 by たいちう » 16年前

床面をどうやって管理しているのですか?

紅葉

Re:3Dでの移動計算

#7

投稿記事 by 紅葉 » 16年前

床はBox~とついている構造体で管理しています。

たかぎ

Re:3Dでの移動計算

#8

投稿記事 by たかぎ » 16年前

斜面の転がりを考える際に加速度を考慮しないというのはありえないのでは?
とりあえず摩擦を考慮しなければ、加速度は図のように g・sin θ になります。
進行方向の速度を v とすると、x軸成分は v・cos θ、y軸成分は v・sin θですね。

リアルさを追求するなら、摩擦を考慮する必要があります。
ボールや床の材質から静止摩擦係数と動摩擦係数を定め、垂直抗力を掛けてやれば摩擦力が求まります。
摩擦力をボールの質量で割れば、摩擦による加速度(の減少分)が求まるはずです。
空気抵抗はまあいいでしょう(ちなみに、空気抵抗は速度に比例します)。

元の質問は、

> 物理学が苦手でどなたかご教授願えないでしょうか?

とのことでしたので、プログラミングは自分で考えてください。

紅葉

Re:3Dでの移動計算

#9

投稿記事 by 紅葉 » 16年前

図のものは2軸上の空間でのことですよね?

3軸上だと方向を求めなければいけないと思うのですが

その方向についてがわからないんです・・・

たかぎ

Re:3Dでの移動計算

#10

投稿記事 by たかぎ » 16年前

> 3軸上だと方向を求めなければいけないと思うのですが

それは転がらない場合と同じです。
物理というより、単なる数学の話ですね。

紅葉

Re:3Dでの移動計算

#11

投稿記事 by 紅葉 » 16年前

申し訳ないのですが
たかぎさんの説明がよく理解できませんでした。
数学だとどのようにして求められるのですか?
勉強不足で申し訳ないのですが、どうか教えていただけないでしょうか?

Justy

Re:3Dでの移動計算

#12

投稿記事 by Justy » 16年前


>3D上で床の角度をみてボールを転がせるということを

 床と接触しているかどうか関係なしに床の角度とボールの転がる向きが一致すればいいのですね。
 
 箱のクォータニオン情報を持っているので箱の傾き(ベクトル)は計算できます。
 その向きがy軸方向が-ならそのまま、+なら反転させた方向
(箱の面に平行に下に向かって落ちていくように)に加速移動させ、
回転は移動量と球(を円と考えたときの)円周の長さの比から回転角度を求めて
その分回せばいいんじゃないかな、と思います。

紅葉

Re:3Dでの移動計算

#13

投稿記事 by 紅葉 » 16年前

最終的には床と接しているかを見て接していたら
その方向にという感じです。

また箱の端に来たら画面下部に落ちるのではなく
地球の引力みたいに隣の面(四角形なら)へ移動します。
この場合の面はステージではなく四角形の面です。
このときに少しくらいなら、一時的に浮いてしまっても
問題ありません。

クォータニオンから傾きを求められるのですか?

たいちう

Re:3Dでの移動計算

#14

投稿記事 by たいちう » 16年前

> クォータニオンから傾きを求められるのですか?

勿論可能です、というかできるはずですが、簡単な方法を私は知りません。
D3DXQuaternionRotationAxis()の逆関数があれば良いのですが。

# この程度の物理学なら十分理解していますが、
# 問題は3D特有の数学に移っているようです。
# 私が片手間で出来る範囲を超えていますので、他の方の回答を待つか、
# 紅葉さんご自身がクォータニオンを理解してください。中途半端で申し訳ない。
# D3DXQuaternionRotationAxis()の逆関数など必要ないほど簡単なのかも知れません。

やそ

Re:3Dでの移動計算

#15

投稿記事 by やそ » 16年前

具体的なプログラムは
http://shop.cqpub.co.jp/hanbai/books/36/36951.html

とかの書籍に載ってるんじゃないかな?

Justy

Re:3Dでの移動計算

#16

投稿記事 by Justy » 16年前


>クォータニオンから傾きを求められるのですか?
>を付け加えたらできました><

 たいちうさんが仰っているように可能です。

 クォータニオンが3Dにおいてどういう意味をもっているのかを
考えてみて下さい。


 一応やりかたを書いておくと

1 クォータニオンを行列に変換します。

2 行列から面の法線となる上向きのベクトル v1と
 そのベクトルの y要素を0にしたベクトル v2(法線のXZ平面)を求め、
それらの外積を求めます。
 
3 2で求めた結果を回転軸として面の法線である v1を90度回転させます。
 すると、これが傾いている面に平行なベクトルになります。
 
4 あとは y要素を調べて上を向いているか下を向いているかで
y要素の符号を-になるようにすれば、移動方向が求まります。


 といったところです。

 が、隣の面へ移動となるとその面における傾きを求めなければ
なりません。

 処理としては上記の応用で出来ますが、それぞれの面を構成する頂点情報を
入手して、面の法線を計算する必要があるかと。

Justy

Re:3Dでの移動計算

#17

投稿記事 by Justy » 16年前


>また箱の端に来たら画面下部に落ちるのではなく
>地球の引力みたいに隣の面(四角形なら)へ移動します。

 あれ? ってことは最初の面は下向きの重力が働いて転がっていくけど、
次の面に移動すると重力は下向きではない???

紅葉

Re:3Dでの移動計算

#18

投稿記事 by 紅葉 » 16年前

一応、画面から見て下向きですが
方向は先ほどの面に対してではなく現在一番上にある面に対して
に変化していきます。
やはり難しいでしょうか?

Justy

Re:3Dでの移動計算

#19

投稿記事 by Justy » 16年前

 あ、ひょっとして、次の面というのは1つの箱の中の別の面ではなく、
別の箱の上を向いた面、ということですか?

 同じ箱の中の隣り合った別の面だと思っていたので、重力が変わって箱の側面に張り付くのかな
と思ってました(w



>やはり難しいでしょうか?

 先のやりかたで書いた、クォータニオン~行列~外積~傾きの
流れが出来てしまえばそんなに難しくはないです。

紅葉

Re:3Dでの移動計算

#20

投稿記事 by 紅葉 » 16年前

箱はひとつしかないです。
箱の側面につくであっています。
ただ重力の向きは変わりませんが転がる方向は変わると思うので
質問させていただきました。

Justy

Re:3Dでの移動計算

#21

投稿記事 by Justy » 16年前


>ただ重力の向きは変わりませんが転がる方向は変わると思うので

 そういうことですか。
 勢いがついて、面から飛び出すことがなく常に面に接しているから
加速度が関係なく転がる向きだけが重要になる、というわけですね。

紅葉

Re:3Dでの移動計算

#22

投稿記事 by 紅葉 » 16年前

そのとおりですww
いろいろ調べたのですが私にはそのコードが書けなさそうです><
もしよろしければ、お暇のある時に書いては頂けないでしょうか?

Mist

Re:3Dでの移動計算

#23

投稿記事 by Mist » 16年前

> もしよろしければ、お暇のある時に書いては頂けないでしょうか?

最終的なご判断はJustyさんにお任せしますが、ここは制作依頼板ではないと思うんですけどね。
悪しき前例にならなければ良いなと思います。

紅葉

Re:3Dでの移動計算

#24

投稿記事 by 紅葉 » 16年前

Mistさん
理解はしています。
ただDirectXどころかGUIをやったことがないので
いろいろ調べても書きたくてもかけないんです・・・(C++は理解しています)
同人でチームを組んでいるのですがプログラム担当の方が
遂に逃げて?しまい制作が止まってしまっています><
そこでこちらで質問をさせていただいています。

Mist

Re:3Dでの移動計算

#25

投稿記事 by Mist » 16年前

> 同人でチームを組んでいるのですがプログラム担当の方が
> 遂に逃げて?しまい制作が止まってしまっています><
> そこでこちらで質問をさせていただいています。
そちらの事情は理解していますが(同情はしません)、あなたはあと何回ここの回答者に
プログラムしてもらうつもりなんですか?
質問であれば私は何も言いませんが「書いてください」は質問ではないでしょう。
作成を依頼するのであればここではない別の掲示板に行かれたほうがよいかと思います。

もっとも、リーダとしてあなたがやるべきことは今いるメンバの実力の範囲で出来ること
に切り替えるか、新しいPGを探すほうが先だと思いますが。
(もしくはDirectXの中身など知らなくても使えるライブラリを使用するか)
他質問を見ても今回の部分が完成すれば全て終わりというわけでもなさそうですし。

Justy

Re:3Dでの移動計算

#26

投稿記事 by Justy » 16年前

>> Mistさん
 フォローどうもです。


>> 紅葉さん

>ただDirectXどころかGUIをやったことがないので

 うーん、厳しいですね。
 加えて、3Dの基礎、数学・物理がおぼつかない、となると
完成どころかスタート地点にすら立つことは現状のままでは難しいでしょう。
 前に言いましたが出来るプログラマを探すことが先決です。

 もし、本気で今のままやりたいなら、諦めるのが早すぎです。
 もうちょっと時間をかけて調べて下さい。

 3D・DirectXの本を持っていますか?
 持っていなければ最低1冊は買ってきて、まずそれを一通りやって下さい。



>私にはそのコードが書けなさそうです

 どこで詰まりましたか?
 具体的にどこかどうわからなかったのか“ピンポイント”で不明点を書いて
頂ければ、多少何かしらのサポートはできると思いますよ。

紅葉

Re:3Dでの移動計算

#27

投稿記事 by 紅葉 » 16年前

Justyさん
そうですねw
そろそろDirectX関連の本を買ってみようかと思います。
値段は5000円くらいまでなら出せますので初心者(GUI含め)でもできそうな
本がありましたら紹介していただけないでしょうか?

今の私のレベルは
2Dなら添付してあるライブラリを使えば大抵のことはできるレベルです。
そのかわり3Dは全くと言っていいくらいわからないです。

Justy

Re:3Dでの移動計算

#28

投稿記事 by Justy » 16年前

 そうですねぇ。
 予算的に微妙ですが、まず3D数学関連から。

Amazon.co.jp: ゲームプログラミングのための3Dグラフィックス数学
ttp://www.amazon.co.jp/dp/4939007375

ゲームプログラミングのための数学と物理
ttp://www.amazon.co.jp/dp/4939007898/

 とかがお薦めです。


 DirectX周りは結構いろいろ出ているので実際に書店を回って
良さそうなのを見た方がいいと思いますが、

Amazon.co.jp: DirectX ゲームグラフィックス プログラミング Ver. 2.1
ttp://www.amazon.co.jp/dp/4797341874/

DirectX逆引き大全500の極意
ttp://www.amazon.co.jp/dp/4798013161

が、基本的な本になります。


 ただ、Ci-Libがある程度既に吸収している項目も多いので、
もし買われるようでしたら、実際に手に取って何ぺージか試し読みしてから
買って下さいね。

 人によって合う合わないもありますしね。

紅葉

Re:3Dでの移動計算

#29

投稿記事 by 紅葉 » 16年前

DirectX ゲームグラフィックス プログラミング Ver. 2.1
を購入させていただきました。
いろいろ勉強させてもらいます><

またわからない点についてなのですが、まず法線の出し方とその傾きの出し方がわからないです><

Justy

Re:3Dでの移動計算

#30

投稿記事 by Justy » 16年前


>まず法線の出し方と

 これは法線の計算がわからないのですか?
 それともその法線の計算の元になる情報の取り出し方がわからないのですか?

 法線の計算はこちらの項目を参照して下さい。

面法線と頂点法線_3DCG - FreeStyleWiki
ttp://ft-lab.ne.jp/cgi-bin/wiki.cgi?page=%CC%CC%CB%A1%C0%FE%A4%C8%C4%BA%C5%C0%CB%A1%C0%FE_3DCG

 今回必要なのは面法線ですね。
 外積などの関数は DirectXのリファレンスを見れば載っています。


 ただ、この方法で法線を出す為には、面を構成する各頂点の情報を ID3DXMeshから
取得しないといけないのですが、これは CiLibを拡張しなければ出来ません。
 しかもちょっと面倒です。

 横着してもいいのなら、Xファイルの中を覗いて座標を決めうちしてしまっても
いいかもしれませんね。


 実は法線だけならば、この方法でなくても
・ 形状が直方体であること
・ オブジェクトの向きと全ての面の向きが平行或いは直角であること

であるならば、6つの面のローカル座標系の法線の方向は確定することができます。

 具体的に言えば。
[1, 0, 0] [-1, 0, 0] [0, 1, 0] [0, -1, 0] [0, 0, 1] [0, 0, -1]
 となります。

 後はオブジェクトの姿勢を掛ければ、それぞれの面のワールド座標系の法線となります。

 或いは姿勢からワールド座標系の法線を1つ導きだして、後はそれを90度・180度
回転させて6方向分出してもいいですね。



>その傾きの出し方がわからないです

 23932に書いてありますけど、この課程のうちどこかわからないのですが?

紅葉

Re:3Dでの移動計算

#31

投稿記事 by 紅葉 » 16年前

法線の求め方はサイトを拝見しなんとなくやり方はわかりました><
また物体なのですが凹凸が結構あります。
できれば ID3DXMeshの取得でやりたいです。
どのように拡張すればよいのでしょうか?
また、物体は一シーンに一つですが一つの処理で複数の物体にも使える様にしたいです。

23932なのですが1からわかりません。
D3DXQuaternionMatorix?に入れればよいのでしょうか?

どうしても金曜までに完成させたいので質問する回数が多くなると思いますが
お許しください。

Justy

Re:3Dでの移動計算

#32

投稿記事 by Justy » 16年前


>また物体なのですが凹凸が結構あります

 なるほど。箱じゃないのですね。
 となると、あたり判定も必要になりますし、
このペースでは道のりは相当長いです。

 多分掲示板などでは到底説明しきれないのでしょう。



>どのように拡張すればよいのでしょうか?

 ID3DXMeshを使ったのサービス関数をいろいろ追加していくことになるかと。
 まずは、ID3DXMeshを使った関数に何があるのか、何ができるのか、
リファレンスは勿論、各種Webを調べてみて下さい。



>23932なのですが1からわかりません。
>D3DXQuaternionMatorix?に入れればよいのでしょうか?

 うーん、ここで躓くのは想定外でした。
 DirectXのリファレンスは見ていますか?

 行列への変換はD3DXMatrixRotationQuaternion() です。
 
 行列に変換できたのなら、この箱の面の法線・・・つまりローカル座標系における上向きのベクトル [0, 1, 0]を
この行列を使って座標変換すれば箱のワールド座標での上向きのベクトルが取れます。

 もう一方のベクトルはこのベクトルのy要素を0にしたものになるので、
この2つのベクトルの外積を求めれば、23932の2は終了です。



>金曜までに完成させたいので質問する回数が多くなると。

 質問するのは構いませんが、必ず回答することを約束することは出来ませんよ。

紅葉

Re:3Dでの移動計算

#33

投稿記事 by 紅葉 » 16年前

すいません><
わからないというより合っているかが不安でした。
現在はこう書いてあるのですが

D3DXMatrixRotationQuaternion(&Ball.Mat, &Box.Quat); 
//箱のクォータニオンをボールの行列に変換

と聞くべきでした・・・

2についてなのですが

D3DXVECTOR3 v1 = VEC3(0,1,0);
D3DXVECTOR3 v2 = VEC3(0,0,0);

とかいてどう Ball.Mat と掛け合わせるのでしょうか?

D3DXMATRIX m1;
D3DXMatrixTranslation(&m1, v1.x, v1.y, v1.z);
// ここに座標変換処理  ここのやり方もわからないです・・・
v2 = VEC3(v1.x,0,v1.z);
// ここに外積

みたいに行列を作るのでしょうか?



外積は
D3DXVec3Cross で求めて D3DXVec3Normalize で正規化をするべきなのでしょうか?

回答していただけなくても、もちろん構いません><
こちらは教えてもらっている身ですので、逆に申し訳ない気持ちでいっぱいです。

Justy

Re:3Dでの移動計算

#34

投稿記事 by Justy » 16年前


>箱のクォータニオンをボールの行列に変換

 ボールの行列にするわけじゃないですよ?
 そもそも、ボールの行列はどこにも出てきてないですし、
この箱の傾きに関しては計算する予定もありません。

 ここではあくまで、箱のクォータニオンで表現していた姿勢を行列にしただけです。



>とかいてどう Ball.Mat と掛け合わせるのでしょうか?

 D3DXMatrixTranslation()は平行移動の行列を作る為の関数です。
 これを使って行列を作るから、わからなくなってしまうのではないでしょうか。

 D3DXVec3TransformNormal()を使って(使い方はリファレンスを参照)
ローカル座標のベクトル v1[0, 1, 0] をワールド座標系のベクトルを変換して下さい。
 
 この結果を改めて v1とし、この v1の yを 0にしたものが v2になります。
 出来たら、v1を Gs_DrawLine3D()で表示してみるといいでしょう。

 で外積を求めると v1、v2の両ベクトルに垂直なベクトル vAxisが求まります。
 垂直である、ということはこのベクトルを回転軸にして v1を回転させれば
v2に重なりますし、さらには箱の傾く方向と一致するということを意味しています。

 では、v1を何度傾ければ箱の傾く方向になるか、というと、前にも書きましたが、
90度です。

 v1を傾けるには、D3DXMatrixRotationAxis()を使って、
一端 vAxisを回転軸に90度傾ける行列を作り、その行列を使って v1を変換して下さい。

 ここまでくれば、あとは4ですね。

 随時、ベクトルを画面に出しつつ(何倍かスケーリングしないと小さすぎて表示されないかも)進めれば、
各段階でどういうベクトルが生成されているのかわかるかと思うので、色違いにしてみるなど
工夫しながら試してみて下さい。




>D3DXVec3Cross で求めて D3DXVec3Normalize で正規化をするべきなのでしょうか?

 D3DXVec3Cross()を使うのはその通りです。
 D3DXVec3Normalize()に関してはそれが必要な時は必要になるのですが、
今回は D3DXVec3Cross()に与えてるベクトルそのものが
既に正規化されたものになっていますし、出てきたベクトルもD3DXMatrixRotationAxis()
突っ込むだけなので、必要ないと思います。

紅葉

Re:3Dでの移動計算

#35

投稿記事 by 紅葉 » 16年前

//---グローバル変数

D3DXMATRIX mAxis;
D3DXVECTOR3 v1,v2;

//---初期化

v1 = VEC3(0,1,0);
v2 = VEC3(v1.x,0,v1.z);

//---処理

// クォータニオンを行列に変換 とりあえずBall.Matに入れています。
D3DXMatrixRotationQuaternion(&Ball.Mat, &Box.Quat);
v1 = VEC3(0,1,0);

// 行列から面の法線となる上向きのベクトル v1と
// そのベクトルの y要素を0にしたベクトル v2(法線のXZ平面)を求め
// それらの外積を求める。
D3DXVec3TransformNormal(&v1, &v1,&Ball.Mat);
v2 = VEC3(v1.x,0,v1.z);
D3DXVec3Cross(&v1, &v1, &v2);
D3DXMatrixRotationAxis(&mAxis, &v1, 90);

//---描画
Gs_DrawLine3D(v1.x, v1.y+2, v1.z,v1.x+5, v1.y+2, v1.z);  // ここは違いますよねw

現在のソースは上のようになっています。
もし間違えがありましたら指摘していただけますと助かります。
また4なのですがmAxisのY要素?をみるのでしょうか? 見方もわからないです・・・
4についての説明をしていただけないでしょうか?
イライラさせてしまっていると思いますがお願いします><

Justy

Re:3Dでの移動計算

#36

投稿記事 by Justy » 16年前


>D3DXVec3Cross(&v1, &v1, &v2);

 惜しい!
 
「外積を求めると v1、v2の両ベクトルに垂直なベクトル vAxisが求まります。」

ですよ。

 つまり、vAxisは行列ではありません。

 それに後からこの直前の時点での v1は使いますので、外積の結果を v1にしてしまうと
後から使えなくなってしまいます。

紅葉

Re:3Dでの移動計算

#37

投稿記事 by 紅葉 » 16年前

D3DXMATRIX 型でかいていた mAxis を D3DXVECTOR3型で vAxisで用意し

D3DXVec3Cross(&vAxis, &v1, &v2);
D3DXMatrixRotationAxis(&Ball.Mat, &v1, 90); // ここの行列はこれでいいのでしょうか?

この後の書き方が分かりませんw

またここまで出来たのも
Justyさんのものすごいわかりやすい説明があったからですよw?

Justy

Re:3Dでの移動計算

#38

投稿記事 by Justy » 16年前


>D3DXMatrixRotationAxis(&Ball.Mat, &v1, 90);

 
「一端 vAxisを回転軸に90度傾ける行列を作り」

 行列は作っていますが、vAxisはどこへ行ってしまったのでしょうか。

 それから、90度というのは Degreeでの話、なので単位を Radianしてあげて下さい。


 出てきた行列を使って v1を変換(90度傾ける)し、以前の4で書いたように
yが負になるよう符号を調整(反転)すれば、終了です。

 あと少しですよ、頑張って下さい。
 
 

>Gs_DrawLine3D(v1.x, v1.y+2, v1.z,v1.x+5, v1.y+2, v1.z);  // ここは違いますよねw

 見落としてましたが、違いますね。
 v1はベクトルであり、向きを表します。
 とりあえず、[0, 0, 0]と [v1.x*scale, v1.y*scale, v1.z*scale]のラインにしてみて下さい。

紅葉

Re:3Dでの移動計算

#39

投稿記事 by 紅葉 » 16年前

すいませんwww

#define RAD(x) (((double)(x))*((double)((2.0*PAI)/360.0))) // 角度→ラジアン
D3DXMatrixRotationAxis(&Ball.Mat, &vAxis, float(RAD(90.0f)));
でいいのでしょうか?
また出てきた行列を v1に適用して座標を変換しとあるのですがここが理解できないです><

変換した後の反転は

v1 = VEC3(v1.x,(-1*v1.y),v1.z);

でいいのでしょうか?

Justy

Re:3Dでの移動計算

#40

投稿記事 by Justy » 16年前


>でいいのでしょうか?

 多分大丈夫でしょう。


>また出てきた行列を v1に適用して座標を変換しとあるのですがここが理解できないです

 前に、ベクトルに対し行列を掛け合わせてベクトルを作る、ということをやっているはずです。
 思い出して下さい、というかコード的にはわずか数行前の処理なのですが。



>変換した後の反転は
>v1 = VEC3(v1.x,(-1*v1.y),v1.z);
>でいいのでしょうか?

 あー、しまった。
 すみません。少し訂正します。

「y要素の符号を-になるようにすれば、移動方向が求まります」
ではなくて、
「y要素が正なら、ベクトルの向きを反転させるようにすれば、……」

 ですね。
 yを判定するのは変わらないのですが、yだけ反転させるのではなく、
ベクトル全体を反転させます。

 なので、反転させる場合は v1 = -v1でいいはずです。

紅葉

無題

#41

投稿記事 by 紅葉 » 16年前

現在の状況です。
数行前にありましたね・・・すいません><

多分どこか間違えていると思うのですが
教えていただけないでしょうか?

Justy

Re:無題

#42

投稿記事 by Justy » 16年前


>// v1 を vAxis を使ってどうにかする。
>D3DXVec3TransformNormal(&v1,&vAxis,&Ball.Mat);

 えーと。
 また引用します。

「面の法線である v1を90度回転させます」
「一端 vAxisを回転軸に90度傾ける行列を作り、その行列を使って v1を変換して下さい」

 vAxisのベクトルを90度傾ける為の行列は Ball.Matとして作りました。
 その行列を使ってどのベクトルを傾けるのでしょうか。

 これを考えれば自ずと答えが出てきます。


 さて、更に1点忘れていたので追加。
 最終的に出てきたベクトル vは、傾いたときに転がる向きを表していますが、
全く傾いていなかったときはつまり、v.yが 0の時は動きません。

 なので、v.yが 0(というか外積を行ったときの v1と v2のなす角度が0度の時、
と言い換えることも出来ます)の時は移動しないようにして下さい。

紅葉

Re:無題

#43

投稿記事 by 紅葉 » 16年前

つまりどこが間違えているのでしょうか?
間違っているところがわからないです・・・

Justy

Re:無題

#44

投稿記事 by Justy » 16年前


>// v1 を vAxis を使ってどうにかする。
>D3DXVec3TransformNormal(&v1,&vAxis,&Ball.Mat);

 では、逆に質問しますが、この式はBall.Mat行列を使って
何を回転させていますか?

紅葉

Re:無題

#45

投稿記事 by 紅葉 » 16年前

すいません・・・
どうにかする って言うのは D3DXVec3TransformNormal(&v1,&vAxis,&Ball.Mat);
のことで消すのを忘れていました

紅葉

Re:無題

#46

投稿記事 by 紅葉 » 16年前

v1でしょうか・・・?
すいません・・・わからないです><

Justy

Re:無題

#47

投稿記事 by Justy » 16年前

 D3DXVec3TransformNormal()のマニュアル読んで、
「ベクトル v1を座標変換する」ように修正してみて下さい。

紅葉

Re:無題

#48

投稿記事 by 紅葉 » 16年前

D3DXVec3TransformNormal(&v1,&v1,&Ball.Mat);

こういうことですか><
すいませんwww普通に間違えです・・・

Justy

Re:無題

#49

投稿記事 by Justy » 16年前

 OKです。
 後は、これで yが 0のとき(多少誤差も念頭に置いた方がいいかも)は
動かないようにするだけで、傾けた方向に転がっていくはずです。

紅葉

Re:無題

#50

投稿記事 by 紅葉 » 16年前

最後までありがとうございました><
将来Justyさんみたいに他の人にこたえられるように頑張ります><

紅葉

Re:無題

#51

投稿記事 by 紅葉 » 16年前

すいません。
マーク忘れました。

Justy

Re:無題

#52

投稿記事 by Justy » 16年前

 長々と続けてきましたが、やっぱり基本的な DirectXや3D数学的なところに
難がありますね。

 今回のこの一連の処理はやりかただけを書いて、理論的なところは
ほぼ放置してしまいました。

・ どうしてこれで傾いている方向がでるのか
・ どの段階でのベクトルがそれぞれ何を意味しているのか
・ 外積の処理の結果何の意味を持ったベクトルになるのか
・ 各座標変換で何が行われて、何が求められたのか

 このあたりは書籍なり Webなりできっちり理解してから、次に進んで下さい。

 ベクトルに関してはどっちを向いているのか画面に出せばそれが何を表しているのか
理解することはできますが、それ以外は理論的にどうなっているのか、
押さえておいて下さい。

 そうしないと、次に何かやろうとしたときやっぱり同じように基本的なところで
詰まってしまうことになりますので。

閉鎖

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