sketchucation logo sketchucation
    • Login
    ℹ️ Licensed Extensions | FredoBatch, ElevationProfile, FredoSketch, LayOps, MatSim and Pic2Shape will require license from Sept 1st More Info

    [CODE] Camera settings

    Scheduled Pinned Locked Moved Developers' Forum
    28 Posts 5 Posters 4.3k Views 5 Watching
    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.
    • chrisglasierC Offline
      chrisglasier
      last edited by

      @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
      • chrisglasierC Offline
        chrisglasier
        last edited by

        @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
        • Chris FullmerC Offline
          Chris Fullmer
          last edited by

          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
          • chrisglasierC Offline
            chrisglasier
            last edited by

            @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

              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
              • chrisglasierC Offline
                chrisglasier
                last edited by

                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
                • Chris FullmerC Offline
                  Chris Fullmer
                  last edited by

                  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
                  • chrisglasierC Offline
                    chrisglasier
                    last edited by

                    @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
                    • Chris FullmerC Offline
                      Chris Fullmer
                      last edited by

                      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
                      • chrisglasierC Offline
                        chrisglasier
                        last edited by

                        @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
                        • chrisglasierC Offline
                          chrisglasier
                          last edited by

                          ... 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
                          • Chris FullmerC Offline
                            Chris Fullmer
                            last edited by

                            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
                            • chrisglasierC Offline
                              chrisglasier
                              last edited by

                              Thanks for all your effort Chris. Just by posting those pix **.mm** came to mind ... errgh ... but somehow oddly satisfying. First go seems to work but still not quite it. You know when the French gave you the Statue of Liberty, it would have been nice if you had taken up their metric system.

                              Tally ho!

                              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
                              • Chris FullmerC Offline
                                Chris Fullmer
                                last edited by

                                Hehe, yeah sorry about that imperial vs. metric thing. I hope you're able to pin down the problems!

                                Chris

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

                                1 Reply Last reply Reply Quote 0
                                • D Offline
                                  driven
                                  last edited by

                                  @chrisglasier said:

                                  Yes guess what - fov is in mm by default!
                                  Here's a kind of victory pic.
                                  I amended the previous code in case anyone is thinking of doing something similarly lunatic.

                                  Cheers.

                                  hi Chris,

                                  I can't get the feb016.avi to run on any player, I'm on a Mac but don't normally have problems with .avi
                                  can you out-put a quicktime.mov as well? Is it the same video that's up on youtube?
                                  I'm very interested in your approach and although I'm only just starting to learn coding, I'd like to integrate namespace conventions into my efforts right from the start.

                                  john

                                  learn from the mistakes of others, you may not live long enough to make them all yourself...

                                  1 Reply Last reply Reply Quote 0
                                  • chrisglasierC Offline
                                    chrisglasier
                                    last edited by

                                    @unknownuser said:

                                    Is it the same video that's up on youtube?

                                    Yes. You could also look at my old website (button on left).

                                    Now I'm off to the real movies for a while.

                                    Interested in your interest.

                                    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
                                    • chrisglasierC Offline
                                      chrisglasier
                                      last edited by

                                      Yes guess what - fov is in mm by default!
                                      Here's a kind of victory pic.
                                      I amended the previous code in case anyone is thinking of doing something similarly lunatic.

                                      Cheers.


                                      Metric!

                                      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
                                      • chrisglasierC Offline
                                        chrisglasier
                                        last edited by

                                        A couple of odd things I just discovered when doing something else is that whereas the perspectives are spot on the standard views are unstable. The top/plan views for example get some 164% bigger when imported. See pixs:
                                        originalrecreated
                                        The other is that I .mm 'd the vector3ds for up. I changed them but it didn't make any difference. (Obviously I don't understand this stuff well enough.)

                                        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
                                        • chrisglasierC Offline
                                          chrisglasier
                                          last edited by

                                          Thanks for your help.

                                          [flash=600,432:21eq7727]http://www.youtube.com/v/6h6m_xr5IYA&hl=en_US&fs=1&[/flash:21eq7727]

                                          For anyone interested here are extracts from the rather clunky code I ended up to support this v quick video hinting at the potential.

                                          Ruby extractor:

                                          
                                          pages	= model.pages
                                          		layers	= model.layers
                                          		styles	= model.styles
                                          		@parray	=[]
                                          		pages.each do |page|
                                          			model.pages.selected_page = page
                                          			cam  = page.camera
                                          			name = page.name
                                          			pl = []
                                          				page.layers.each do |layer|
                                          					pl.push(layer.name)
                                          				end
                                          			pl = pl.join(",")
                                          			st = page.style
                                          			st = st.name
                                          			pts = [cam.eye, cam.target, cam.up]
                                          			per = cam.perspective?
                                          			if(cam.perspective?)
                                          				fov = cam.fov
                                          				sub = [pts,per,fov]
                                          			else
                                          				sub = [pts,per]
                                          			end
                                          			sub = sub.join("yy")
                                          			entry = [name,pl,st,sub]
                                          			@parray.push(entry.join("xx"))	
                                          
                                          

                                          JS converter

                                          
                                          p = ret[3].split(";");
                                          	pages = [];
                                          	for (a = 0; a < p.length; a += 1){
                                          		p[a]	= p[a].split("xx");
                                          		lgth	= fLength(nset);
                                          		lab		= lgth.toString(); 
                                          		o		= {};
                                          		o.Type	= "Scene"; 
                                          		o.Genus	= "New";
                                          		o.Name	= p[a][0];
                                          		o.Backlink	= [];
                                          		o.Backlink.push(sRoot);
                                          		o.Hidden	= [];
                                          		nset[lab]	= o;
                                          		nset[sRoot].Forelink.push(lab);
                                          		pages.push(lab);
                                          		nset[lab].Forelink = [];
                                          		//mark hidden layers
                                          		//alert(p[a])
                                          		pp 		= p[a][1].split(",");
                                          		
                                          		for (c = 0; c < pp.length; c += 1){
                                          			for (d = 0; d < combo.length; d += 1){
                                          				if(pp[c] === nset[combo[d]].Name){
                                          					nset[combo[d]].Filter = 1;
                                          				}
                                          			}
                                          		}
                                          		for (d = 0; d < combo.length; d += 1){
                                          			nset[combo[d]].Backlink = [];
                                          			if(!nset[combo[d]].Filter){
                                          				nset[lab].Forelink.push(combo[d].toString());
                                          				nset[combo[d]].Backlink.push(lab);
                                          			}
                                          			else{
                                          				delete nset[combo[d]].Filter;
                                          			}
                                          		}
                                          		//name,pl,st,camry
                                          	nset[lab].Style = p[a][2];
                                          	nset[lab].Camera = p[a][3];
                                          	}		
                                          
                                          

                                          JS scene call

                                          
                                          function fScenes(){
                                          	var cell,nt,node,name,kids,dn,cm,genus,cmps;
                                          	cell = document.getElementById("ScenesOn")
                                          	nt		= config.nametrail;
                                          	node	= nt[nt.length-1][0];
                                          	type	= nset[node].Type;
                                          	if(type === "Scene"){
                                          		name	= nset[node].Name;
                                          		kids	= nset[node].Forelink;
                                          		dn		= [];
                                          		cm		= [];
                                          		for(a = 0; a <kids.length; a += 1){
                                          			genus = nset[kids[a]].Genus
                                          			if(genus === "Dimension" || genus === "Notes"){
                                          				dn.push(nset[kids[a]].Name);
                                          				continue;
                                          			}
                                          			dn.push(nset[kids[a]].Name);
                                          			cmps = nset[kids[a]].Forelink;
                                          			for(b = 0; b <cmps.length; b += 1){
                                          				cm.push(nset[cmps[b]].Index); 
                                          			}		
                                          		}
                                          		name	= nset[node].Name;
                                          		style	= nset[node].Style;
                                          		rec		= nset[node].Camera.split("yy");
                                          		cam 	= [];		//eye,target,up
                                          		for(a=0; a < 3; a += 1){
                                          			cam.push(rec[a].slice(1,-1));
                                          		}
                                          		cam.push(rec[3])
                                          		if(rec[3]){
                                          			cam.push(rec[4]); 
                                          		}
                                          		data	= [name,dn.join(","),cm.join(","),style,cam]; 
                                          		document.getElementById("trans").value = data.join("|");
                                          		window.location = "skp;scene";
                                          	}
                                          }
                                          
                                          

                                          Ruby callback

                                          
                                          @dlg.add_action_callback("scene") {|d, p|
                                          		a = @dlg.get_element_value("trans")
                                          		a = a.split("|")
                                          		name	= a[0].split(",")
                                          		lyrs	= a[1].split(",")
                                          		cmps	= a[2].split(",")
                                          		sty		= a[3].to_s
                                          		cam		= a[4].split(",")
                                          		model	= Sketchup.active_model
                                          		entities	= model.entities
                                          		entities.each do |entity|
                                          			if  entity.class == Sketchup;;ComponentInstance || entity.class == Sketchup;;Group
                                          				entity.visible = false
                                          			end
                                          		end
                                          		cmps.each do |c|
                                          			a = Integer(c)
                                          			#p entities[a].name
                                          			entities[a].visible = true
                                          		end
                                          		layers = model.layers
                                          		layers.each do |layer|
                                          		layer.visible = false 
                                          		end	
                                          		lyrs.each do |lyr|
                                          			layers[lyr].visible = true;
                                          			#p layers[lyr].name
                                          		end	
                                          		
                                          		pages	= model.pages
                                          		styles	= model.styles
                                          		page	= pages["Nameset"]
                                          		styles.selected_style= styles[sty]
                                          		page.use_style = styles.selected_style
                                          		eye		= Geom;;Point3d.new [Float(cam[0]).mm, Float(cam[1]).mm, Float(cam[2]).mm]
                                          		target	= Geom;;Point3d.new [Float(cam[3]).mm, Float(cam[4]).mm, Float(cam[5]).mm]
                                          		up	= Geom;;Vector3d.new [Float(cam[6]), Float(cam[7]), Float(cam[8])]
                                          		camera = model.active_view.camera
                                          		camera.set(eye,target,up)
                                          		if cam[9] == "true"
                                          			camera.perspective = true
                                          		else
                                          			camera.perspective = false
                                          		end
                                          		if camera.perspective?
                                          			camera.fov = Float(cam[10])
                                          		end
                                          	}	
                                          
                                          
                                          

                                          It seems to work OK but I don't like the zoom extents (I'm working on that).

                                          As they say in the gallery ... C&C welcome.

                                          Edit 15 Feb: Changed code in callback to match post post revelations


                                          Scene extraction and view generation

                                          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
                                          • chrisglasierC Offline
                                            chrisglasier
                                            last edited by

                                            And here's the matrix returns for one component in the original and recreated view.
                                            camera011.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
                                            • 1
                                            • 2
                                            • 1 / 2
                                            • First post
                                              Last post
                                            Buy SketchPlus
                                            Buy SUbD
                                            Buy WrapR
                                            Buy eBook
                                            Buy Modelur
                                            Buy Vertex Tools
                                            Buy SketchCuisine
                                            Buy FormFonts

                                            Advertisement