Zoom camera to fit entities on screen?
Blitz3D Forums/Blitz3D Beginners Area/Zoom camera to fit entities on screen?
I need help in fitting multiple entities on the screen at the same time. I need to do this with 4 entities simultaneously.
Up until now I have been doing this with just 2 entities by doing the following:
1. Get the average position between the 2 entities,... pointentity camera there.
2. get the distance between the entities and use that as a camerazoom with some extra stuff built in to make the numbers work.
With 4 entities, I can still get the average position, but the distance method doesn't work because I need the distance of the outermost entities only. I could do a lot of checks to detirmine which ones these are,... but does anyone have a simple solution?
Instead of using camerzoom I normally just use the camera's z position to zoom in/out as it's not so fiddly to get the numbers right. Either way, you will need to calculate the distance between the outermost entities to determine your scaling factors.
I think there is a simple maths equation when the camera zoom is set to 1 (default), to take a 3d width and move the camera out as stevie suggests, to fit it all in.
Yea,... the math isn't that hard once you know the outer entities. I was just checking if there was an easier way to find which ones are the outer ones when there are more than just the two.
Also,... I'm using a pretty high zoom factor to flatten the perpective. If I use the method of backing the camera up instead of zooming, I think I'll end up needing a huge camerarange. Not at a place I can look at it right now though.
min_x# = 0
max_x# = 0
min_z# = 0
max_z# = 0
;First find the min And max values for x And z
For t.tank = Each tank
If min_x < EntityX(t\tankmaster) Then min_x = EntityX(t\tankmaster)
If max_x > EntityX(t\tankmaster) Then max_x = EntityX(t\tankmaster)
If min_z < EntityZ(t\tankmaster) Then min_z = EntityZ(t\tankmaster)
If max_z > EntityZ(t\tankmaster) Then max_z = EntityZ(t\tankmaster)
Next
; position target and look at it
PositionEntity cam_target,(min_x + max_x) * .5, 0 ,(min_z + max_z) * .5
PointEntity cam,cam_target
;Zoom is based on distance between outer points The number 160 had no meaning, but gives me good results.
camzoom = 160 / Sqr((max_x -min_x )^2+(max_z - min_z )^2)
CameraZoom cam,camzoom
Here is my current code. This appears to work, but is bouncing around a bit too much for my liking. Can anyone see any obvious errors?
Replace these lines ..
If min_x < EntityX(t\tankmaster) Then min_x = EntityX(t\tankmaster)
With ..
If entityx( t\tankmaster ) < min_x then min_x = entityx( t\tankmaster )
Also, initially set your minimums to 100000 and maximums to -100000 ( or some other big number). For example, if all the tanks are on the right of the level past 0,0,0 then min_x will always be 0.
Stevie