Anim8or Community

Please login or register.

Login with username, password and session length
Advanced search  


An update to Anim8or, v1.00b, is available with a few bug fixes. Get your copy HERE. See the "ReadMe" file for details.

Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Messages - NickE

Pages: [1] 2 3 ... 11
The edgeTable array represents the possible intersections of the marching cube with the point cloud.  The values of the EdgeTable array tell which edges of the marching cube intersect the isosurface with bits 0 to 11 each representing one edge of a cube.  It is way easier to represent binary in hex than decimal.

ASL Scripts / Re: New Write Image Functions.
« on: March 14, 2019, 06:34:39 pm »
Yea!  You rock, Steve! This solves many of the problems with rendering script-driven physics simulations.  I used to have to start an object script, manually switch to scene mode and start rendering, then remove all the duplicate frames from the scene rendering as the object script ran in the background with strategic delays to give the renderer time to finish the frame before the object script incremented.

Ideally, the scene controller parameters "frame" or "time" would be available to object scripts from scene mode, but this is a huge step forward.

Thank you, Steve!

ASL Scripts / Re: BVH File Import into Anim8or
« on: October 06, 2018, 04:23:11 pm »
Have you run into BVH files the BVH2an8 cannot handle?  If so, please post them, and I will see what I can do.

Thank you,

Depending on how your scene will interact with the added foliage, you could try billboarding.  This is a technique where you map a 2D image of the foliage as a texture, transparancy map, and bump map to a plane.  You can direct the plane to always be perpendicular to the camera so that the 2D nature of the plane is not noticable.

ASL Scripts / Re: Find tri's, quads etc in model
« on: February 04, 2017, 07:01:02 pm »
Attached is a simple script that will mark the faces, edges, and vertex points of any face that has more than four sides.

Have you ever had a collection of points and wanted a mesh that corresponded to the surface of those points?

In my never ending quest to bring physics (or to effects that look mostly like physics) to Anim8or through scripting, I was working with smoothed particle hydrodynamics (SPH) to simulate fluids.  Using Anim8or points as particles, I was able to write scripts to simulate the fluid action, but had no real way of rendering just points.  The actual SPH script is still in development.

One popular way to extract a surface mesh from a point cloud is to use a technique called Marching Cubes.

Below is an implementation of the the Marching Cubes Algorithm in ASL.  The documentation for usage is within the script itself.

General Anim8or Forum / Re: poly groups/ vertex groups
« on: June 23, 2016, 05:42:42 pm »
It is unclear what you are asking.  There is the ability to select by material:  Edit->Select->Select by Material

ASL Scripts / Re: Boolean operation problem!
« on: May 07, 2016, 11:53:34 pm »

I personally do not use Kubajzz Boolean Scripts A-B or B-A.  I use the one attached below.

I looked at the an8 file you attached.  Your mesh "meshHH" had several problems including interior lines and duplicate points.  Your mesh "meshSS" had all its normals flipped inward, a couple of extra edges and several duplicate points.  These issues are probably what is causing the errors with the Kubajzz A-B Boolean script.

When I fixed these issues and ran the attached boolean operations script (selecting the "meshSS" so it would be subtracted from "meshHH"), the result was a good subtraction with the exception of a few faces with flipped normals.  I have attached the an8 file so you can compare the original vs repaired meshes and the results of the Boolean subtraction.


ASL Scripts / Re: Boolean operation problem!
« on: May 06, 2016, 06:51:08 pm »

In the header of the script file is the instruction on how to execute the script.

Quick instructions:
Have an object that contains the two meshes that you want use for the boolean operations.
If you wish to do a Union operation, do not select either mesh and execute the script by Scripts->Run Script File...
If you wish to do a Difference operation, select the mesh that will be subtracted from the other, then execute the script
If you wish to do a Intersection operation, select both meshes, then execute the script

If you need more guidance, please let me know.


Anim8or v0.98 Discussion Forum / Re: Bug/Issue: Normals (ASL)
« on: March 08, 2016, 08:08:06 pm »

