Working with Editable Meshes

Flipping Face Normals

The following function flips the face normal for all faces in the specified mesh object.

EXAMPLE

   fn FlipObjNormal obj =
   (
   for f =1 to obj.numFaces do -- for each face in the mesh
   (
   verts=getface obj f -- get its 3 vertices as a point3
   local tmp=verts.x -- swap the first and third vertices
   verts.x=verts.z -- which flips the normal
   verts.z=tmp -- (right-hand rule), and
   setface obj f verts -- store the new vertex order for the face
   )
   update obj -- update object so 3ds Max sees the changes
   )

Texture Vertices and Faces

The following script is an example of working with texture vertices and faces.

SCRIPT

   -- function to apply planar mapping to an object
   -- direction parameter specifies the axis the mapping is
   -- perpendicular to, and can have a value of #x, #y, or #z
   --
   fn ApplyPlanarMap obj direction =
   (local oldcoordsys, normalize_pos
   -- in this case, the number of texture vertices is equal to the
   -- number of mesh vertices
   obj.numtverts=obj.numverts
   -- build the texture vertex faces
   buildTVFaces obj
   -- operate in objects coordinate space. Save original coord system so we
   -- can restore later.
   oldcoordsys=set coordsys local
   -- for each vertex in mesh, get it's position and normalize the position
   -- to a range of [0,0,0] to [1,1,1]. This is the planar UVW space.
   for v = 1 to obj.numverts do
   ( normalize_pos=((getvert obj v)-obj.min)/(obj.max-obj.min)
   -- flip around position component values based on which direction the
   -- planar mapping is perpendicular to
   case direction of
   (#x:( tmp=normalize_pos.x
   normalize_pos.x=normalize_pos.y
   normalize_pos.y=normalize_pos.z
   normalize_pos.z=tmp
   )
   #y:( tmp=normalize_pos.y
   normalize_pos.y=normalize_pos.z
   normalize_pos.z=tmp
   )
   )
   -- set the corresponding texture vertex "position"
   settvert obj v normalize_pos
   )
   -- done "positioning" the texture vertices. Build the texture faces.
   -- since in this case there is a 1-to-1 correspondence between mesh and
   -- texture vertices, the vertex indices for a mesh face are also the
   -- texture vertex indices for the texture faces.
   for f = 1 to obj.numfaces do
   setTVFace obj f (getface obj f)
   -- all done. reset the coordinate system
   set coordsys oldcoordsys
   -- update the mesh so 3ds Max sees the changes

   update obj
   )
   --
   -- test bed. Create a sphere, apply a material, set the diffuse map
   -- to a 2x3 tiled checker map, turn on viewport display of the
   -- checker texture map, and call the ApplyPlanarMap function
   --
   g=geosphere()
   convertToMesh g
   g.material=standard()
   g.material.maps[2]=checker()
   g.material.maps[2].coordinates.u_tiling=2
   g.material.maps[2].coordinates.v_tiling=3
   showTextureMap g.material g.material.maps[2] true
   ApplyPlanarMap g #x

OUTPUT:

   ApplyPlanarMap() -- output of function declaration lines 5 to 45
   $GeoSphere:GeoSphere02 @ [0.0,0.0,0.0] -- output line 51
   $Editable_Mesh:GeoSphere02 @ [0.0,0.0,0.0] -- output line 52
   Standard:Standard -- output line 53
   Checker:Checker -- output line 54
   2 -- output line 55
   3 -- output line 56
   OK -- output line 57
   OK -- output line 58