Part of the Khronos Group
OpenGL.org

The Industry's Foundation for High Performance Graphics

from games to virtual reality, mobile phones to supercomputers

Results 1 to 5 of 5

Thread: Problems finding bounds of window in world coordinates.

  1. #1
    Junior Member Newbie
    Join Date
    Mar 2013
    Posts
    6

    Problems finding bounds of window in world coordinates.

    Hi everyone,

    I'm having a little trouble again.
    Currently I want to find the bounds of my window in world coordinates. I know that unprojection can be useful for that, but I'm doing it wrong and can't find my mistake.
    I'm trying to get the right end of my window this way:
    Code :
    viewMatrix = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -5.f)); //View matrix is translated 5 units back.
    projectionMatrix = glm::perspective(60.0f, 640.f / 480.f, 0.1f, 100.f); //FOV is 60, window aspect is 640/480, near plane 0.1 and far plane is 100.
    glm::vec3 position(639.f, 479.f, 0.f);
    glm::vec3 v = glm::unProject(position, viewMatrix, projectionMatrix, glm::vec4(0, 0, 640.f, 480.f));
    The goal is that v.x contains the right bound of my window in world coordinates. This value should be around 4.
    I don't know what value I can use for the z-value in position. If I use 1 then v.x is ~67. With z = 0 it is ~0.067.

    Currently I'm not using the z-axis for any of my game objects. It's 2D but not orthogonal.

    Is there a way to calculate z for position or any other way to get the window bounds in world coordinates?

  2. #2
    Senior Member OpenGL Pro
    Join Date
    Jan 2012
    Location
    Australia
    Posts
    1,117
    The goal is that v.x contains the right bound of my window in world coordinates
    In perspective mode the right bound is not a fixed value, it is a plane. When z = 0, it is a vertical line where the near plane and right plane intersect (hence a fixed value for x).
    When z = 1, it is a vertcal line where the far plane and right plane intersect.

  3. #3
    Junior Member Newbie
    Join Date
    Mar 2013
    Posts
    6
    I know that the right bound is not fixed. That's why I need to figure out z.
    How can I calculate z when my world space z is 0?
    If I have near plane = 0.1 and far plane 100 and have my viewMatrix at -5 my near plane world coordinate z is 4.9 and my far plane z is -95. There must be a way to figure it out but I can't find it. It's probably something pretty easy...
    Last edited by Skalli; 03-12-2013 at 11:45 AM.

  4. #4
    Senior Member OpenGL Guru Dark Photon's Avatar
    Join Date
    Oct 2004
    Location
    Druidia
    Posts
    3,209
    Quote Originally Posted by Skalli View Post
    ...I want to find the bounds of my window in world coordinates.
    Code cpp:
    viewMatrix = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -5.f)); //View matrix is translated 5 units back.
    projectionMatrix = glm::perspective(60.0f, 640.f / 480.f, 0.1f, 100.f); //FOV is 60, window aspect is 640/480, near plane 0.1 and far plane is 100.
    glm::vec3 position(639.f, 479.f, 0.f);
    glm::vec3 v = glm::unProject(position, viewMatrix, projectionMatrix, glm::vec4(0, 0, 640.f, 480.f));
    The goal is that v.x contains the right bound of my window in world coordinates.
    There are a number of ways to do this. If you use the projection matrix an GLM's gluUnProject work-alike like you are, then window-space Z runs from 0..1 as you go from near clip plane to far clip plane. The vector you're feeding into glm::unProject() doesn't make sense to me. I'd feed in the following values, to successive calls, to get the points on the near clip plane: (0,0,0,1),(640,0,0,1),(640,480,0,1),(0,480,0,1). For far clip, use Z=1 instead of 0.

    However, you don't even need to mess with the projection matrix and glm::unproject if you just start with eye-space coords. That is, you can compute the glFrustum left/right/bottom/top args from your gluPerspective args (gluPerspective), and then back those through the inverse viewing matrix. Namely, back these eye-space points through to get the near clip plane corners: (l,b,-n,1),(r,b,-n,1),(r,t,-n,1),(l,t,-n,1). And use Z=-f instead of -n for the far plane.
    Last edited by Dark Photon; 03-11-2013 at 05:36 PM.

  5. #5
    Junior Member Newbie
    Join Date
    Mar 2013
    Posts
    6
    Hi Dark Photon.
    The values I'm passing to glm::unProject should be ok (except for the z component in position).
    If you look at my last post from yesterday you will see that I'm struggeling with the plane where my game objects are.
    I've also tried to find the bounds with triangle equations. When my near plane is at 4.9 I can use that to calculate the right bound:
    Code :
    (4.9f * glm::sin(60.f * 3.14159 / 180))/glm::sin(90.f * 3.14159 / 180);
    The result is close, but not correct. :-/
    Last but not least I've set up my scene in blender to get a better orientation of my space, but the coordinates in blender are a bit different than in my scene...

    Greetings
    Skalli

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •