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
//終わり /法線ベクトル計算
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の時は、法線は計算不可能であるという例外処理を行う必要があるでしょう。
この回答への補足
すみません、大切なこと言うのわすっれました
実は 法線ベクトルを求めて、光とのベクトルのを求め面の色を出したりして
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座標だけを使う(奥行きは表現しない)
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マインクラフト(pc版)で座標...
-
グラフの交点の求め方(Excel)
-
直線上にある点の座標の求め方
-
y=x^2の座標をプロットするプロ...
-
3次元空間上の2つの座標から...
-
交差する2線分の交点座標の求め方
-
ダイアログ内コントロールの位...
-
円弧の描画について
-
エクセルシート上のマウスポイ...
-
2つの座標と角度から交点座標の...
-
ワード上Shapeの位置情報を統一...
-
エクセルで回転する座標の出し方
-
VB6のPrinter.ScaleWidth に対...
-
Access2000レポートの罫線
-
複数コントロール(ラベル)を...
-
エクセルである点からの距離で...
-
以下のプログラムは重心を求め...
-
選択範囲の座標値の抽出
-
オートシェイプ円弧の中心点、...
-
図形が重なりあっているかどうか
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
グラフの交点の求め方(Excel)
-
マインクラフト(pc版)で座標...
-
以下のプログラムは重心を求め...
-
ダイアログ内コントロールの位...
-
3次元空間上の2つの座標から...
-
エクセルである点からの距離で...
-
エクセルで回転する座標の出し方
-
シーケンサー(PLC?)で制...
-
C言語 配列で座標
-
始点、終点の二つの座標と半径...
-
閉図形の座標の配列が右回りか...
-
一番近い点を見つけたい。
-
ワード上Shapeの位置情報を統一...
-
最小二乗平面
-
多角形の内部かどうか判定する方法
-
タッチパッドのタッチ座標取得
-
Excel VBA で自在に図形を変化...
-
座標を持った平面範囲に座標を...
-
ピクチャボックスの座標取得
-
DirectInputでの現在のマウス座...
おすすめ情報