how to use png textures with alpha channel in max

you can use one png file as diffuse color map and transparency map at the same time. so you don't need to create 2 files for this in 3ds max.

  1. create your transparent texture
  2. save as 24bit png file
  3. switch to max, open the material editorm choose an empty slot
  4. choose "maps"
  5. click the "none" button next to "diffuse color"
  6. select "bitmap" and choose your png file
  7. go back to the material editor (e.g. "03 - default"in the pulldown menu under the material slots)
  8. click the "none" button next to "opacity"
  9. select "bitmap" and choose the same png file
  10. switch "mono channel output" to "alpha" (in "bitmap parameters")

max mesh transformation matrix

"snapshotAsMesh object" gives you the current object completly collapsed.
bad thing is, the transform matrix is also applied, so all vertices are in world space.
get the vertices back into local space, you multiply every vertex with the inverse transformation matrix:

  mesh = snapshotAsMesh obj
  worldTransform = obj.transform
  invWorldTransform = inverse worldTransform

for v = 1 to mesh.numverts do
vert=getVert mesh v
vert*=invWorldTransform -- daadaaa
WriteFloat f vert.x
WriteFloat f vert.y
WriteFloat f vert.z

for your normals you have to do the same, just multiply with the inverse world matrix. but only use rotation this time.

do not use obj.mesh directly to get object space vertex coordinates, or your script will become unbelivable slow.....

install v3d export plugin

1. copy .ms file to your3dsmaxdir/scripts/startup/
2. customize->customize user interface
3. select tab "toolbars"
4. select category "v3d"
5. grab v3d export in the action list and drag it to your toolbar

random maxscript questions

just some random questions i had when starting with a maxscript exporter...

how do i read animated values ?

for printing an object position at time T, do:
print at time T obj.pos.x

getting information about scene animation


what is the current framerate ?

use the global variable "frameRate"

how do i rewind or set the max timeline?

use the global variable sliderTime to set it.
sliderTime =0

how to get vertex normals ?

this way your normals look like you wanted them. ("smoothing groups safe")
for ve = 1 to mesh.numfaces do
    norm=meshop.getFaceRNormals mesh ve
    format "% % %" norm[1].x norm[1].y norm[1].z
    format "% % %" norm[2].x norm[2].y norm[2].z
    format "% % %" norm[3].x norm[3].y norm[3].z

what is the color i set at rendering->environment->background color ?

use the global variable "backgroundColor" :)

how to test if an object is animated ?

you can check (boolean) "obj.isanimated".
i think this works not if vertices of the object are animated. only if position/rotation/etc. are animated..
also this is false if the object is linked to a bone, which is animated!

baking mesh animations using point cache

i use the collada file format for importing 3d objects into my "system".
nice thing of the collada file format is, it contains informations about animations.
but those animations are only for whole objects, not for vertex data.
if you use it for displaying robots or bone/skin stuff this is ok.
but you can not use it for baking complex animations created in 3ds max.

3ds max has the point cache modifier for objects.
this modifier exports baked and sampled animations to a file.
which is exactly the feature collada is missing.
so you can bake mesh animations for your object and read the exported files in your engine.

using the point cache modifier

1. create your animation using for example the twist modifier on an object
2. put the point cache modifier on top of the modifier stack
3. press record, enter file name and you are done
4. the button "disable modifiers below" you can turn of the animation modifier, now play the animation and you'll se the sampled animation.

point cache pc2 file format

the exported pc2 files contain simple information about the animation and a big chunk of sampled vertex data.
i found a description of the format here

char    cacheSignature[12];   // Will be 'POINTCACHE2' followed by a trailing null character.
int     fileVersion;          // Currently 1
int     numPoints;            // Number of points per sample
float   startFrame;           // Corresponds to the UI value of the same name.
float   sampleRate;           // Corresponds to the UI value of the same name.
int     numSamples;           // Defines how many samples are stored in the file.

this is the header information.
after that the vertex data follows as floats (3 floats for a vertex):