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

    PolyFX Effector - how

    Scheduled Pinned Locked Moved PYTHON Development
    7 Posts 0 Posters 608 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

      On 26/04/2013 at 02:58, xxxxxxxx wrote:

      I've go this running as a vertex effector (seems to work ok with cloner)

      Someone asked me how to make it work with PolyFX as an effector
      it doesnt work - the effector creates what looks like a tiled image of the vertex map

      Can't seem to find any info on Polyfx
      Can anyone help - pointers, advice

      oh - and if you spot the obvious in the code below - pls feel free to amend

      tia

      Paul

      import c4d
      from c4d.modules import mograph as mo
      from c4d import utils
        
        
      def main() :
          md = mo.GeGetMoData(op)
          if md==None: return False
          
          cnt = md.GetCount()
          marr = md.GetArray(c4d.MODATA_MATRIX)
          start = marr
          fall = md.GetFalloffs()
                  
          tag = op[c4d.ID_USERDATA,1]
          if tag == None: return False 
          
          posn = op[c4d.ID_USERDATA,2]
          scl = op[c4d.ID_USERDATA,4] 
          rot = op[c4d.ID_USERDATA,3]
        
          tagh = tag.GetAllHighlevelData() #get the vertex map as a list of reals matched to each vertex
            
          index = md.GetCurrentIndex()
          for i in reversed(xrange(0, cnt)) :
       
              # scale
              marr[i].v1 = marr[i].v1 * scl.x * tagh[i]
              marr[i].v2 = marr[i].v2 * scl.y * tagh[i]
              marr[i].v3 = marr[i].v3 * scl.z * tagh[i]  
              
              # position
              marr[i].off += marr[i].MulV(posn) *tagh[i]
        
              # rotation       
              marr[i] = marr[i] *utils.HPBToMatrix(rot)         
        
          md.SetArray(c4d.MODATA_MATRIX, marr, True)
          return True
      
      1 Reply Last reply Reply Quote 0
      • H Offline
        Helper
        last edited by

        On 02/05/2013 at 02:22, xxxxxxxx wrote:

        Anyone?

        Appreciate PolyFX  is a different beast to a cloner - but no idea how to access the polys that are controlled by this effector
        Tried searching teh SDK for PolyFX - nothing?

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

          On 04/05/2013 at 02:39, xxxxxxxx wrote:

          last shout - help

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

            On 04/05/2013 at 03:26, xxxxxxxx wrote:

            lol,

            totally overlook this thread somehow. it is very difficult to answer, as you did not really describe
            your problem. you should attach some pictures. generally speaking there are no differences in
            the MoDataData arrays returned by a PolyFx object compared to other cloners. It simply does
            index the object polygons from 0 to n (in full mode).

            the only thing which seems a bit awkward in your code is that you use the same index to 
            reference both your vertexmap and your matrix list. vertexmaps are vertex indexed, while
            the PolyFX object is polygon indexed, not sure if this connection is intended.

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

              On 07/05/2013 at 04:21, xxxxxxxx wrote:

              Thanks LD

              That has helped get a better picture (I think)

              This particular effector needs its Cloner to use OBJECT - VERTEX to place clones and do its business

              If I use the cloner in OBJECT - POLYGON CENTRE mode to place clones using the vertex map I get an odd repeat/tile of the vertex map, that is exactly the same as if using PolyFx and the Vertex effector and creates the problem

              I need to find a way to test for either the USE POLYGON CENTRE mode or VERTEX mode* is running in the cloner -  - or if the Effector is being used by PolyFX*.

              Then (AFAIKS) average out the 4 vertex values if appropriate for the cloner mode, to one value.

              I think I see what you mean about the two indexes - they will be different depending on the Cloner settings or usage*
              Still need to get my head around how to do this.

              Any suggestions welcome.

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

                On 07/05/2013 at 05:20, xxxxxxxx wrote:

                geez,

                i have again problems to understand what you are after. as you are a native speaker I
                suppose the problem is on my side. so i might be answering out of context.

                lets assume you have polygon object made of two polygons :

                poly0 (p0,p1,p2,p3)
                poly1 (p2,p3,p4,p5)

                using the same index as you did will result in :

                poly0value = point0
                poly1value = point1

                which is obviously wrong. you have to translate your matrix index (which is just the
                polygon index) into the the correct sum of point indices for the polygon object on 
                which the vertex map is based on. so in pseudo code it would be something like that:

                for i in xrange(matrixlist) :
                	cpoly = vmappolygonobject.GetPolygon(i)
                	weight = vmapdata[cpoly.a] + vmapdata[cpoly.b] + vmapdata[cpoly.c]
                	if cpoly.c != cpoly.d:
                		weight = (weight + vmapdata[cpoly.d]) / 4
                	else:
                		weight = weight / 3
                	matrixlist = matrixlist * doSomethingWithYourWeight
                

                _ _
                __
                your scaling code seems to be wrong to me too, now that i red your code again

                v0  (vx, 0, 0)
                v1  ( 0,vy, 0)
                v1  ( 0, 0,vz)

                vx,vy,vz define the scale of your object, the other components define the rotation. 
                multiplying the vectors of a matrix with a float will mess up the matrix unless the 
                rotation is zero.

                edit : fixed typos


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

                  On 07/05/2013 at 05:53, xxxxxxxx wrote:

                  Hi LD

                  You have understood the problem (sorry for any confusion, I wish the PluginCafe allowed attachments)

                  and fixing my coding (still not sure how to correct the scaling) - off to look up

                  I only come back to Python once in a while, and it always feel like I'm starting from scratch

                  thank you very much - your help is appreciated 🙂

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