• Login
sketchucation logo sketchucation
  • Login
πŸ€‘ SketchPlus 1.3 | 44 Tools for $15 until June 20th Buy Now

[CODE] Camera settings

Scheduled Pinned Locked Moved Developers' Forum
28 Posts 5 Posters 4.3k 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.
  • C Offline
    chrisglasier
    last edited by 9 Feb 2010, 01:52

    If anyone has any ready made snippets of code for retrieving and setting the camera I would be grateful.

    Thanks

    With TBA interfaces we can analyse what is to be achieved so that IT can help with automation to achieve it.

    1 Reply Last reply Reply Quote 0
    • T Offline
      todd burch
      last edited by 9 Feb 2010, 04:35

      Do you mean like

      
      eye = Sketchup.active_model.active_view.camera.eye
      target = Sketchup.active_model.active_view.camera.target 
      up = Sketchup.active_model.active_view.camera.up 
       
      # flip the camera upside down 
      up.reverse! 
      
      Sketchup.active_model.active_view.camera.set(eye, target, up) 
      
      

      ?

      1 Reply Last reply Reply Quote 0
      • C Offline
        chrisglasier
        last edited by 9 Feb 2010, 04:43

        Thanks Todd. If possible I want to code for whatever saving this camera location does ...camera.png.

        With TBA interfaces we can analyse what is to be achieved so that IT can help with automation to achieve it.

        1 Reply Last reply Reply Quote 0
        • C Offline
          chrisglasier
          last edited by 9 Feb 2010, 04:56

          So using your snippets I get two arrays to save as plain text and then return to set up the same scene.

          camera002.png

          Would that work, or is there something I should know about (seems too easy!)

          Thanks

          With TBA interfaces we can analyse what is to be achieved so that IT can help with automation to achieve it.

          1 Reply Last reply Reply Quote 0
          • T Offline
            todd burch
            last edited by 9 Feb 2010, 05:09

            It can be that easy. It depends on where and how you are saving the information, and how much info you want to save.

            If you browse the methods for the Camera class, there are a few others that can be saved as well, such as fov, perspective and aspect_ratio.

            For positioning the camera, all you need is camera.eye and camera.target and camera.up. The other info is camera settings.

            1 Reply Last reply Reply Quote 0
            • C Offline
              Chris Fullmer
              last edited by 9 Feb 2010, 05:10

              I thought there was an easier way to do this, but you can just create a new camera object using all the data of the current view camera. Like this:

              cam = Sketchup.active_model.active_view.camera
              cam1 = Sketchup;;Camera.new(cam.eye, cam.target, cam.up, cam.perspective?, cam.fov)
              

              Then to activate your new camera, use:

              Sketchup.active_model.active_view.camera=cam1

              That should do the trick. Again though, for some reason I was thinking there was an easier way to clone a camera. But just specifying every attribute one by one on creation seems to work fine.

              Chris

              Lately you've been tan, suspicious for the winter.
              All my Plugins I've written

              1 Reply Last reply Reply Quote 0
              • C Offline
                chrisglasier
                last edited by 9 Feb 2010, 05:27

                @chris fullmer said:

                I thought there was an easier way to do this, but you can just create a new camera object using all the data of the current view camera. ...

                That should do the trick.

                Chris

                Thanks Chris - crossed with my last post - takes a little time for the notification to hobble over here. I will have a look after lunch, but at first look seems there are no strings.

                With TBA interfaces we can analyse what is to be achieved so that IT can help with automation to achieve it.

                1 Reply Last reply Reply Quote 0
                • C Offline
                  Chris Fullmer
                  last edited by 9 Feb 2010, 05:30

                  I really recommend stealing those values from the current view camera, like in my example. Unless you really need to set them from some other source.

                  The camera is really pretty simple. Just dig around the methods in the camera class, and notice there are 2 methods in the View class of worth ( View.camera to get the current camera object and View.camera= to set the view to a camera object you have made).

                  That is pretty much it. Make a camera object, then set it to active if you want to see through that camera.

                  EDIT: Strings? Not quite sure what you mean by that. I hope that means you think that my example looks easy enough to implement πŸ˜„

                  Lately you've been tan, suspicious for the winter.
                  All my Plugins I've written

                  1 Reply Last reply Reply Quote 0
                  • C Offline
                    chrisglasier
                    last edited by 9 Feb 2010, 06:15

                    @chris fullmer said:

                    EDIT: Strings? Not quite sure what you mean by that. I hope that means you think that my example looks easy enough to implement πŸ˜„

                    Yes I thought it might be taken to mean that, but I was under heavy "dumplings getting cold" pressure. "Sik fan" (lit. eat rich) is ignored at great peril. I meant I need to store everything as strings (json).

                    But I think what you propose will be very useful for animation - something for the future. Thanks.

                    With TBA interfaces we can analyse what is to be achieved so that IT can help with automation to achieve it.

                    1 Reply Last reply Reply Quote 0
                    • C Offline
                      chrisglasier
                      last edited by 9 Feb 2010, 06:58

                      @Todd

                      Not quite there yet but I guess it will be saved something like:

                      
                      {"Camera;{"eye";[993.128, -480.024, 2582.52],"target";[215.488, 474.905, 217.629],"up";[-0.560065, 0.68775, 0.461873]}}
                      
                      

                      Thanks I will give the other things a whirl when I am more conversant with the basics.

                      With TBA interfaces we can analyse what is to be achieved so that IT can help with automation to achieve it.

                      1 Reply Last reply Reply Quote 0
                      • C Offline
                        Chris Fullmer
                        last edited by 9 Feb 2010, 08:26

                        Well they can all be converted to strings, right? And then turned back into floats or true/false type values if you bring them back into SU. Am I missing something here? This is the answer to the question, unless I'm misunderstanding the question.

                        Lately you've been tan, suspicious for the winter.
                        All my Plugins I've written

                        1 Reply Last reply Reply Quote 0
                        • C Offline
                          chrisglasier
                          last edited by 9 Feb 2010, 08:37

                          @chris fullmer said:

                          Well they can all be converted to strings, right? And then turned back into floats or true/false type values if you bring them back into SU. Am I missing something here? This is the answer to the question, unless I'm misunderstanding the question.

                          I see. I have never done anything with the camera coding, that is why I asked the question in advance of starting that work. I am now doing exposing layers that have mixed groponents/dimensions/text, so perhaps I was not concentrating properly. But I hope to start/finish on the camera in a couple of days, so all the possibilities are most welcome - thanks Chris

                          With TBA interfaces we can analyse what is to be achieved so that IT can help with automation to achieve it.

                          1 Reply Last reply Reply Quote 0
                          • DavidBoulderD Offline
                            DavidBoulder
                            last edited by 11 Feb 2010, 16:28

                            I have a script I'm working on where I'm trying to iterate through scenes/pages and look for faces parallel to the camera for each scene. I have the code to iterate through faces and test to see if parallel to the camera, but I could find a way to grab the camera for other scenes to iterate my tests across all scenes.

                            I suppose I can change to each scene and then get current camera view, but I would think I should be able to grab the camera from a scene without having to change to that scene. Keep in mind, I don't know the scene names.

                            edited content below

                            OK, I solved my problem, here is a piece of the code.

                            
                            # draft script - David Goldwasser
                            # find faces parallel to camera and draw lines back to camera
                            
                            model = Sketchup.active_model
                            entities = model.active_entities
                            pages = model.pages
                            
                            faces = []
                            entities.each do |n|
                             faces.push n if n.is_a? Sketchup;;Face
                            end
                            
                            pages.each do |page|
                            camera = page.camera
                            eye = camera.eye
                             faces.each do |face|
                              status = camera.direction.parallel? face.normal
                              if status then
                              edges = face.edges
                              edges.each do |edge|
                               pts = []
                               pts [0] = eye
                               pts[1] = edge.start.position
                               pts[2] = edge.end.position
                               face = entities.add_face pts
                               end
                              else
                              end
                             end
                            end
                            
                            

                            The pages.each do is where I was having problems before. I was actually switching to that page and then getting current view, camera etc. But the animation was causing problems, so I had to have a dummy UI.messagebox to get it to behave. Now I don't and it is much cleaner.

                            So I have an edges.each nested in a faces.each, nested in a pages.each. My indentation for isn't so clear when previewed here.

                            --

                            David Goldwasser
                            OpenStudio Developer
                            National Renewable Energy Laboratory

                            1 Reply Last reply Reply Quote 0
                            • C Offline
                              chrisglasier
                              last edited by 15 Feb 2010, 02:04

                              When I regenerate a scene without zoom extents the scale is very small. Zoom extents would be OK if I didn't want to capture the original zoom that produced close ups for example. But I think it important, so if anyone can help I would be grateful.

                              Thanks

                              With TBA interfaces we can analyse what is to be achieved so that IT can help with automation to achieve it.

                              1 Reply Last reply Reply Quote 0
                              • C Offline
                                Chris Fullmer
                                last edited by 15 Feb 2010, 03:40

                                I'm not quite sure what you mean. Zoom extents is a separate matter, not really related to scenes, except that it can change the camera position.

                                So do you want to use zoom extents? Or not use it? Or do you want to match the scene camera settings precisely? Or do you want to get the scene camera, zoom extents, then update the scene camera to reflect the new camera? Or probably something entirely different that I'm missing? πŸ˜„

                                Chris

                                Lately you've been tan, suspicious for the winter.
                                All my Plugins I've written

                                1 Reply Last reply Reply Quote 0
                                • C Offline
                                  chrisglasier
                                  last edited by 15 Feb 2010, 03:54

                                  @chris fullmer said:

                                  ... Or do you want to match the scene camera settings precisely?

                                  Yes I want to match them precisely. I just used zoom extents because the display was ridiculously tiny. Do you have have an idea why?

                                  When zooming you change the camera position or something else? I didn't use new camera but active camera, perhaps that is what is wrong. All the scenes are reconstructed in the one Nameset tab by showing/hiding components (only layers for dims and notes).

                                  Thanks

                                  With TBA interfaces we can analyse what is to be achieved so that IT can help with automation to achieve it.

                                  1 Reply Last reply Reply Quote 0
                                  • C Offline
                                    Chris Fullmer
                                    last edited by 15 Feb 2010, 04:04

                                    So to further understand now: You have an existing model with scenes in it. Then you iterate otver the scenes and get all the cameras and save the camera settings. Then you want to use your script to re-create the cameras from the scenes. Is that the idea?

                                    If so, then what your script does should not differ from the cameras in the scenes. so if the camera is zoomed way out in the scene, then that is what your script should make too. IS this not currently what you are achieving?

                                    If that is the case, then it sounds like somehow you are missing something in the camera settings when you extract them from the scenes. And the field of view might be my guess. Are you checking or setting the Field of View at any point in your script? I think ideall you would check the FOV of the scene camera and then st your camera to match when you create your camera object.

                                    Chris

                                    Lately you've been tan, suspicious for the winter.
                                    All my Plugins I've written

                                    1 Reply Last reply Reply Quote 0
                                    • C Offline
                                      chrisglasier
                                      last edited by 15 Feb 2010, 04:24

                                      @chris fullmer said:

                                      So to further understand now: You have an existing model with scenes in it. Then you iterate otver the scenes and get all the cameras and save the camera settings. Then you want to use your script to re-create the cameras from the scenes. Is that the idea?

                                      Yes - maybe recreate views of the model is a better term.

                                      @unknownuser said:

                                      If so, then what your script does should not differ from the cameras in the scenes. so if the camera is zoomed way out in the scene, then that is what your script should make too. IS this not currently what you are achieving?

                                      Please see pixs and code .

                                      @unknownuser said:

                                      If that is the case, then it sounds like somehow you are missing something in the camera settings when you extract them from the scenes. And the field of view might be my guess. Are you checking or setting the Field of View at any point in your script? I think ideall you would check the FOV of the scene camera and then st your camera to match when you create your camera object.

                                      Please have a look at the code. From the console and js output it seems the fov does not change. Perhaps I have made the error there.


                                      No zoom_extents


                                      original scene

                                      With TBA interfaces we can analyse what is to be achieved so that IT can help with automation to achieve it.

                                      1 Reply Last reply Reply Quote 0
                                      • C Offline
                                        chrisglasier
                                        last edited by 15 Feb 2010, 04:28

                                        ... and the non perspective views are the same ...

                                        With TBA interfaces we can analyse what is to be achieved so that IT can help with automation to achieve it.

                                        1 Reply Last reply Reply Quote 0
                                        • C Offline
                                          Chris Fullmer
                                          last edited by 15 Feb 2010, 05:14

                                          I can't parse your code very quickly Chris. Especially once it goes out to js, I'm lost. But it looks like you are doing the right thing by getting the fov for the perspective cameras. But somewhere in there, something is getting messed up. If you get the values correctly and apply them back correctly, the cameras will match 100%. There should be no need to do a zoom extents. So it is clear that somewhere the values are not coming through correctly. I would do some solid value testing. Output all the values before they go to js, then output them again as you recreate the camera. See if they differe at all.

                                          Also, if you could make a model with a scene, then run your script on it and recreate that camera, then create a new scene that uses your camera info it might be easier to compare the settings of the 2 cameras - the original and your recreation.

                                          Chris

                                          Lately you've been tan, suspicious for the winter.
                                          All my Plugins I've written

                                          1 Reply Last reply Reply Quote 0
                                          • 1
                                          • 2
                                          • 1 / 2
                                          1 / 2
                                          • First post
                                            1/28
                                            Last post
                                          Buy SketchPlus
                                          Buy SUbD
                                          Buy WrapR
                                          Buy eBook
                                          Buy Modelur
                                          Buy Vertex Tools
                                          Buy SketchCuisine
                                          Buy FormFonts

                                          Advertisement