Triangulate Polygon object



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 02/01/2009 at 05:40, xxxxxxxx wrote:

    User Information:
    Cinema 4D Version:   10.1 
    Platform:   Windows  ; Mac  ;  
    Language(s) :     C++  ;

    ---------
    Hi,

    since I got the same problem as fused (see this thread), I tried to get a correctly triangulated model like this:

    > \> void TriangulatePolygonObject(PolygonObject \*op, BaseDocument \*doc, PolygonObject \*res) \> { \>      PolygonObject \*cObj = (PolygonObject\* )(op->GetClone(COPY_NO_BRANCHES|COPY_NO_BITS|COPY_NO_INTERNALS, NULL)); \>      cObj->SetMg(op->GetMg()); \> \>      ModelingCommandData cd; \>      cd.doc = doc; \>      cd.op = cObj; \>      if (SendModelingCommand(MCOMMAND_TRIANGULATE, cd)) \>      { \>           PolygonObject \*result = (PolygonObject\* )(cd.result->GetIndex(0)); \>           if(result) \>           { \>                result->CopyTo(res, COPY_NO_BRANCHES|COPY_NO_BITS|COPY_NO_INTERNALS, NULL); \>                PolygonObject::Free(result); \>           } \>      } \>      PolygonObject::Free(cObj); \> }

    But it doesn't work. SendModelingCommand() always returns TRUE, indicating the command was executed. But result is always NULL. Where's the problem? I call the function like this:

    > PolygonObject \*OrgObj = ToPoly(op); \> PolygonObject \*TriObj = PolygonObject::Alloc(OrgObj- >GetPointCount(), OrgObj->GetPolygonCount()); \> TriangulatePolygonObject(OrgObj, doc, TriObj); \>

    Op is a plane, a landscape or any converted polygon object. Always the same NULL result.

    Tahnks for any help!

    Cheers,
    Jack



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 02/01/2009 at 08:30, xxxxxxxx wrote:

    i believe the object you specify in ModelingCommandData is modified and result is supposed to be NULL.



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 02/01/2009 at 10:06, xxxxxxxx wrote:

    I don't understand. Modified? You mean it's different from the original object in the document?

    Well, I tried to create a temporary document and insert the polygon object there before calling the modeling command (some example by Matthias showed how to do that). But it didn't change the result at all.

    I really have no idea... Also, I still wonder why the Triangulate() function simply outputs a load of crap.

    Cheers,
    Jack



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 02/01/2009 at 11:22, xxxxxxxx wrote:

    The triangulation occurs directly on the original object.



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 02/01/2009 at 12:03, xxxxxxxx wrote:

    Ah, OK, that wasn't clear to me. Thanks Robert :)

    But it is still not working as expected.
    As I understood it, the following code should work:

    > Bool TriangulatePolygonObject(PolygonObject \*op, BaseDocument \*doc, PolygonObject \*res) \> { \>      res = (PolygonObject\* )(op->GetClone(COPY_NO_ANIMATION|COPY_NO_BITS|COPY_NO_INTERNALS, NULL)); \>      res->SetMg(op->GetMg()); \> \>      ModelingCommandData cd; \>      cd.doc = doc; \>      cd.op = res; \>      return SendModelingCommand(MCOMMAND_TRIANGULATE, cd); \> }

    But if e.g. op is a polygon object containing one quad polygon, performing - >GetPolygonCount() on resulting object res still only returns 1. Even better: If I get the points coordinates of this one polygon, they are all 0.

    Damn, how hard can it be to triangulate a simple object?

    Cheers,
    Jack



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 02/01/2009 at 12:21, xxxxxxxx wrote:

    Addition: It seems that the object actually IS correctly triangulated. When I add the following line before returning the result...

    > GePrint("Poly count: " + LongToString(res->GetPolygonCount()));

    ...it outputs "Poly count: 2" in the console.

    But when I call the function and try to get the poly count in the main function...

    > PolygonObject \*OrgObj = ToPoly(op); \> \> PolygonObject \*TriObj = PolygonObject::Alloc(OrgObj->GetPointCount(), OrgObj->GetPolygonCount()); \> \> TriangulatePolygonObject(OrgObj, doc, TriObj); \> \> GePrint("Poly count: " + LongToString(TriObj->GetPolygonCount()));

    ...it outputs "Poly count: 1" again. If I declare TriObj as NULL, it is still NULL after calling TriangulatePolygonObject(), but inside TriangulatePolygonObject() the pointer res is not NULL, since it's getting a clone of the original object.

    I really don't understand. Sorry. I bet it's something totally stupid. It seems that everything I do to res just works inside TriangulatePolygonObject(), but the result is not stored in the original object whose pointer was passed to the function.

    Greetings,
    Jack



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 02/01/2009 at 13:18, xxxxxxxx wrote:

    Just for the archives: Solved the problem. But I have no idea why it didn't work like I showed in the 2 postings above.

    Solution is here.

    > Bool TriangulatePolygonObject(PolygonObject \*op, BaseDocument \*doc)//, PolygonObject \*res) \> { \>      ModelingCommandData cd; \>      cd.doc = doc; \>      cd.op = op; \>      Bool result = SendModelingCommand(MCOMMAND_TRIANGULATE, cd); \>      return result; \> } \>

    Cloning the original object has to be done *before* the function is called. I now do it like this:

    > PolygonObject \*OrgObj = ToPoly(op); \> PolygonObject \*TriObj = (PolygonObject\* )(OrgObj->GetClone(COPY_NO_ANIMATION|COPY_NO_BITS|COPY_NO_INTERNALS, NULL)); \> if (!TriangulatePolygonObject(TriObj, doc)) return FALSE; \>

    Now TriObj contains the triangulated geometry. Don't forget to free it after use ;-)

    Greetings,
    Jack



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 06/01/2009 at 03:26, xxxxxxxx wrote:

    Ah, so solved your problem on your own. Glad it worked out.

    cheers,
    Matthias



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 06/01/2009 at 05:18, xxxxxxxx wrote:

    Yeah, but I solved by pure chance.
    Still don't understand the reason ;-)

    Greetings,
    Jack


Log in to reply