Sign in to follow this  
Rasmadrak

OpenGL Is glRotated of a lower precision than glTranslated?

Recommended Posts

Rasmadrak    196
Hi there! In my FPS game (set in a HUGE world) I recently discovered the nasty headaches of floating point imprecision... :/ But I realized that if I don't do any rotates precision is just fine!
        glRotated(ViewPitch,1,0,0);  //comment out these for jumpfree graphics.
        glRotated(ViewYaw,0,1,0);    //comment out these for jumpfree graphics.
        glTranslated(-Pos.x,-Pos.y,-Pos.z);

Is there something wrong with my camera class, or does opengl do something funky when using glRotate? Cheers people!

Share this post


Link to post
Share on other sites
oggialli    217
I think OpenGL stores the transforms internally as floats. So try keeping your own double-precision matrix for the camera and using glLoadMatrixd to send it to OpenGL. This eliminates accumulated floating point precision errors (actually it doesn't but makes them order of 2^29 times smaller because of the mantissa being 29 bits longer double vs float).

This reasoning is however only correct if OpenGL doesn't store double precision copies of the matrix stacks and use them modifying the stacks. But try it and see if it makes a difference.

Share this post


Link to post
Share on other sites
oggialli    217
At least I got the impression his rotations and translations were working all right unless he moved in his world so that the absolute value of the translation is REALLY big and floating point inaccuracies cause movement to get all choppy and jerky.

Share this post


Link to post
Share on other sites
Rasmadrak    196
As oggialli said, the camera works perfect if I maintain a position close to the origin of the map.

I'll try making my own matrix, I'll let you know how it goes!

/Robert

Share this post


Link to post
Share on other sites
oggialli    217
Quote:
Original post by Glaiel_Gamer
i would translate first then rotate


That won't work the same way at all - the rotation axis will be different (with non-zero translation, that is).

Share this post


Link to post
Share on other sites
oggialli    217
Ah, one more thing! When using your own matrices in OpenGL (with glMultMatrix / glLoadMatrix) be sure to remember to follow its row-column ordering. It is so that the base vectors of the 4x4 matrix are laid out contiguously in memory.

Share this post


Link to post
Share on other sites
oggialli    217
Hmm... so you are now using a matrix of your own, which is stored as double-precision, not single-precision numbers?

What is your coordinate system like? In other words, in what range are the translation values going to be?

Really strange indeed. In normal circumstances, however large your worlds might be, doubles should give you more than enough precision. Hmm... I wonder if using long doubles and then converting them to doubles before sending to OpenGL you would get any benefit. You can always try fairly easily...

Share this post


Link to post
Share on other sites
Degra    212
Theres probably a good reason why you're not using glRotatef or glTranslatef, but I'm going to say it anyway... try using glRotatef or glTranslatef?

Share this post


Link to post
Share on other sites
oggialli    217
f and d's difference is d's more precision. But he already tried building his own matrix and dropping those calls out of the equation alltogether, so that's not the problem as it seems.

Share this post


Link to post
Share on other sites
Rasmadrak    196
Update:

I just noticed that it's the terrain that jumps around... NOT the camera or the objects.. they're rock solid. Double's for the win!
That's the good news, hehe.

But what is causing the terrain to jump around? :S I'm not doing anything fancy except old fashioned glTranslated and glVertex3d calls.
Also, when the terrain is not compiled into a displaylist, it's more stable (but still jumpy)...

The code used for compiling the displaylist is more or less exactly the same, so could this be some graphics driver optimization and/or bug..?

Share this post


Link to post
Share on other sites
anist    100
Quote:
Original post by Rasmadrak
But what is causing the terrain to jump around?

On what planet do the inhabitants have the needed information to possibly answer that question? Please post relavent code and describe more than "jumps around". Other than that: remove the display list code all together until you have ruled it out.
Also: Do you LoadIdentity after drawing your objects?

Share this post


Link to post
Share on other sites
Rasmadrak    196
Hehe. That made me laugh! :D

The thing that puzzled me the most is that a display list (now using the EXACT same code) is jumping a lot more than without a display list.
Anyway, I'll test to rewrite the terrain drawing later this evening, see if I made any infamous typos-of-death... :/

Yeah. cheers!

Share this post


Link to post
Share on other sites
Dorvo    272
Quote:
Original post by Rasmadrak
Update:

I just noticed that it's the terrain that jumps around... NOT the camera or the objects.. they're rock solid. Double's for the win!
That's the good news, hehe.

But what is causing the terrain to jump around? :S I'm not doing anything fancy except old fashioned glTranslated and glVertex3d calls.
Also, when the terrain is not compiled into a displaylist, it's more stable (but still jumpy)...

The code used for compiling the displaylist is more or less exactly the same, so could this be some graphics driver optimization and/or bug..?


Are you making sure to push and pop the matrix stack and load an identity matrix every time you draw the terrain? If the terrain is so big, like you said, that jittering effect could be caused by that.

Edit: Err... I mean it could be that because there's a translation somewhere in your code that might be "bleeding" into your terrain positioning code (ie. Forgetting to push the matrix stack and set an identity matrix to the top of the stack).

Share this post


Link to post
Share on other sites
hplus0603    11356
Hardware GL implementations are internally float, not double.

The precision of float is not enough for a large world.

Thus, you have to save the camera position/orientation as well as the object position/orientation.

When you render, you subtract the camera position from the object position, and subtract the camera orientation from the object orientation, and then rotate/translate by THAT.

We do it this way when simulating the earth (from foot-soldier view), and it works very well.

Share this post


Link to post
Share on other sites
Rasmadrak    196
Indeed!

First thing on my list tomorrow! :D
Seems like a perfectly valid solution, and I guess it is since you're using it yourself! :)

I'll let you know how it goes!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Similar Content

    • By pseudomarvin
      I assumed that if a shader is computationally expensive then the execution is just slower. But running the following GLSL FS instead just crashes
      void main() { float x = 0; float y = 0; int sum = 0; for (float x = 0; x < 10; x += 0.00005) { for (float y = 0; y < 10; y += 0.00005) { sum++; } } fragColor = vec4(1, 1, 1 , 1.0); } with unhandled exception in nvoglv32.dll. Are there any hard limits on the number of steps/time that a shader can take before it is shut down? I was thinking about implementing some time intensive computation in shaders where it would take on the order of seconds to compute a frame, is that possible? Thanks.
    • By Arulbabu Donbosco
      There are studios selling applications which is just copying any 3Dgraphic content and regenerating into another new window. especially for CAVE Virtual reality experience. so that the user opens REvite or CAD or any other 3D applications and opens a model. then when the user selects the rendered window the VR application copies the 3D model information from the OpenGL window. 
      I got the clue that the VR application replaces the windows opengl32.dll file. how this is possible ... how can we copy the 3d content from the current OpenGL window.
      anyone, please help me .. how to go further... to create an application like VR CAVE. 
       
      Thanks
    • By cebugdev
      hi all,

      i am trying to build an OpenGL 2D GUI system, (yeah yeah, i know i should not be re inventing the wheel, but this is for educational and some other purpose only),
      i have built GUI system before using 2D systems such as that of HTML/JS canvas, but in 2D system, i can directly match a mouse coordinates to the actual graphic coordinates with additional computation for screen size/ratio/scale ofcourse.
      now i want to port it to OpenGL, i know that to render a 2D object in OpenGL we specify coordiantes in Clip space or use the orthographic projection, now heres what i need help about.
      1. what is the right way of rendering the GUI? is it thru drawing in clip space or switching to ortho projection?
      2. from screen coordinates (top left is 0,0 nd bottom right is width height), how can i map the mouse coordinates to OpenGL 2D so that mouse events such as button click works? In consideration ofcourse to the current screen/size dimension.
      3. when let say if the screen size/dimension is different, how to handle this? in my previous javascript 2D engine using canvas, i just have my working coordinates and then just perform the bitblk or copying my working canvas to screen canvas and scale the mouse coordinates from there, in OpenGL how to work on a multiple screen sizes (more like an OpenGL ES question).
      lastly, if you guys know any books, resources, links or tutorials that handle or discuss this, i found one with marekknows opengl game engine website but its not free,
      Just let me know. Did not have any luck finding resource in google for writing our own OpenGL GUI framework.
      IF there are no any available online, just let me know, what things do i need to look into for OpenGL and i will study them one by one to make it work.
      thank you, and looking forward to positive replies.
    • By fllwr0491
      I have a few beginner questions about tesselation that I really have no clue.
      The opengl wiki doesn't seem to talk anything about the details.
       
      What is the relationship between TCS layout out and TES layout in?
      How does the tesselator know how control points are organized?
          e.g. If TES input requests triangles, but TCS can output N vertices.
             What happens in this case?
      In this article,
      http://www.informit.com/articles/article.aspx?p=2120983
      the isoline example TCS out=4, but TES in=isoline.
      And gl_TessCoord is only a single one.
      So which ones are the control points?
      How are tesselator building primitives?
    • By Orella
      I've been developing a 2D Engine using SFML + ImGui.
      Here you can see an image
      The editor is rendered using ImGui and the scene window is a sf::RenderTexture where I draw the GameObjects and then is converted to ImGui::Image to render it in the editor.
      Now I need to create a 3D Engine during this year in my Bachelor Degree but using SDL2 + ImGui and I want to recreate what I did with the 2D Engine. 
      I've managed to render the editor like I did in the 2D Engine using this example that comes with ImGui. 
      3D Editor preview
      But I don't know how to create an equivalent of sf::RenderTexture in SDL2, so I can draw the 3D scene there and convert it to ImGui::Image to show it in the editor.
      If you can provide code will be better. And if you want me to provide any specific code tell me.
      Thanks!
  • Popular Now