Sign in to follow this  

OpenGL Camera help

Recommended Posts

I'm trying to make a camera which will allow me to look around my heightmap that I have created. I've looked for tutorials and such on the web but I can only seem to find camera systems that involve moving the object, I dont want this, I want to draw the image and then look around it by moving the camera's position. Is this possible just by using gluookAt()? To start with I want to keep the camera looking at the centre of my heightmap the entire time, so I would have thought I only need a function for each of the first 3 parameters of the gluLookAt function (eyeX, eyeY, eyeZ) to move the camera round. Is this correct? And if so could you point me in the direction of a guide that would help me do this, I understand the level of maths I would need to use but it's linking this maths with the 3D coordinate system that gets me in a muddle! Sorry if its a stupid question but I'm a bit of a newbie to openGL and programming in general so I would appreciate any help. Thanks.

Share this post

Link to post
Share on other sites
What you are asking for is a little like a way to take a picture of a beach and then magically walking around inside the picture. You can't. It's a 2D snapshot of the scene. If you want to change what you see on the picture, you obviously have to take another one from a different angle (ie draw your stuff again). All you can do is move the picture around in front of your eyes (basically rendering to texture and move a textured rectangle around the screen), which most likely isn't what you want.

The reason people do cameras by "moving the objects" is because it's the same. Not just because if you move to the left, everything else seems to be moving to the right, but because the resulting matrix for moving the camera left is virtually the same as the matrix to move the world to the right. gluLookAt does nothing but setting up the modelview matrix with the inverse of the cameras matrix, effectively moving the world the opposite way.

Share this post

Link to post
Share on other sites
Dammit!! OK thanks for the help Trienco. Is the any guide that has sample code and goes through this in detail because I'm a little confused?!

Thanks again.

Share this post

Link to post
Share on other sites
For a full description you have to dive into matrix math with transformations. But for the basic understanding it is sufficient to look at translational transformations only. Notice please that the following is the way of thinking that the camera should be part of the world.

Assume your camera is located at a position given by the point c. Here the co-ordinates of c are assumed to be given w.r.t. the "world", i.e. in the global co-ordinate system. Assume furthur you have a mesh located at the point m, also given w.r.t. the global co-ordinate system.

When it comes to rendering, you have to make the camera the "center of the world". This is because rendering happens in the viewing rectangle on your monitor, and the graphics hardware defines that rectangle to be located at zero. To get this, you subtract the camera's position from everything related to the world. This becomes clear when looking at the camera itself: Its new position will become
c' := c - c == 0
what is exactly what we want. Notice please that subtraction here is to be interpreted as "applying the inverse transformation"!

Similarly, the new position of the mesh becomes
m' := m - c
That is, looking at the structure of the formula, nothing else than a translational transformation of the mesh! And due to the subtraction the translation is along the opposite direction. That is what Trienco means: E.g. shifting the camera to the right has the same effect as shifting the world (the mesh in this case) to the left.

Extending this to matrices looks as follows. The local co-ordinate frame (from which the position is a part of) of the camera w.r.t. the global frame is
and the same of the mesh is