When I calculate the face normals from the average of the face vertex normals (calculated from the edge vectors from each point of the face), I do get different values than your script returns.  The edge vector calculated values return symmetrical normals for mirrored faces on your attached mesh.  I modified your script to add the manually calculated normals to the output.  You can see the variation in the individual vertex based face normals.  It seems the algorithm that Anim8or is using is significantly different or is suffering from a precision problem.

Code: [Select]
file $c;
shape $s, $childShapes[0];
int $i, $j, $k;
int $numSides;
point3 $faceNormal;

int $l,$back,$fwd;
point3 $facePoint[0];
point3 $facePointNormal[0];
point3 $fPNavg;
$"$console", "w");
for $i = 0 to $childShapes.size - 1 do
if($childShapes[$i].GetKind() == SHAPE_KIND_MESH)
$s = $childShapes[$i];
for $j = 0 to $s.GetNumFaces() - 1 do
if ($s.GetFaceSelected($j) == 1)
//$faceNormal = $s.GetNormal($s.GetFaceNormalIndex($j, 0));
$numSides = $s.GetNumSides($j);
        $facePoint.size = $numSides;
        $facePointNormal.size = $numSides;
for $k = 0 to $numSides - 1 do
$faceNormal = $faceNormal + $s.GetNormal($s.GetFaceNormalIndex($j, $k));
$faceNormal = normalize(($faceNormal.x/(1.0 * $numSides), $faceNormal.y/(1.0 * $numSides), $faceNormal.z/(1.0 * $numSides)));

for $k = 0 to $numSides-1 do
          $back = $k - 1;
          if ($back < 0) $back = $numSides - 1;
          $fwd = $k + 1;
          if ($fwd > ($numSides - 1)) $fwd = 0;
          $facePointNormal[$k] = normalize(cross(($facePoint[$back]-$facePoint[$k]),($facePoint[$fwd]-$facePoint[$k])));
          $c.print("Calc FP %d Normal (%.3f,%.3f,%.3f)\n",$k,$facePointNormal[$k]);
          $fPNavg = $fPNavg + $facePointNormal[$k];
        $fPNavg = normalize(($fPNavg.x / (1.0 * $numSides),$fPNavg.y / (1.0 * $numSides),$fPNavg.z / (1.0 * $numSides)));
$c.print("Face %d Anim8or normals (%.3f, %.3f, %.3f) Calc (%.3f, %.3f, %.3f)\n", $j, $faceNormal, $fPNavg);


ASL Scripts / Re: BVH File Import into Anim8or
« on: January 24, 2016, 11:51:51 am »
Like Claude posted, if you post the BHV file and parameters, I will take a look.  Often, these issue happen because so many different BVH generators write slightly differing formats that the parser does not anticipate or the file is simply malformed.


ASL Scripts / Re: SetFacePointIndex method
« on: January 07, 2016, 12:39:01 pm »

I am not sure which script your are referring to as "parametric SourceMesh2Target".

If you are referring to the parametric script in,906.msg6613.html#msg6613 called "mesh2mesh_1.a8s", I tested it in Build 1205 and it worked fine for me.  You kind of have to click the script button, then sort of click-drag a bit in some open area and the parametric copies appear.

What behavior are you seeing?

Thank you,

ASL Scripts / Re: SetFacePointIndex method
« on: January 06, 2016, 01:52:07 pm »

When I ran through the tank tread tutorial (including downloading the scripts posted there) on Build 1205, it worked properly.

Also the mesh_2_path_2 worked properly without hanging when I tried it.

Could it be something unique to your setup?  I am happy to help in any way.

ASL Scripts / Re: SetFacePointIndex method
« on: January 05, 2016, 08:38:32 am »
Luckily, "new" edges are always added to the end of the list, so as a workaround, I can just delete them without it causing problems with rearranging the index.

I had no idea that these scripts had stopped working.  I haven't used them in quite some time.  I will investigate further.

Thank you!

ASL Scripts / Re: SetFacePointIndex method
« on: December 31, 2015, 09:16:34 am »
The full code is below.  Unfortunately, I have opened and closed the mesh properly.

Code: [Select]
/* fix normals
   change all faces to the same orientation by starting with the first face.
   The direction of vertex winding is noted and compared to each edge adjacent face.
   If the direction of vertex winding is the same (should be opposite), fix it.

/* section to initialize console output */
file $output;
string $fname;

