Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Recent
    • Tags
    • Users
    • Login

    Polygon Normal

    Scheduled Pinned Locked Moved SDK Help
    11 Posts 0 Posters 825 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H Offline
      Helper
      last edited by

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

      On 05/08/2011 at 19:08, xxxxxxxx wrote:

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

      ---------
      Hey everyone,  I want to change the normal of a polygon based on the direction of a line drawn.  I want the normal of the polygon to match the direction of the drawn line.  How would I accomplish this,  is this something I need a NormalTag for?

      Thanks,

      Shawn

      1 Reply Last reply Reply Quote 0
      • H Offline
        Helper
        last edited by

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

        On 06/08/2011 at 01:28, xxxxxxxx wrote:

        To reverse the normal, you need to invert the order of points of the polygon.

        a -> d
        b -> c
        c -> b
        d -> a

        1 Reply Last reply Reply Quote 0
        • H Offline
          Helper
          last edited by

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

          On 06/08/2011 at 05:19, xxxxxxxx wrote:

          Hey Nux,

          Thanks for the reply. I don't so much want to invert the normal as I do want to rotate it a bit.  🙂

          See the attached image.

          You can see the first cube the normal follows the world.  But the second cube, the normal has rotated to face the mouse cursor which is represented by the red dot.  🙂  This is the effect I desire.  I was thinking I might need to make a rotation matrix for the polygon and rotate the entire polygon based on that matrix.  But I wondered if anyone knew a better approach.  🙂

          Thanks again,

          ~Shawn

          1 Reply Last reply Reply Quote 0
          • H Offline
            Helper
            last edited by

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

            On 06/08/2011 at 06:36, xxxxxxxx wrote:

            I don't think that's quite right, Shawn. It's the polygon which has rotated, not the normal. The normal is perpendicular to the polygon, by definition.

            So you need to rotate the actual polygon to follow the red dot.

            Steve

            1 Reply Last reply Reply Quote 0
            • H Offline
              Helper
              last edited by

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

              On 06/08/2011 at 06:51, xxxxxxxx wrote:

              1. Cool idea 😄
              2. I think there is only the way rotating the points with the matrix.

              You need to calculate the polyogn midpoint, subtract the points positions form it, multiply it with the matrix and then add the polygons midpoint to it again, I think. 😉

              Cheers,

              1 Reply Last reply Reply Quote 0
              • H Offline
                Helper
                last edited by

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

                On 06/08/2011 at 08:12, xxxxxxxx wrote:

                cool.  I will give that a try.  Thanks guys.

                Shawn

                1 Reply Last reply Reply Quote 0
                • H Offline
                  Helper
                  last edited by

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

                  On 06/08/2011 at 21:56, xxxxxxxx wrote:

                  Well that didn't give me the results I was hoping.

                  Here's what I am doing.

                  First I find the center of the polygon..   this is named ctr.

                  then I develop a rotation matrix of that polygon by doing this.

                    
                    
                  //Polygon Rotation Matrix  
                                //=====================================//  
                                Vector p        = points[a];    //polygon point  
                                Vector n        = CalcFaceNormal(points, polys[i]); //Normal  
                                Vector scale    = Vector(Len(objPoly->GetMg().v1), Len(objPoly->GetMg().v2), Len(objPoly->GetMg().v3)); //Get Scale  
                    
                                //Contruct Matrix  
                                rm.off = ctr;                //The base of the matrix  
                                rm.v1 = !((p - ctr) % n);    //X axis points toward the second point  
                                rm.v2 = !(rm.v1 % n);        //Y Axis is perpendicular to the X axis  
                                rm.v3 = !(n);                //Z Axis is along the normal  
                    
                                //Scale the Matrix  
                                rm.v1 = !(rm.v1 * scale.x);  
                                rm.v2 = !(rm.v2 * scale.y);  
                                rm.v3 = !(rm.v3 * scale.z);  
                                //=====================================//  
                    
                  

                  Then I find the mouse position in world space with...

                    
                    
                  //Cursor Position in World Coordinates  
                                Vector msWorld    = bd->SW(mx, my, ctr);  
                    
                                //Distance from the mouse to the polygon  
                                Vector dis        = msWorld - ctr;  
                    
                  

                  so now what I want to do is to alter the rotation matrix that I found using the directional vector calculated by dis.   this vector gives me the distance between the polygon center and the mouse cursor in world space.  So I know I will need to alter the points of the polygon based on the "dis" and the rotation matrix.   I am just not sure how to do this.  I tried the steps you mentioned above nux and I got some very weird results.  points went all over.  🙂

                  Any thoughts on how to rotate the polygon so that the normal of the polygon is pointing in the same direction as a line drawn between ctr & msWorld?

                  Thanks,

                  Shawn

                  1 Reply Last reply Reply Quote 0
                  • H Offline
                    Helper
                    last edited by

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

                    On 07/08/2011 at 01:59, xxxxxxxx wrote:

                    Ah, I think you must rotate it about the delta between the Matrix of the normal and the matrix of the wished direction. I think .. I'm not good at matrix-maths, sorry 😄

                    Sth like

                    Matrix rm1 = HPBToMatrix(polygonNormal);  
                    Matrix rm2 = HPBToMatrix(mousePosition);  
                    Matrix rm3 = rm2 - rm1;  
                      
                    pointA = pointA * rm3;  
                    pointB = pointB * rm3;  
                    ...
                    

                    Not quite sure..

                    1 Reply Last reply Reply Quote 0
                    • H Offline
                      Helper
                      last edited by

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

                      On 07/08/2011 at 06:23, xxxxxxxx wrote:

                      Okay well that puts me on teh right track.. I am not getting the right rotation but at least I am not getting rotation.  Thanks nux

                      ~Shawn

                      1 Reply Last reply Reply Quote 0
                      • H Offline
                        Helper
                        last edited by

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

                        On 07/08/2011 at 08:31, xxxxxxxx wrote:

                        Is it possible to reverse engineer a polygon from only the normal?  If I have a line that would represent the normal of a polygon is there a formula for finding points on that plane?

                        Actually I have the normal and the center point of the polygon.  🙂

                        ~Shawn

                        1 Reply Last reply Reply Quote 0
                        • H Offline
                          Helper
                          last edited by

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

                          On 07/08/2011 at 14:03, xxxxxxxx wrote:

                          If you have a normal and the center-point of a polygon, there is no unique mapping. The Points can rotate around the center and always create the "correct polygon".

                          You have to define at least 1 more vector for the axis-system, then the points have a uniquely defined position in space. If you imagine sitting at the center-point looking in the direction of the normal, it is obvious that we could just "bank" and still be in the center and still be looking along the normal.

                          So, given the normal and an additional vector, you multiply the two with the cross-product and you will receive the third vector. All together define the axis-system for the polygon.

                          Once the axis is calculated, you can easily calculate the polygon-points positions.

                          Cheers,
                          maxx

                          1 Reply Last reply Reply Quote 0
                          • First post
                            Last post