Working with Editable Meshes


Flipping Face Normals

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


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.


--?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


--?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





#y:( tmp=normalize_pos.y





--?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



convertToMesh g





showTextureMap g.material g.material.maps[2] true

ApplyPlanarMap g #x


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

See also

Editable_Mesh : GeometryClass and TriMesh : Value