object $curObject;
shape $shape, $shapes[0], $childShapes[1],$source;

int $havesource,$sourcenumpts,$sourcenumfaces,$sourcenumedges;

int $i,$j,$k,$m,$n;
int $tempedgeindex,$epi1,$epi2,$epi1_p,$epi2_p,$firstface;
int $tepi1,$tepi2,$tepi1_p,$tepi2_p;
int $f1,$f2;
int $cw1,$cw2;
int $flipped;
int $facestatus[0],$edgeface1[0],$edgeface2[0];
int $mainedge,$checkedge;
int $otherface;
int $ofptindex[0];

$curObject = project.curObject;
$shapes.size = 0;
while ($childShapes.size > 0)
while ($shapes.size > 0) {
    $shape = $shapes.pop();

    if ($shape.GetKind() == SHAPE_KIND_MESH && $havesource == 0)

if ($havesource == 1) {
    /* build index of Edges to Faces to save cycles*/
    for $i = 1 to $sourcenumedges do
        for $j = 0 to $sourcenumfaces-1 do
            for $k = 0 to $source.GetNumSides($j)-1 do
                $tempedgeindex = $source.GetEdgeIndex($j,$k);
                if (abs($tempedgeindex) == $i) {
                    if ($firstface==0) {
                    } else {
    /* output list of the edges with the faces connected to it */
    for $i = 1 to $sourcenumedges do {
        $output.print("E:%d F1:%d F2:%d\n",$i,$edgeface1[$i],$edgeface2[$i]);
    /* Cycle through faces edges to determine if adjacent faces have the same normals
       If the clockwise-counterclockwise order of face points is the same for adjacent faces,
       the normals are flipped
    for $i = 0 to $sourcenumfaces-1 do {
        for $j = 0 to $source.GetNumSides($i)-1 do {
            $mainedge = $source.GetEdgeIndex($i,$j);                                /* current edge of current face */
            $epi1=$source.GetEdgeIndex0($mainedge);                                 /* end point of current edge */
            for $k = 0 to $source.GetNumSides($i)-1 do {
                if ($epi1==$source.GetFacePointIndex($i,$k)) $epi1_p=$k;            /* position in face vertex winding */
                if ($epi2==$source.GetFacePointIndex($i,$k)) $epi2_p=$k;
            $output.print("F:%d E:%d ep1:(%d,%d) ",$i,$mainedge,$epi1_p,$epi2_p);
            if ($edgeface1[$mainedge] == $i) {                                     
            } else {
            $ofptindex.size=$source.GetNumSides($otherface);                        /* retrieve other face with same edge */
            for $k = 0 to $source.GetNumSides($otherface)-1 do {
                $ofptindex[$k] = $source.GetFacePointIndex($otherface,$k);
                if ($epi1==$source.GetFacePointIndex($otherface,$k)) $tepi1_p=$k;   /* position in other face vertex winding */
                if ($epi2==$source.GetFacePointIndex($otherface,$k)) $tepi2_p=$k;
            $output.print("F:%d E:%d ep1:(%d,%d) ",$otherface,$mainedge,$tepi1_p,$tepi2_p);
            if (abs($epi1_p - $epi2_p)==1) {                                        /* logic to determine direction of winding */
                if ($epi1_p > $epi2_p) {                                            /* can be simplified a bit :) */
                } else {
            } else {
               if ($epi1_p > $epi2_p) {
               } else {

            if (abs($tepi1_p - $tepi2_p)==1) {
               if ($tepi1_p > $tepi2_p) {
               } else {
            } else {
               if ($tepi1_p > $tepi2_p) {
               } else {
            if ($cw1 == $cw2) $flipped=1;
            if ($cw1 == $cw2) {
                for $k = 0 to $source.GetNumSides($otherface)-1 do {
                    $source.SetFacePointIndex($otherface,$k,$ofptindex[$source.GetNumSides($otherface)-1-$k]);  /* reverse winding order of other face */
                    $output.print("Alter F:%d v:%d was:%d now:%d\n",$k,$otherface,$ofptindex[$k],$ofptindex[$source.GetNumSides($otherface)-1-$k]);


Thank you!

Pages: [1] 2 3 ... 11