|  |  | If the same normal vector is supplied for all three vertices, POV-Ray
appears to completely ignore them, treats the triangle as a flat
triangle, and assigns the default normal.
I ran into this while testing my update of the Subdivision Surface
include; I'm expanding it to include quadrilateral faces, which I'm
implementing with a pair of triangles.  When the four points of a
quad face are not co-planar, I still want them to have a uniform normal
across the face so that the triangles don't show.  The behavior
mentioned above defeats this aim.
This appears to be an optimization that goes too far. I found a
work-around.
Regards,
John
 Post a reply to this message
 |  | 
|  |  | In article <3E679DE7.6CF6C2A2@hotmail.com>,
 John VanSickle <evi### [at] hotmail com> wrote:
> If the same normal vector is supplied for all three vertices, POV-Ray
> appears to completely ignore them, treats the triangle as a flat
> triangle, and assigns the default normal.
If the normals are equal, it calculates its own normal? That's bad...it 
isn't an overoptimization though, just a misimplementation.
Hmm, the true normal is used by the intersection code, so you can't just 
change that...the quick fix would be to just remove the optimization. 
However, all triangles store the normal indices, they just aren't always 
used...you could store the specified normal in N1. In the parse code for 
smooth triangles, change:
        {
          /* Flat triangle. */
          Compute_Mesh_Triangle(&Triangles[number_of_triangles], false, 
P1, P2, P3, N);
        }
to:
        {
          /* Flat triangle. */
          Triangles[number_of_triangles].N1 = 
Mesh_Hash_Normal(&number_of_normals, &max_normals, &Normals, N1);
          Compute_Mesh_Triangle(&Triangles[number_of_triangles], false, 
P1, P2, P3, N);
        }
or move the N1 computation line to just before the if() statement, and 
in the part that parses solid triangles, after the line:
Triangles[number_of_triangles].Normal_Ind = 
Mesh_Hash_Normal(&number_of_normals, &max_normals, &Normals, N);
Put this line:
          Triangles[number_of_triangles].N1 = 
Triangles[number_of_triangles].Normal_Ind;
In the mesh code, change this line of the non-smooth normal calculation 
part of Mesh_Normal() from:
    Assign_SNGL_Vect(Result, Mesh->Data->Normals[Triangle->Normal_Ind]);
to:
    Assign_SNGL_Vect(Result, Mesh->Data->Normals[Triangle->N1]);
I think that's all...saves the specified normal, but avoids 
interpolating between 3 identical normals. It is entirely untested, 
though. And I haven't even looked at the mesh2 parsing code.
-- 
Christopher James Huff <cja### [at] earthlink  net>
http://home.earthlink.net/~cjameshuff/
POV-Ray TAG: chr### [at] tag  povray  org
http://tag.povray.org/ Post a reply to this message
 |  |