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
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    Rotation when carrying object around

    Scheduled Pinned Locked Moved PYTHON Development
    2 Posts 0 Posters 512 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 15/07/2011 at 07:11, xxxxxxxx wrote:

      Hello all,

      I have been trying to come up with a simple rotation such that the object is always oriented in the direction of movement.

      There are two approaches: adjust the rotation based on the last known orientation
      or recalculate the direction from the delta in movement.

      I have done the latter in the following code, but it doesn't seem to work very well. (The rotation
      is stored in the container just as well, but I couldn't figure out how to do it that way)

      I'd be very grateful if someone could help me out here.

      Thanks

      import c4d, math
      #Welcome to the world of Python

      def main() :

      #get the object where the tag is attached to
        obj=op.GetObject()

      #get the current frame of the document
        frame=doc.GetTime().GetFrame(doc.GetFps())
        xrotglobal = frame / 10.0

      bc = obj.GetData()
        lastrot = bc.GetData( 1009901 )
        lastpos = bc.GetData( 1009902 )

      if lastrot != None:
            obj.SetAbsRot(lastrot)

      oppos   = obj.GetAbsPos()
        oppos.y = 100                # fixed value just for now
        obj.SetAbsPos(oppos)
       
        if lastpos == None:
            lastpos = oppos
        deltapos= oppos - lastpos
        lastpos = oppos

      rot     = deltapos.GetLength()/100.0   # fixed value just for now
        normdel = deltapos.GetNormalized()
       
        lastrot.x  = math.acos(normdel.x)
        obj.SetAbsRot(lastrot)

      lastrot = obj.GetAbsRot()

      bc.SetData( 1009901, lastrot )
        bc.SetData( 1009902, lastpos )

      obj.SetData(bc)

      pass  #put in your code here

      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 15/07/2011 at 16:38, xxxxxxxx wrote:

        Not sure what you are actually asking because "doesn't seem to work very well" is not really a good enough description of the actual problem you are having

        However i would build a look at matrix myself to deal with what i think you are actually trying to do. There is lots of info on the net on building a lookat matrix.

        Basically though i would create a direction vector from  currentpos to lastpos   then build a matrix that targets (currentpos +(direction vector(currentpos - lastpos)))

        So that the objects z axis is always facing in the direction it is travelling as defined by the direction vector.

          bc = obj.GetData()  
          lastpos = bc.GetData( 1009902 )
          
          Object = op.GetObject()
        objMatrix = Object.GetMg()
        p1 = objMatrix.off p2 = p1 + (p1 - lastpos) v0 = p1 v3 = p2 - p1 v3.Normalize() v2 = p2-p1 v2.Cross(c4d.Vector(0,1,0)).Normalize() v1 = p2-p1 v2.Cross(c4d.Vector(0,0,1)).Normalize() m = c4d.Matrix(v0 , v1, v2 , v3) #create new instance of Matrix Rotation = c4d.utils.MatrixToHPB(m) orot = c4d.utils.MatrixToHPB(objMatrix) Rotation.z = orot.z Object.SetAbsRot(Rotation) lastpos = p1#store lastpos
          
          bc.SetData( 1009902, lastpos )  
          obj.SetData(bc) c4d.EventAdd()
          
        
        
        1 Reply Last reply Reply Quote 0
        • First post
          Last post