Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware 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

    Set Base View Rotation and Position

    Cinema 4D SDK
    python
    3
    11
    1.3k
    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.
    • D
      Djoneeeee
      last edited by

      Hello Guys
      I make Python script for convertation 3dsMax to C4D and want set position and rotation to 3d view in c4d Viewport for emulation position 3ds max,
      I find only BaseView.GetMg(), but dont find BaseView.SetMg()
      Mb i can set camera and delete with save pos and rot?
      I hope for you help with attached code

      ferdinandF 1 Reply Last reply Reply Quote 0
      • CairynC
        Cairyn
        last edited by

        I don't see any code attached. But anyway, you need to get to the BaseDraw (which is a child class of BaseView). There you will find HasCameraLink(), which will tell you whether the editor camera is active, or some camera in the scene. GetEditorCamera() returns you the editor camera, and GetSceneCamera() the camera that is active in the scene, if there is any. These cameras are BaseObjects with all their matrix functions to set rotation, position, scale.
        Depending on what you do, you may need to create a scene camera as object in the ObjectTree and set it in your BaseDraw.

        D 1 Reply Last reply Reply Quote 0
        • D
          Djoneeeee @Cairyn
          last edited by

          @cairyn Thanks for the answer, unfortunately there is no code yet, I have no idea how to create this code snippet.
          I can get position and rotation 3d Viewer use command BaseView.GetMg(), but i cant set position and rotation 3d viewer.
          I need change 3d viewer transformation without create new objects or cameras.
          My task is the following: I have a matrix with rot, pos, I need to get the rotation and position viewport (3d viewer or warden) from the matrix values.
          You can put the camera in this position to display the object, but I need not to have this camera on the scene. if the camera is removed the viewer will move to the begin position.

          1 Reply Last reply Reply Quote 0
          • CairynC
            Cairyn
            last edited by

            You get your current document's BaseDraw with BaseDocument.GetActiveBaseDraw(). If you don't want to add anything to the scene, then you need to force the viewport to use the editor camera by SetSceneCamera(None). Then as mentioned already you can get the editor camera with GetEditorCamera(). This camera is part of the viewport and not the scene.

            I assume you have a document, otherwise I'm afraid I do not understand what this script is supposed to do. Or are you actually programming a SceneLoaderData plugin? What is the execution context for this task?

            D 2 Replies Last reply Reply Quote 0
            • D
              Djoneeeee @Cairyn
              last edited by

              @cairyn I have a document.
              The main task is to convert 3d max format to c4d using xml file and fbx file. I want the 3d viewer in 3d max to copy the position and rotation to the c4d file. I have the position and rotation of a 3d viewer from 3d max, it remains to set the position and rotation in the c4d file.
              I will try your method, but without an example it is not very clear to me

              1 Reply Last reply Reply Quote 0
              • D
                Djoneeeee @Cairyn
                last edited by

                @cairyn It’s just that the 3D viewer can also move quietly on the work surface, which means it has position and rotation, I want to set this position and rotation somehow, I’m interested in how it can be done only position and rotation.

                1 Reply Last reply Reply Quote 0
                • CairynC
                  Cairyn
                  last edited by

                  Well, here's a script which shows the steps in connection. The editor camera for the current document is activated and moved 50 units along its x axis (just to have some change of position; rotation is equivalent). Since the editor camera cannot have a parent, its reference system is always world.

                  import c4d
                  from c4d import gui
                  
                  def main():
                      bd = doc.GetActiveBaseDraw() # the basedraw of the viewport that shows the document
                      if bd == None:
                          print ("This document does not have an active BaseDraw!")
                          return
                      bd.SetSceneCamera(None) # forces viewport to use editor camera
                      cam = bd.GetEditorCamera() # the editor camera itself
                      camPos = cam.GetAbsPos()
                      camPos[0] += 50
                      cam.SetAbsPos(camPos)
                      
                      c4d.EventAdd()
                  
                  if __name__=='__main__':
                      main()
                  
                  D 1 Reply Last reply Reply Quote 0
                  • D
                    Djoneeeee @Cairyn
                    last edited by

                    @cairyn Thank you so much) This is what I was looking for! magic)

                    1 Reply Last reply Reply Quote 0
                    • ferdinandF
                      ferdinand @Djoneeeee
                      last edited by ferdinand

                      Hello @Djoneeeee,

                      welcome to the Plugin Café community and thank you reaching out to us. I would invite you having a look at our Forum Guidelines for future postings. I have marked this topic as a question.

                      Thank you @Cairyn for providing an answer. We do not have much to add here. The only thing I would point out is that:

                      bd.SetSceneCamera(None) # forces viewport to use editor camera
                      

                      is formally not necessary. It is not that this would be wrong what @Cairyn did there, it is only that this will reset the camera of the viewport to the internal one. So, when a user has linked a camera to a viewport, e.g., set a camera as a rendering camera, this line of code will make that camera inactive and default to the internal viewport camera. Which might have a completely different transform. When you do not want this to happen, you can just skip this line and directly call:

                      cam = bd.GetEditorCamera() # the editor camera itself
                      

                      Cheers,
                      Ferdinnand

                      MAXON SDK Specialist
                      developers.maxon.net

                      CairynC 1 Reply Last reply Reply Quote 0
                      • CairynC
                        Cairyn @ferdinand
                        last edited by

                        @ferdinand said in Set Base View Rotation and Position:

                        So, when a user has linked a camera to a viewport, e.g., set a camera as a rendering camera, this line of code will make that camera inactive and default to the internal viewport camera.

                        Yep, that was the intent since the OP said they did not want a camera in the scene ("I need not to have this camera on the scene") but I may have misinterpreted the meaning. Not familiar with how 3dsMax handles its cameras.

                        ferdinandF 1 Reply Last reply Reply Quote 0
                        • ferdinandF
                          ferdinand @Cairyn
                          last edited by

                          @cairyn said in Set Base View Rotation and Position:

                          @ferdinand said in Set Base View Rotation and Position:

                          So, when a user has linked a camera to a viewport, e.g., set a camera as a rendering camera, this line of code will make that camera inactive and default to the internal viewport camera.

                          Yep, that was the intent since the OP said they did not want a camera in the scene ("I need not to have this camera on the scene") but I may have misinterpreted the meaning. Not familiar with how 3dsMax handles its cameras.

                          Yeah, I figured that this was probably intentional, but I just wanted to clarify that it is a bit of an odd thing to do.

                          Cheers,
                          Ferdinand

                          MAXON SDK Specialist
                          developers.maxon.net

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