Applying the inverse transformation of CG to the mesh hence means
CG-1 * MG
(I'm using column vectors here, as OpenGL does).

The left part is called the "view matrix" (at least OpengGl does so), and the right part is called the "model matrix". In total it is the MODELVIEW matrix. It means in fact that 1st a mesh, given in its local co-ordinate frame, is 1st transformed into the global frame (done by the model matrix) and the result is then transformed into the camera's local frame (done by the view matrix).

Share this post

Link to post
Share on other sites
What about if I were to redraw the image every time the camera position was changed, would it be possible to just use the gluLookAt() function to view it from a different perspective, rather than changing the objects position?

I just seems more logical to me to have a couple of functions to control the position of the camera rather than translating the object.


Share this post

Link to post
Share on other sites
Manipulating the camera as it were an object in the world is usual. That is exactly why OpenGL deals with both the VIEW and the MODEL matrix (although it deals with them in a combined manner). gluLookAt can be used for that purpose.

However, perhaps here a misinterpretation of terms causes some confusion. When you say "draw an image" you perhaps mean instead "render the scene". You're, of course, able to re-render the scene each time the camera's position and/or orientation has changed, yielding in an adapted view into the scene (in a texture or on the screen). You're _not_ able to render the scene into an image (e.g. a texture) and navigate in a 3D manner inside the image. That is what Trienco has meant above.

Share this post

Link to post
Share on other sites
This is what i'm after:

There's the two functions orientMe and moveMeFlat which call gluLookAt after making adjustments to the camera position. I think all I need to do is add more similar functions so I can rotate around different axis and move in different directions but I dont understand how it works. I understand the x, y, and z values for the camera position but its the lx, ly, lz values defining the line of sight that I dont understand. Why do you need to change the line of sight when we are just moving backwards and forwards for example?

Is there anywhere that explains this in more depth?

Thanks again :)

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  

  • Forum Statistics

    • Total Topics
    • Total Posts
  • Similar Content

    • By lonewolff
      Hi guys,
      With OpenGL not having a dedicated SDK, how were libraries like GLUT and the likes ever written?
      Could someone these days write an OpenGL library from scratch? How would you even go about this?
      Obviously this question stems from the fact that there is no OpenGL SDK.
      DirectX is a bit different as MS has the advantage of having the relationship with the vendors and having full access to OS source code and the entire works.
      If I were to attempt to write the most absolute basic lib to access OpenGL on the GPU, how would I go about this?
    • By DelicateTreeFrog
      Hello! As an exercise for delving into modern OpenGL, I'm creating a simple .obj renderer. I want to support things like varying degrees of specularity, geometry opacity, things like that, on a per-material basis. Different materials can also have different textures. Basic .obj necessities. I've done this in old school OpenGL, but modern OpenGL has its own thing going on, and I'd like to conform as closely to the standards as possible so as to keep the program running correctly, and I'm hoping to avoid picking up bad habits this early on.
      Reading around on the OpenGL Wiki, one tip in particular really stands out to me on this page:
      For something like a renderer for .obj files, this sort of thing seems almost ideal, but according to the wiki, it's a bad idea. Interesting to note!
      So, here's what the plan is so far as far as loading goes:
      Set up a type for materials so that materials can be created and destroyed. They will contain things like diffuse color, diffuse texture, geometry opacity, and so on, for each material in the .mtl file. Since .obj files are conveniently split up by material, I can load different groups of vertices/normals/UVs and triangles into different blocks of data for different models. When it comes to the rendering, I get a bit lost. I can either:
      Between drawing triangle groups, call glUseProgram to use a different shader for that particular geometry (so a unique shader just for the material that is shared by this triangle group). or
      Between drawing triangle groups, call glUniform a few times to adjust different parameters within the "master shader", such as specularity, diffuse color, and geometry opacity. In both cases, I still have to call glBindTexture between drawing triangle groups in order to bind the diffuse texture used by the material, so there doesn't seem to be a way around having the CPU do *something* during the rendering process instead of letting the GPU do everything all at once.
      The second option here seems less cluttered, however. There are less shaders to keep up with while one "master shader" handles it all. I don't have to duplicate any code or compile multiple shaders. Arguably, I could always have the shader program for each material be embedded in the material itself, and be auto-generated upon loading the material from the .mtl file. But this still leads to constantly calling glUseProgram, much more than is probably necessary in order to properly render the .obj. There seem to be a number of differing opinions on if it's okay to use hundreds of shaders or if it's best to just use tens of shaders.
      So, ultimately, what is the "right" way to do this? Does using a "master shader" (or a few variants of one) bog down the system compared to using hundreds of shader programs each dedicated to their own corresponding materials? Keeping in mind that the "master shaders" would have to track these additional uniforms and potentially have numerous branches of ifs, it may be possible that the ifs will lead to additional and unnecessary processing. But would that more expensive than constantly calling glUseProgram to switch shaders, or storing the shaders to begin with?
      With all these angles to consider, it's difficult to come to a conclusion. Both possible methods work, and both seem rather convenient for their own reasons, but which is the most performant? Please help this beginner/dummy understand. Thank you!
    • By JJCDeveloper
      I want to make professional java 3d game with server program and database,packet handling for multiplayer and client-server communicating,maps rendering,models,and stuffs Which aspect of java can I learn and where can I learn java Lwjgl OpenGL rendering Like minecraft and world of tanks
    • By AyeRonTarpas
      A friend of mine and I are making a 2D game engine as a learning experience and to hopefully build upon the experience in the long run.

      -What I'm using:
          C++;. Since im learning this language while in college and its one of the popular language to make games with why not.     Visual Studios; Im using a windows so yea.     SDL or GLFW; was thinking about SDL since i do some research on it where it is catching my interest but i hear SDL is a huge package compared to GLFW, so i may do GLFW to start with as learning since i may get overwhelmed with SDL.  
      Knowing what we want in the engine what should our main focus be in terms of learning. File managements, with headers, functions ect. How can i properly manage files with out confusing myself and my friend when sharing code. Alternative to Visual studios: My friend has a mac and cant properly use Vis studios, is there another alternative to it?  
    • By ferreiradaselva
      Both functions are available since 3.0, and I'm currently using `glMapBuffer()`, which works fine.
      But, I was wondering if anyone has experienced advantage in using `glMapBufferRange()`, which allows to specify the range of the mapped buffer. Could this be only a safety measure or does it improve performance?
      Note: I'm not asking about glBufferSubData()/glBufferData. Those two are irrelevant in this case.
  • Popular Now