ABCの3点で構成されるポリゴンから、法線ベクトルを求めるには...
外積で直交ベクトルを作ることができるので、これを利用します。
直交ベクトル = ベクトルABとベクトルBCを外積
法線ベクトル = 直交ベクトルの単位ベクトル
ポリゴンの法線を計算する プログラミング例
#include <math.h>
//ベクトルの定義と各種計算
class Vector3D{
public:
double x;
double y;
double z;
Vector3D(){}
Vector3D( double x, double y, double z) {this->x = x; this->y = y; this->z = z; }
Vector3D( const Vector3D& v ) { x = v.x; y = v.y; z = v.z; }
//ベクトル引き算( this - v )
Vector3D operator - ( const Vector3D& v ) const { return Vector3D( x - v.x, y - v.y, z - v.z ); }
//ベクトル外積( this × vr )
Vector3D operator * ( const Vector3D& vr ) const { return Vector3D( (y * vr.z) - (z * vr.y), (z * vr.x) - (x * vr.z), (x * vr.y) - (y * vr.x) ); }
//自身を単位ベクトルにする
void Normalize() {
double length = pow( ( x * x ) + ( y * y ) + ( z * z ), 0.5 );//ベクトルの長さ
x /= length;
y /= length;
z /= length;
}
};
//頂点の定義(ベクトルと同じ)
#define Vertex3D Vector3D
//頂点ABCで作られたポリゴンから法線を計算する。
Vector3D CreatePolygonNormal( Vertex3D A, Vertex3D B, Vertex3D C ) {
Vector3D AB( B - A );
Vector3D BC( C - B );
Vector3D normal = AB * BC; //AB BCの外積
normal.Normalize();//単位ベクトルにする
return normal;
}