ゲームプログラミング技術集 
ひっと

ポリゴンの法線ベクトルを求める

ポリゴンの法線ベクトルを求める方法とプログラミング例を紹介

ポリゴンの法線を求める方法

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;
}


戻る     次へ