Edited by youpi1, 20 January 2013 - 06:24 PM.
OpenGL / HUD - Computation of a good initial value for scale line
#2 Crossbones+ - Reputation: 5165
Posted 16 January 2013 - 03:28 AM
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
Edited by L. Spiro, 16 January 2013 - 07:13 PM.
I spent most of my life learning the courage it takes to go out and get what I want. Now that I have it, I am not sure exactly what it is that I want. - L. Spiro 2013
L. Spiro Engine: http://lspiroengine.com
L. Spiro Engine Forums: http://lspiroengine.com/forums
#4 Members - Reputation: 532
Posted 16 January 2013 - 05:19 AM
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.
#5 Members - Reputation: 118
Posted 16 January 2013 - 06:03 AM
- 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 2DSo, 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) :
Now another picture with the same zoom but with also a rotation by mouse, this is a view by side of the galaxy :
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
Edited by youpi1, 16 January 2013 - 09:11 AM.
#6 Members - Reputation: 532
Posted 16 January 2013 - 11:49 AM
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.
#7 Members - Reputation: 118
Posted 16 January 2013 - 05:12 PM
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 ?






