This course will teach participants about installing and configuring Python, syntax, importing, statements, types, strings, booleans, files, lists, tuples, comprehensions, functions, and classes.

I think this is done/asked millions of time but I couldnt find any useful information about it.

I am rendering some points scattered through the scene. I want to implement zoom to fit function, for example when the user presses "F" program will automatically align the model so all of the model appears on the view and as maximum.

The steps I took:

1. I have calculated the bounding sphere

2. And I am trying to compute some parameters according to it, here the problem occurs.

Here are some code I have written (in MFC):

NOTE: m_xpos, m_ypos, m_zoom, m_xrot, m_yrot and m_zrot are variables that changes with user interaction.

void COrthographic::OnDraw(CDC *pDC)

{

CspetrexDoc *doc = (CspetrexDoc*) GetDocument();

SetContext();

glLoadIdentity();

glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

// Position the camera

glTranslatef( m_xpos, -m_ypos, -m_zoom );

// Adjust viewport for md3 models which

// use a different coordinate system -

// 3DSMAX format.

glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );

glRotatef( -90.0f, 0.0f, 0.0f, 1.0f );

// Rotate the camera

glRotatef( m_xrot, 1.0f, 0.0f, 0.0f );

glRotatef( m_yrot, 0.0f, 1.0f, 0.0f );

glRotatef( m_zrot, 0.0f, 0.0f, 1.0f );

doc->drawScene(pDC);

SwapGLBuffers();

}

void COrthographic::OnSize(UINT nType, int cx, int cy)

{

COpenGLWnd::OnSize(nType, cx, cy);

if ( 0 >= cx || 0 >= cy || nType == SIZE_MINIMIZED )

return;

// Change the orthographic viewing volume to

// reflect the new dimensions of the window

// and the zoom and position of the viewport.

SetContext();

glViewport( 0, 0, cx, cy );

glMatrixMode( GL_PROJECTION );

glLoadIdentity();

glOrtho( (float)(cx)/(float)(cy)*-m_zoom-m_xpos, (float)(cx)/(float)(cy)*m_zoom-m_xpos,

-m_zoom+m_ypos, m_zoom+m_ypos, -200.0f, 200.0f );

glMatrixMode( GL_MODELVIEW );

}

// HERE!! this is zoomToFit function!!!

void COrthographic::zoomToFit()

{

Sphere boundingSphere;

Point3D center;

CspetrexDoc *doc = (CspetrexDoc*) GetDocument();

CRect cr;

GetClientRect( &cr );

boundingSphere = doc->getBoundingSphere();

center = boundingSphere.getCenter();

m_xpos = -center.getX();

m_ypos = center.getY();

m_zoom = (double)cr.Height()/cr.Width()*boundingSphere.getDiameter();

OnSize( SIZE_MAXIMIZED, cr.Width(), cr.Height() );

OnDraw(NULL);

}

I will be glad if anyone helps.

I am rendering some points scattered through the scene. I want to implement zoom to fit function, for example when the user presses "F" program will automatically align the model so all of the model appears on the view and as maximum.

The steps I took:

1. I have calculated the bounding sphere

2. And I am trying to compute some parameters according to it, here the problem occurs.

Here are some code I have written (in MFC):

NOTE: m_xpos, m_ypos, m_zoom, m_xrot, m_yrot and m_zrot are variables that changes with user interaction.

void COrthographic::OnDraw(CDC *pDC)

{

CspetrexDoc *doc = (CspetrexDoc*) GetDocument();

SetContext();

glLoadIdentity();

glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

// Position the camera

glTranslatef( m_xpos, -m_ypos, -m_zoom );

// Adjust viewport for md3 models which

// use a different coordinate system -

// 3DSMAX format.

glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );

glRotatef( -90.0f, 0.0f, 0.0f, 1.0f );

// Rotate the camera

glRotatef( m_xrot, 1.0f, 0.0f, 0.0f );

glRotatef( m_yrot, 0.0f, 1.0f, 0.0f );

glRotatef( m_zrot, 0.0f, 0.0f, 1.0f );

doc->drawScene(pDC);

SwapGLBuffers();

}

void COrthographic::OnSize(UINT

{

COpenGLWnd::OnSize(nType, cx, cy);

if ( 0 >= cx || 0 >= cy || nType == SIZE_MINIMIZED )

return;

// Change the orthographic viewing volume to

// reflect the new dimensions of the window

// and the zoom and position of the viewport.

SetContext();

glViewport( 0, 0, cx, cy );

glMatrixMode( GL_PROJECTION );

glLoadIdentity();

glOrtho( (float)(cx)/(float)(cy)*-m

-m_zoom+m_ypos, m_zoom+m_ypos, -200.0f, 200.0f );

glMatrixMode( GL_MODELVIEW );

}

// HERE!! this is zoomToFit function!!!

void COrthographic::zoomToFit()

{

Sphere boundingSphere;

Point3D center;

CspetrexDoc *doc = (CspetrexDoc*) GetDocument();

CRect cr;

GetClientRect( &cr );

boundingSphere = doc->getBoundingSphere();

center = boundingSphere.getCenter()

m_xpos = -center.getX();

m_ypos = center.getY();

m_zoom = (double)cr.Height()/cr.Wid

OnSize( SIZE_MAXIMIZED, cr.Width(), cr.Height() );

OnDraw(NULL);

}

I will be glad if anyone helps.

If that's so, then simply:

glOrtho(x-r, x+r, y-r, y+r, z-r, z+r);

and the points will go to the edge. If you want them not to go quite to the edge, increase r by 5 or 10%

I understand that all participants have contributed with correct comments toward a solution.

Jose

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.

As far I am understanding the objective, I see the following procedures:

1. Find the model's projection center.

Finding the bounding sphere is just an intermediate approach, because give us the model's center, not the projection center. The model can have points so far from the center, that force the radius to be bigger than the projection area. So, we make C = bounding sphere center as a first step.

2. When looking to C, discover the Top, Bottom, Leftmost and Rightmost points of the model's projection in the projection plane.

3. Calculate the middle point M of the rectangle defined by that points.

Mx = (Lx+Rx)/2; My = (Ty+By)/2. Not necessarely M is equal to the projection of point C. If model is a cube, they are equal, but will be different if the model is a not a symetrical one.

Example: Lx = -10, Rx = 38, Cx projection = 0. So the projection center x is 14, not 0. This is something different to the code you show us.

4. Rotate the camera such that the projection of C is equal to M. The angle can be computed by reverse calculation, or find by repeating 3 or 4 times the steps 3 and 4, thus refining the exact position of the camera.

5. Now we can zoom in (or out) until left and right (or top and bottom) points are in the view clipping boundaries. You can also add a 5% of left-right (and top-bottom) distance to create a safe viewing area slight bigger than the extreme points. Let's remember that zoom is determined by the distance between the plane and the camera.

Of course, this is true only if we use a conical projection, as stated by nargov. In parallel projection, the distance between projection plane and camera does't matter, so the way is to scaling, as stated by InteractiveMind.

Jose