プロが教える店舗&オフィスのセキュリティ対策術

3dのポリゴンの法線ベクトルを算出するプログラムなんですが
以下のプログラムに間違っている部分はあるでしょうか
何度か試してみたのですが何度か0で除算したりしてしまいます
渡す数字が悪いのか、プログラム自体が間違っているのかわかりません
少し助けてください

//法線ベクトル計算開始
x1=1つめの頂点のx座標
y1=1つめの頂点のy座標
z1=1つめの頂点のz座標
x2=2つめの頂点のx座標
y2=2つめの頂点のy座標
z2=2つめの頂点のz座標
x3=3つめの頂点のx座標
y3=3つめの頂点のy座標
z3=3つめの頂点のz座標

x4=x2-x1
y4=y2-y1
z4=z2-z1

x5=x3-x1
y5=y3-y1
z5=z3-z1

x6=y4*z5-y5*z4
y6=x4*z5-x5*z4
z6=x4*y5-x5*y4

//正規化
er=sqrt(x6*x6+y6*y6+z6*z6)
x6=er*x6
y6=er*y6
z6=er*z6

//終わり /法線ベクトル計算

A 回答 (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の時は、法線は計算不可能であるという例外処理を行う必要があるでしょう。

この回答への補足

すみません、大切なこと言うのわすっれました
実は 法線ベクトルを求めて、光とのベクトルのを求め面の色を出したりして
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座標だけを使う(奥行きは表現しない)
}

補足日時:2011/04/10 16:02
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/08/19 21:26

 プログラム中には割り算がないのでゼロ割が発生することはないと思います。


 er, x6, y6,z6 の結果を使うどこかで起きているのでは。デバッグシステムの中にはトレースしているポインタの位置とゼロ割を表示させるタイミングにずれがあるものもあります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/08/19 21:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!