Since I gogled for it without finding anything interesting, I would like to ask you for some suggestions regarding if it is better to scale/translate the render itself keeping the camera position fixed or maybe moving closer/further or rotate the camera keeping the render position fixed?
I need a zooming out/in, rotation in all the 3 axes and also this kind of rotation http://www.reknow.de/downloads/opengl/capture-1.avi that is, if I first translate my render and then I apply a rotation, this rotation should consider the center always the windows center, and not the translated one |
Administrator
|
This post was updated on .
Hi
Modifying the viewport might be enough for your purpose (zoom in and out). Edit.: maybe it is a bad idea. I'm going to look at how I implement zoom in first person shooters. Edit.: The OpenGL FAQ advises to modify the projection matrix rather than using glScale or glViewport/glScissor.
Julien Gouesse | Personal blog | Website
|
How did you do? Where it says that, exactly? |
Administrator
|
Administrator
|
I can't read your video.
Julien Gouesse | Personal blog | Website
|
This post was updated on .
Ok guys, actually I am stuck on my program since 2 days and I dont know what to do...
Right now, I am rendering a cylinder, I can pan and zoom using this: display() { ... glu.gluLookAt(translationX/gLAutoDrawable.getWidth()*scale*2, -translationY/gLAutoDrawable.getHeight()*scale*2, 2, translationX/gLAutoDrawable.getWidth()*scale*2, -translationY/gLAutoDrawable.getHeight()*scale*2, 0, ... } I can also rotate using some custom functions: display() { ... glu.gluLookAt ... gl.glMultMatrixf(currentRotation, 0); ... } mouseDragged() { ... if(rotationMode) { float newRotation[] = multiply(rotationX(-dy), rotationY(-dx)); currentRotation = multiply(currentRotation, newRotation); rotationX +=dx; rotationY +=dy; } ... } private static float[] rotationX(float angleDeg) { float m[] = identity(); float angleRad = (float)Math.toRadians(angleDeg); float ca = (float)Math.cos(angleRad); float sa = (float)Math.sin(angleRad); m[ 5] = ca; m[ 6] = sa; m[ 9] = -sa; m[10] = ca; return m; } private static float[] rotationY(float angleDeg) { float m[] = identity(); float angleRad = (float)Math.toRadians(angleDeg); float ca = (float)Math.cos(angleRad); float sa = (float)Math.sin(angleRad); m[ 0] = ca; m[ 2] = -sa; m[ 8] = sa; m[10] = ca; return m; } private static float[] multiply(float m0[], float m1[]) { float m[] = new float[16]; for (int x=0; x < 4; x++) { for(int y=0; y < 4; y++) { m[x*4 + y] = m0[x*4+0] * m1[y+ 0] + m0[x*4+1] * m1[y+ 4] + m0[x*4+2] * m1[y+ 8] + m0[x*4+3] * m1[y+12]; } } return m; } This special rotation was mandatory because if I use glRotate to rotate my cylinder a first time over the horizontal plane, lets say, then my modelview coordinates rotates as well, and I dont want to have this, since I still need to rotate over the vertical axes Now, the problem is that the rotation is performed taking the modelview origin as the rotation point... This means that if I pan (aka move the camera) I would like to see a rotation over the center of my screen, and not the center of the modelview (that has been panned) I hope it's clear, otherwise I can post something else to illustrate it better.. |
Free forum by Nabble | Edit this page |