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

See also

Editable_Mesh : GeometryClass and TriMesh : Value