• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:3d 法線ベクトル計算 )

3D法線ベクトル計算プログラムの間違いと解決方法

このQ&Aのポイント
  • 3Dのポリゴンの法線ベクトルを計算するプログラムについて、間違いの原因と解決方法を説明します。
  • プログラムのエラーが原因で、0で除算や間違った値が返されることがあります。解決方法として、渡す数字やプログラム自体の確認が必要です。
  • 法線ベクトルを計算する手順を詳しく解説しました。また、計算結果の正規化にも言及しています。

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

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.2

ベクトルの外積の計算 ---ここから--- x6=y4*z5-y5*z4 y6=x4*z5-x5*z4 z6=x4*y5-x5*y4 ---ここまで--- は、 ---ここから--- x6=y4*z5-y5*z4 y6=z4*x5-z5*x4 z6=x4*y5-x5*y4 ---ここまで--- にしないとダメですね。y6の符号が逆です。これではベクトルの向きがおかしくなります。 あとは、「正規化」というのが、ベクトルの長さを1にすることだったら、 ---ここから--- x6=er*x6 y6=er*y6 z6=er*z6 ---ここまで--- これは、 ---ここから--- x6=x6/er; y6=y6/er; z6=z6/er; ---ここまで--- にしないとダメですね。 ここで、3点が1直線上に並んでる場合は、外積が0になるので、0除算エラーになります。 そういう点の配置の時は「法線が求められるような点の配置になっていない」と言えますので、 erが0の時は、法線は計算不可能であるという例外処理を行う必要があるでしょう。

korosiya123
質問者

お礼

本当にお礼が遅くなって申し訳ございません 実際のところ、BA選ぶのも忘れてしまいました 本当にありがとうございました

korosiya123
質問者

補足

すみません、大切なこと言うのわすっれました 実は 法線ベクトルを求めて、光とのベクトルのを求め面の色を出したりして 3Dのモデルを表示したかったのですが、回転行列を座標にかけると描画少しおかしいことになってしまいます。 回転行列の角度を90度にしたりすると光と面の角度を求めるところで0で除算ししたって出ます。 ちなみに描画しているのは、立方体のポリゴンで一辺が200(メタセコイア)で中心が(0,0,0)にあります //回転行列 あってる? //y軸 ループ 頂点の数 kaku=ラジアンに変換(0)←90にしたらaa/qqで0で除算する その頂点のx座標=その頂点のx座標*cos(kaku)+その頂点のz座標*sin(kaku) その頂点のz座標=その頂点のx座標*(sin(kaku)*-1)+その頂点のz座標*cos(kaku) 終了 //y軸の回転 ループ 頂点の数 kaku=ラジアンに変換(0)←90にしたらaa/qqで0で除算する その頂点のy座標=その頂点のy座標*cos(kaku)+その頂点のz座標*(sin(kaku)*-1) その頂点のz座標=その頂点のy座標*sin(kaku)+その頂点のz座標*cos(kaku) 終了 //法線求める ~省略~ //終了 x7=カメラ兼光源x座標 y7=カメラ兼光源y座標 z7=カメラ兼光源z座標 //面と光兼カメラとの角度 aa=1.0*x6*x7+y6*y7+z6*z7 qq=1.0*sqrt(x6*x6+y6*y6+z6*z6)*sqrt(x7*x7+y7*y7+z7*z7) if aa/qq! > 0 {   描画   x座標とy座標だけを使う(奥行きは表現しない) }

その他の回答 (1)

  • nta
  • ベストアンサー率78% (1525/1942)
回答No.1

 プログラム中には割り算がないのでゼロ割が発生することはないと思います。  er, x6, y6,z6 の結果を使うどこかで起きているのでは。デバッグシステムの中にはトレースしているポインタの位置とゼロ割を表示させるタイミングにずれがあるものもあります。

korosiya123
質問者

お礼

本当にお礼が遅くなって申し訳ございません 実際のところ、BA選ぶのも忘れてしまいました 本当にありがとうございました

専門家に質問してみよう