• ベストアンサー

リアルタイム3Dについて2。

http://okwave.jp/kotaeru.php3?q=2270547 上の質問でお世話になったものです。連続質問で申し訳ありません。 また分からない事があるので質問させていただきます。 分からない事は前回の質問にも書いていましたが、「迷路の傾きによりボールが転がるようにする」です。 一応、講師に質問したのですが、返ってきた答えが結構面倒で大変な処理とのことで少し凹みました… まぁそれ以外には法線ベクトルを用いて傾きを調べるのがいいのではないか?と言われました。 法線ベクトル自体やそれの求め方は分かっていると思う(前回の回答で解説していただいてますし)は分かるのですが、それを使って傾きを知る方法が分かりません。 傾きが分かればあとは中学の理科などで習う公式を使って計算すればいいと思うのですが… これができれば基本的な動作確認は終了し、あとは組み上げていくだけだと思う(そうならない可能性もあり)のですが… 分かる方、教えていただけないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • mizuneko
  • ベストアンサー率16% (3/18)
回答No.2

こんばんは。 こういう問題は、図がないとわかりづらいので、 3Dゲームプログラマーのための数学 http://www.amazon.co.jp/exec/obidos/ASIN/4777510670 あたりの書籍をあたるのが一番のように思います。 他にもいろいろありますので、探してみてください。 私だったら、せっかく法線ベクトルを求めたのでしたら、 そのままベクトルを使って計算するほうを選びます。 図なしで無理やり説明すると、 1.法線ベクトルのZを別の数Xに置き換えると   加速度ベクトルに平行なベクトルになります 2.加速度ベクトルと法線ベクトルは垂直なので、   内積は0になります 以上からXが求まりますので、 加速度ベクトルに平行なベクトルが求まります。 3.加速度ベクトルに平行なベクトルのA倍に   法線ベクトルの逆向きのベクトルのB倍を足すと   重力加速度ベクトルになります 4.加速度ベクトルに平行なベクトルのA倍の二乗と   法線ベクトルの逆向きのベクトルのB倍の二乗を足すと   重力加速度ベクトルの大きさの二乗になります 以上からA,Bが求まり、 加速度ベクトルに平行なベクトルのA倍つまり、 求める加速度ベクトルがわかります。 加速度ベクトルと経過時間から位置がわかります。 はじめに角度を求めてから加速度を求めるより、 たぶんこのほうが効率的です。 実際計算してみたわけではないので、 あまり自信がありませんが、数学的には そのような感じになるかと思います。

DEGI
質問者

お礼

お礼が遅くなってしまって申し訳ありません。昨日が締め切りだったため、ずっと課題の方をやっていたもので… ご説明ありがとうございます。教えていただいたことでなんとかできたように思えます。動作の方も多分問題ないように感じました。 おそらくここで解説していただけなければ完成はしなかったと思います。本当にありがとうございました。

その他の回答 (2)

  • Interest
  • ベストアンサー率31% (207/659)
回答No.3

前回のご質問では仕様が > 1.ある角度まで迷路が傾いたら、それ以上傾かないようにする。 > 2.壁とボールの衝突判定をする。 > 3.ボールが壁に当たったらそれ以上進まないようにする。 > 4.迷路の傾きによりボールが転がるようにする。 だったのですから、すでに傾きはわかっているのではありませんか? 私は1.の「ある角度まで迷路が傾いたら」という条件の「ある角度」というのはユーザがキーボードかマウスかで操作することで角度を入力するか、何らかの判定で角度を自動的に制御するかだと思っていました。そうでないとしたら、1~4に明記されていない条件がまだあるということでしょうか?

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

一般的には、2つのベクトルの交わる角度は、ベクトルの内積で求めることができます。 なので、 迷路の底面の法線ベクトルと、水平面の法線ベクトルとの内積からベクトルの交わる角度(つまり傾き)を求めることができます。 が、この場合、水平面との角度なので、3平方の定理と逆三角関数から求めることができます。 今、法線ベクトルが(Xa,Yb,Zc)だとします。 x-y-z座標で適当な方向を向いた矢印があるとイメージしてみて下さい。 この矢印がx-y平面に落としている影の長さは、 √(Xa*Xa+Yb*Yb) ですよね。この時の高さがZc なので、 tanθ=Zc /√(Xa*Xa+Yb*Yb) になります。 また、 sinθ=Zc / √(Xa*Xa+Yb*Yb+Zc*Zc) cosθ=√(Xa*Xa+Yb*Yb) / √(Xa*Xa+Yb*Yb+Zc*Zc) なので、ここから逆三角関数を使って角度を求めることができます。 C言語では、asin, acos, atan, atan2 の逆三角関数が使えます。 ワタシ的には、acos が好きです。 あと、こういう数学的な部分の質問については、プログラム関係のカテゴリより数学カテゴリで、質問されるといいかと思います。

DEGI
質問者

お礼

再びお答えしていただき、ありがとうございます。これから試していようと思います。 また、カテゴリに関するご指摘ありがとうございます。確かに内容的にはプログラムと言うよりは数学寄りの質問内容ですね。 今後は気を付けたいと思います。