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 6 of 6

Thread: Arcball rotation around viewport-center

  1. #1
    Junior Member Newbie
    Join Date
    Dec 2012
    Posts
    5

    Arcball rotation around viewport-center

    Hi guys,
    I'm trying to write an arcball which rotates around the window center (z=0). Unfortunatly I also want to be able to move my objects with this arcball; i.e. rotate, translate scale.
    My problem is that I can't figure out how to handle the rotation with the translation. Currently I'm doing this:

    Code :
                // Apply "arcball"-modifications to OpenGL.
                GL.Translate(windowCenterVector);
                GL.MultMatrix(ref rotationMatrix);
                GL.Scale(this.scale, this.scale, this.scale);
                GL.Translate(-windowCenterVector);
                GL.Translate(this.translation);

    Unforunatly the last translation which applies the arcball offset is affected by the rotation. I tried to transform it with the inverse of the rotation matrix but so I changed the rotation center...

    If someone might be able to explain this to me it would be great!

    I created a sample-project with OpenTK so if someone want's to checkout the full code: http://go4x.de/share/WindowsFormsApplication1.zip

    Greetings - Thomas

  2. #2
    Senior Member OpenGL Guru Dark Photon's Avatar
    Join Date
    Oct 2004
    Location
    Druidia
    Posts
    3,194
    Kinda looks like you need to separate the concepts of MODELING transform and VIEWING transform. MODELING transform positions objects in a shared world space, and VIEWING takes world space and re-positions them in eye-space. The OpenGL Programming Guide (red book) has an excellent description of this.

    Figure out your MODELING transform for each object and set it aside. Then, determine where your eye is, which direction it is looking, and an up vector for that view -- that will generate your VIEWING transform. Combine them, and you're done. In other words, establish clearly how your trackball will modify the position and look direction of the eyepoint in world space.

    Where is "WORLD SPACE" in your series of transformations?
    Last edited by Dark Photon; 12-27-2012 at 02:43 PM.

  3. #3
    Junior Member Newbie
    Join Date
    Dec 2012
    Posts
    5
    I think I don't have a modeling-transform at the moment. I just wan't transform the hole scene with my code.

    In steps:
    1. I want to translate the scene to a) the middle of the viewport and b) add the offset from the trackball.
    2. I want the hole scene to rotate around the middle of the viewport.
    3. Scale the scene.

    I hope we're not on cross purposes.
    Last edited by admirandis; 12-29-2012 at 01:09 AM.

  4. #4
    Senior Member OpenGL Guru Dark Photon's Avatar
    Join Date
    Oct 2004
    Location
    Druidia
    Posts
    3,194
    Your statement is a little ambiguous. For instance, center of the viewport is whatever you make it.

    I would encourage you to forget the transforms for a second and reformulate your thinking in terms of:

    1. where is the eyepoint, and
    2. which direction is it looking in.

    The first is a point in world space. The second is a vector in world space.

    Now, ask yourself what you want the trackball offset to "do" with these two values. Does this change where the eyepoint is located? How? Does it affect the direction the eye is looking in world space? How? Repeat for the other inputs like trackball rotation.

    Now just pass your updated eyepoint and look direction to gluLookAt() (or your own hand-rolled version) to generate your viewing transform for you.

    I'm guessing your arcball offset is intended to push the eyepoint away from the center of focus after rotation/etc. So if you keep your current transform calls instead of using something more friendly like gluLookAt then you'd want to put that translate first in the sequence, which causes it to conceptually be applied last.
    Last edited by Dark Photon; 12-29-2012 at 08:10 PM.

  5. #5
    Junior Member Newbie
    Join Date
    Dec 2012
    Posts
    5
    Ok, let's think in eyepoint and origin.
    1. At the beginning (i.e. no arcball modifications) I want the origin to be located in: viewportwidth/2, viewportheight/2, 0. Eyepoint is origin but z-value > 0.
    2. The offset of the arcball should translate eye and origin only in x-y-direction.
    3. The rotation of the arcball should modify the eye, but not the origin.
    Is this clear to you?

    To your last sentence: If I put the translate first in sequence I change the rotation-center. But of course you're right about the concept.

    EDIT: If you can compile my sample-project: There is almost everything correct; just the offset of the arcball is rotation-dependent.
    EDIT2: I forgot to mention: I've found a site in this forum with the same problem (at least I think so). Unfortunatly the solution in this post doesn't work.
    http://www.opengl.org/discussion_boa...nslation/page2
    Last edited by admirandis; 01-03-2013 at 04:44 AM.

  6. #6
    Junior Member Newbie
    Join Date
    Dec 2012
    Posts
    5
    Ok, I've found the error by myself.
    The problem was I created the complete transformation-matrix on every render-process. With this the rotation changed also if I only changed the pan of the arcball (the rotation-center changed, i.e. the rotation became different).
    After saving the the transformation after a rotation the behaviour was exactly like I wanted it to be.

Posting Permissions

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