Jump to content

  • Log In with Google      Sign In   
  • Create Account


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


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
6 replies to this topic

#1 youpi1   Members   -  Reputation: 118

Like
0Likes
Like

Posted 16 January 2013 - 03:16 AM

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)

Attached Thumbnails

  • test2.png

Edited by youpi1, 20 January 2013 - 06:24 PM.


Sponsor:

#2 L. Spiro   Crossbones+   -  Reputation: 13214

Like
0Likes
Like

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.

It is amazing how often people try to be unique, and yet they are always trying to make others be like them. - L. Spiro 2011
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
I went to my local Subway once to find some guy yelling at the staff. When someone finally came to take my order and asked, “May I help you?”, I replied, “Yeah, I’ll have one asshole to go.”
L. Spiro Engine: http://lspiroengine.com
L. Spiro Engine Forums: http://lspiroengine.com/forums

#3 youpi1   Members   -  Reputation: 118

Like
0Likes
Like

Posted 16 January 2013 - 04:25 AM

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.



#4 wintertime   Members   -  Reputation: 1641

Like
0Likes
Like

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 youpi1   Members   -  Reputation: 118

Like
0Likes
Like

Posted 16 January 2013 - 06:03 AM

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) :

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 :

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

Edited by youpi1, 16 January 2013 - 09:11 AM.


#6 wintertime   Members   -  Reputation: 1641

Like
0Likes
Like

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 youpi1   Members   -  Reputation: 118

Like
0Likes
Like

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 ?






Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS