MEL How-To #90 | ||
| ||
How can I determine if a polygon face component is planar?The following MEL procedure can be used to determine if a polymesh face is planar. Some error-checking is avoided in the following example code. The downloadable script (at left) contains robust error-checking. global proc int isPlanar( string $mesh, int $face ) { // Get vertices for this face string $vertices[] = `polyListComponentConversion -toVertex ( $mesh + ".f[" + $face + "]" )`; // Because the -toVertex result is non-expanded, select and get expanded version select -r $vertices; $vertices = `filterExpand -sm 31 -ex true`; // If this face is triangular, it is a given that it is planar. if ( size( $vertices ) == 3 ) return true; // Derive normal from first three vertices in face float $f0[3] = `xform -ws -q -t $vertices[0]`; float $f1[3] = `xform -ws -q -t $vertices[1]`; float $f2[3] = `xform -ws -q -t $vertices[2]`; vector $v1 = << $f1[0], $f1[1], $f1[2] >> - << $f0[0], $f0[1], $f0[2] >>; vector $v2 = << $f2[0], $f2[1], $f2[2] >> - << $f0[0], $f0[1], $f0[2] >>; vector $normal = unit( $v1 ^ $v2 ); // cross product // For each additional vertex, generate vector from vertex to plane of triangle for ( $v = 3; $v < size( $vertices ); $v++ ) { float $f[3] = `xform -ws -q -t $vertices[$v]`; vector $vp = << $f[0] - $f0[0], $f[1] - $f0[1], $f[2] - $f0[2] >>; // Take dot-product of vector to normal of plane float $dot = $vp * $normal; // If distance determined by dot-product is not equal to 0, this face is not planar if ( $dot != 0 ) return false; } // The face is planar return true; } Related How-To'sTuesday, December 05, 2000 | ||
Copyright ©2004 by Bryan Ewert, maya@ewertb.com Maya is a Registered Trademark of Alias |