Point Normal



  • On 26/08/2013 at 10:03, xxxxxxxx wrote:

    Hi,

    is there by any chance a function that will return the Point Normal, given a Point Object and a point id? Basically like the xpresso Point node...

    Cheers
    Michael



  • On 26/08/2013 at 10:31, xxxxxxxx wrote:

    There is no built-in method. You can calculate the vertex normal by taking the average of the normal
    of all adjacent polygons. A vertex without adjacent polygons does simply not have a normal.

    Cheers,
    -Niklas



  • On 26/08/2013 at 10:35, xxxxxxxx wrote:

    There isn't even really a method to calculate polygon normals. There is PolygonObject.
    CreatePhongNormals(), but it does require a (already cached / executed) phong tag. 
    Calculating the normals yourself might be the fastest way, simply calculate all polygon 
    normals for the mesh.

    > normallist[polyindex] = ((poly.VecB - poly.VecA) % (poly.VecC -poly.VecA)).GetNormalized()

    Then calculate the point normal for each point.

    > pnormal = Vector()
    >
    > cnt = 0
    >
    > for each polygon attached to point:
    >
    > pnormal += normallist[polygon]
    >
    > cnt += 1
    >
    > pnormal *= (1.0/cnt)

    edit : nikklas was faster and FYI, the example is meant for triangles of course, for quads or
    mixed meshes you have to extend the polygon normal calculation for nonplanar quads to the 
    fourth point.



  • On 26/08/2013 at 10:56, xxxxxxxx wrote:

    Originally posted by xxxxxxxx

    [...] FYI, the example is meant for triangles of course, for quads or
    mixed meshes you have to extend the polygon normal calculation for nonplanar quads to the 
    fourth point.

    You actually only have to replace the C in your calculation with the D and don't take C into
    account at all.

    points = op.GetAllPoints()
        polygons = op.GetAllPolygons()
        normals = []

    for p in polygons:
            a = points[p.a]
            b = points[p.b]
            c = points[p.c]
            d = points[p.d]

    n = (b - a).Cross(d - a).GetNormalized()
            normals.append(n)

    The value of D == C for a triangle, therefore the calculation is valid for triangles and quads and
    you do not have to distinguish them explicitly.

    Cheers,
    -Niklas



  • On 27/08/2013 at 01:13, xxxxxxxx wrote:

    You actually only have to replace the C in your calculation with the D and don't take C into
    account at all.

    points = op.GetAllPoints()
        polygons = op.GetAllPolygons()
        normals = []

    for p in polygons:
            a = points[p.a]
            b = points[p.b]
            c = points[p.c]
            d = points[p.d]

    n = (b - a).Cross(d - a).GetNormalized()
            normals.append(n)

    The value of D == C for a triangle, therefore the calculation is valid for triangles and quads and
    you do not have to distinguish them explicitly.

    Cheers,
    -Niklas

    Thanks guys! I'll give it a go right away...


Log in to reply