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で質問しましょう!
似たような質問が見つかりました
- 数学 ベクトルの単元で、 平行四辺形の頂点A、B、Cの座標が与えられて、Dの座標を聞かれる問題がありますが 1 2022/07/04 04:53
- 数学 放物線y=a(x-a)(x-b)について、頂点の座標を求めなさい。ただし、a≠0とし、a,bは実数の 6 2023/03/21 00:26
- 数学 焦点のx座標が3、準線が直線x=5で、点(3.1)を通る放物線の方程式を求めよという問題について質問 4 2023/07/14 00:13
- 数学 ベクトル方程式(ヘッセの標準形)についての質問 2 2022/04/23 18:00
- その他(プログラミング・Web制作) 3Dモデルにおける法線の計算について(Python,OpenGL) 1 2023/04/25 23:46
- 物理学 ベクトルと座標系につきまして 1 2022/04/03 06:23
- 数学 線形代数の問題について教えて欲しいです。 3 2023/05/06 23:13
- 数学 球面と接する直線の軌跡が表す領域 4 2023/07/30 12:37
- 数学 2次関数y=ax^2のグラフは点A(4,2)を通っている。y軸上に点BをAB=OB(Oは原点)となる 1 2022/04/08 00:05
- 数学 この写真の問題の(2)について何ですが、(1)の「2解が共に1より大きい」という時は写真のように、 5 2022/07/22 11:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
グラフの交点の求め方(Excel)
-
エクセルで回転する座標の出し方
-
マインクラフト(pc版)で座標...
-
座標を持った平面範囲に座標を...
-
エクセルである点からの距離で...
-
閉図形の座標の配列が右回りか...
-
エクセルシート上のマウスポイ...
-
【エクセル・マクロ】座標を回...
-
VBで車のアナログスピードメー...
-
図形が重なりあっているかどうか
-
3次元空間上の2つの座標から...
-
visualbasic でform上に正三角...
-
多角形の内部かどうか判定する方法
-
c言語でキーボードから2点の座...
-
VB6のPrinter.ScaleWidth に対...
-
GLで座標を変えて回転させたい
-
以下のプログラムは重心を求め...
-
C言語 配列で座標
-
C++でコマンドプロンプトに図形...
-
任意点を中心とした回転
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
マインクラフト(pc版)で座標...
-
グラフの交点の求め方(Excel)
-
エクセルで回転する座標の出し方
-
閉図形の座標の配列が右回りか...
-
3次元空間上の2つの座標から...
-
エクセルである点からの距離で...
-
求積表の計算方法
-
ダイアログ内コントロールの位...
-
空間上の二点を結ぶ直線上に任...
-
始点、終点の二つの座標と半径...
-
図形が重なりあっているかどうか
-
ワード上Shapeの位置情報を統一...
-
以下のプログラムは重心を求め...
-
シーケンサー(PLC?)で制...
-
ピクチャボックスの座標取得
-
多角形の内部かどうか判定する方法
-
Excel VBA で自在に図形を変化...
-
選択範囲の座標値の抽出
-
座標を持った平面範囲に座標を...
-
VBで、開いているExcelシートの...
おすすめ情報