OpenGL / HUD - Computation of a good initial value for scale line

Started by
5 comments, last by youpi1 11 years, 3 months ago
I try to find the good initial value at the start of simulation. I took on the following image a value equal to 100 kpc (kpc is the unity used in my code for the positions of each particles)
Advertisement

Firstly, the main problem is that you are using a perspective transform instead of an orthogonal transform. In a perspective transform, only the particles with exactly the correct Z distances will be scaled correctly according your scale.

The first fix is to use an orthogonal transform.

Once that is done you will probably notice that everything gets small.

That is because now one pixel = one unit.

So if a particle has traveled 100 pixels on the screen it is trivial to calculate how many world units that means. And the inverse of such operation (taking 100 world units and showing that as pixels on a graph/bar) is also trivial.

I leave this up to the reader who shows some self-help efforts.

L. Spiro

I restore Nintendo 64 video-game OST’s into HD! https://www.youtube.com/channel/UCCtX_wedtZ5BoyQBXEhnVZw/playlists?view=1&sort=lad&flow=grid

I don't understand why I have to use Ortho projection, Perspective allows me to make diplay particles smaller/bigger when they get far away/closer (with zoom out/in that I have implemented) while Ortho is for 2D stuff.

Well on that example picture you are watching the galaxy (which is very flat) from a much higher distance from far above it, so you gain not very much from perspective transform, but that distance-meter only works on 1 distance and is difficult to calculate correctly.

If you need to watch it from the side and at much lower distance the distance meter gets useless as the user cannot know if it applies to foreground or background objects for which it would have to be different. So you have to decide whats more important to your users, a useful distance meter with ortho or correct perspective drawing for minimally better visualization.

I am not sure I have all understood. There are 2 things :

- the line I draw is done in "headupdisplay" function by :

//Setup for 2D  
glMatrixMode(GL_PROJECTION);
  glPushMatrix();
  glLoadIdentity();
  glOrtho(0, w_width, w_height, 0, -1, 1); 
 glMatrixMode(GL_MODELVIEW);
  glPushMatrix();
  glLoadIdentity();
// begin draw scale line 
 glDisable(GL_TEXTURE_2D);
  glLineWidth(2.0f);
  glBegin(GL_LINES);
  glVertex2d(350, 12); 
 glVertex2d(450, 12); 
 glVertex2d(350, 9);
  glVertex2d(350, 15);
  glVertex2d(450, 9); 
 glVertex2d(450, 15);
  glEnd(); 
 glEnable(GL_TEXTURE_2D); 
 // end draw  
glMatrixMode( GL_PROJECTION ); 
 glPopMatrix();  
glMatrixMode( GL_MODELVIEW );  
glPopMatrix();
  // end for 2D
So, this line has 100 pixel length.

- I want the value right to this line to represent the distance of the foreground plane, i.e the 2D projection of the 3D scene.

For example, I show you the result when I zoom (the value equals to 45.8 kpc) :

[attachment=13275:test3.png]

Now another picture with the same zoom but with also a rotation by mouse, this is a view by side of the galaxy :

[attachment=13276:test4.png]

wintertime, you say this distance is difficult to calculate correctly with perspective projection, could you give me some clue ?

I just want to get a value corresponding to the foreground objects, i.e the 2D projection in (xy) plane of the 3D scene without taking into account of the z coordinates. That's why you advise me to use Ortho projection ?

Thanks

Perspective projection is like watching a pyramid from above its tip and the further away the wider it gets. Its impossible to give one number for how wide it is without a distance.

Orthographic projection is like looking at a box, its got same width everywhere. Its easy to give one number then and you can also just use the same projection for the graphics and the measuring line so its got same unit length.

Its impossible to give one number for how wide it is without a distance.

So when I do :


gluPerspective(45.0f, (float)w_width / w_height, g_nearPlane, g_farPlane);"
gluLookAt (0.0, 0.0, 3.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

I can't say that the width and height are equals to : width = height = 2 *tan(45) * distance ; with distance = 3 ?

This topic is closed to new replies.

Advertisement