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 reasonGreetings,
Jack