平面の描画
一辺の大きさがsizeの平面を描くコードです。デバッグ用に作ったのですが、普段は使うことが無いので削除したのですが、「もしかしたらいつか使うかも…」と思ったのでここにおいておきます。
void DrawPlane( const Plane &plane, int drawMode, float size ) { static const float plus_delta = 1.0f; const Vector3d &axis0 = plane.n; Vector3d axis1, axis2; axis1.set( axis0.v.x+plus_delta, axis0.v.y, axis0.v.z ); axis1.normalize(); axis2.cross( axis0, axis1 ); if ( axis2.isZeroVector() ) { axis1.set( axis0.v.x, axis0.v.y+plus_delta, axis0.v.z ); axis1.normalize(); axis2.cross( axis0, axis1 ); } axis2.normalize(); axis1.cross( axis2, axis0 ); axis1.normalize(); // 平面を描く if ( drawMode != 0 ) { glDisable( GL_CULL_FACE ); glEnable( GL_LIGHTING ); if ( drawMode == 2 ) { glEnable( GL_BLEND ); glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); glDepthMask(GL_FALSE); } float diffuse[] = { 0.0f, 1.0f, 0.0f, 0.5f }; glMaterialfv( GL_FRONT, GL_DIFFUSE, diffuse ); float halfsize = size*0.5f; glBegin(GL_QUADS); { glNormal3fv( axis0.vertex ); glVertex3fv( (axis0*plane.d+axis1*-halfsize+axis2*-halfsize).vertex ); glVertex3fv( (axis0*plane.d+axis1*+halfsize+axis2*-halfsize).vertex ); glVertex3fv( (axis0*plane.d+axis1*+halfsize+axis2*+halfsize).vertex ); glVertex3fv( (axis0*plane.d+axis1*-halfsize+axis2*+halfsize).vertex ); } glEnd(); glDisable( GL_BLEND ); glDepthMask( GL_TRUE ); glEnable( GL_CULL_FACE ); } }
ちなみにPlaneの定義はこうです。
// Ax+By+Cz+D = 0 の平面 struct Plane { Vector3d n; // 平面の方程式の A, B, Dを表す(平面の法線を表す) float d; // 平面の方程式の D を表す(法線は正規化されているはずなので、原点からの距離を表す) };