matrix - OpenGL Camera rotation flickering -
matrix - OpenGL Camera rotation flickering -
since time, stucked photographic camera rotation problem in opengl.
i seek rotate photographic camera via mouse movement, photographic camera flickering (the object spoted photographic camera flickering).
i initialize photographic camera follows:
camera::camera(float x, float y, float z) { memset(transform, 0, 16*sizeof(float)); transform[0] = 1.0f; transform[5] = 1.0f; transform[10] = 1.0f; transform[15] = 1.0f; transform[12] = x; transform[13] = y; transform[14] = z; left=&transform[0]; up=&transform[4]; forward=&transform[8]; position=&transform[12]; old_x = 0; old_y = 0; }
here transform transformation matrix. since opengl column major, should right?
the next part explains, happening before drawing frame.
at first, refresh photographic camera mouse movement, depending on delta x , y of lastly mousepointer position, motion value can positiv or negative:
void camera::refresh(){ delta_x = userinputhandler::getmousemotion()[0]; delta_y = userinputhandler::getmousemotion()[1]; }
in next step adjusting photographic camera in scene. if mouse moved along x or y axis, want rotate camera:
void camera::adjust(){ if(old_x != userinputhandler::getmouseposition()[0]){ // rotate around y axis rotatelocal_y(-1.0f*(delta_x)); // save old mouse position old_x = userinputhandler::getmouseposition()[0]; } if(old_y != userinputhandler::getmouseposition()[1]){ rotatelocal_x(-1.0f*(delta_y)); old_y = userinputhandler::getmouseposition()[1]; } // loading calculated transform matrix viewmatrix setview(); }
the rotation around y axis matrix multiplication rotation matrix , transform matrix:
//rotate matrix around y axis void rotatematrixf_y(float *amatrix, float angle){ float rotmatrix[] = {cos(angle),0,-1*sin(angle),0, 0, 1, 0, 0, sin(angle), 0, cos(angle), 0, 0, 0, 0, 1}; multmatrixmatrix(amatrix, rotmatrix); }
keeping in mind opengl column major, multiplication function created this:
void multmatrixmatrix(float *m_a, float *m_b){ // column major float m_c[16] = {m_a[0]*m_b[0]+m_a[4]*m_b[1]+m_a[8]*m_b[2]+m_a[12]*m_b[3], //0 m_a[1]*m_b[0]+m_a[5]*m_b[1]+m_a[9]*m_b[2]+m_a[13]*m_b[3], //1 m_a[2]*m_b[0]+m_a[6]*m_b[1]+m_a[10]*m_b[2]+m_a[14]*m_b[3], // 2 m_a[3]*m_b[0]+m_a[7]*m_b[1]+m_a[11]*m_b[2]+m_a[15]*m_b[3], // 3 m_a[0]*m_b[4]+m_a[4]*m_b[5]+m_a[8]*m_b[6]+m_a[12]*m_b[7], //4 m_a[1]*m_b[4]+m_a[5]*m_b[5]+m_a[9]*m_b[6]+m_a[13]*m_b[7], //5 m_a[2]*m_b[4]+m_a[6]*m_b[5]+m_a[10]*m_b[6]+m_a[14]*m_b[7], // 6 m_a[3]*m_b[4]+m_a[7]*m_b[5]+m_a[11]*m_b[6]+m_a[15]*m_b[7], // 7 m_a[0]*m_b[8]+m_a[4]*m_b[9]+m_a[8]*m_b[10]+m_a[12]*m_b[11], // 8 m_a[1]*m_b[8]+m_a[5]*m_b[9]+m_a[9]*m_b[10]+m_a[13]*m_b[11], //9 m_a[2]*m_b[8]+m_a[6]*m_b[9]+m_a[10]*m_b[10]+m_a[14]*m_b[11], // 10 m_a[3]*m_b[8]+m_a[7]*m_b[9]+m_a[11]*m_b[10]+m_a[15]*m_b[11], // 11 m_a[0]*m_b[12]+m_a[4]*m_b[13]+m_a[8]*m_b[14]+m_a[12]*m_b[15], // 12 m_a[1]*m_b[12]+m_a[5]*m_b[13]+m_a[9]*m_b[14]+m_a[13]*m_b[15], // 13 m_a[2]*m_b[12]+m_a[6]*m_b[13]+m_a[10]*m_b[14]+m_a[14]*m_b[15], // 14 m_a[3]*m_b[12]+m_a[7]*m_b[13]+m_a[11]*m_b[14]+m_a[15]*m_b[15] // 15 }; for(int = 0; i<16;i++){ m_a[i] = m_c[i]; } }
at point, matrix should fine , loaded opengl. setview method called in adjust():
void camera::setview() { float viewmatrix[16]={//remove 3 - non-inverted z-axis transform[0], transform[4], -transform[8], 0, transform[1], transform[5], -transform[9], 0, transform[2], transform[6], -transform[10], 0, -(transform[0]*transform[12] + transform[1]*transform[13] + transform[2]*transform[14]), -(transform[4]*transform[12] + transform[5]*transform[13] + transform[6]*transform[14]), //add - above non-inverted z-axis (transform[8]*transform[12] + transform[9]*transform[13] + transform[10]*transform[14]), 1}; } glloadmatrixf(viewmatrix); }
the functions called in finish scene this:
int drawglscene(glvoid){ // here's drawing
glclear(gl_color_buffer_bit | gl_depth_buffer_bit); // clear screen , depth buffer glmatrixmode(gl_modelview); glloadidentity(); // reset current modelview matrix glpushmatrix(); cam.refresh(); cam.adjust(); // distance between object , near plane gltranslatef(0.0f, 0.0f,-30.0f); // testwise rotating drawn object float rotx,roty,rotz; rotx = -90.0f; rotz = 0.0f; roty = 0.0f; meshnode* ameshnode = mymeshloader.getmeshnode(); while(ameshnode->next){ mesh amesh = *ameshnode->themesh; facenode* afacenode = amesh.getfirstfacenode(); while(afacenode->next){ face theface = *afacenode->aface; vertex thefacevertexa = amesh.getvertexat((*theface.myvertices)[0]); vertex thefacevertexb = amesh.getvertexat((*theface.myvertices)[1]); vertex thefacevertexc = amesh.getvertexat((*theface.myvertices)[2]); glcolor3f(1.0f,1.0f,1.0f); glbegin(gl_triangles); // drawing using triangles // glnormal3f(*theface.mynormal[0],*theface.mynormal[1],*theface.mynormal[2]); glvertex3f( thefacevertexa.position[0], thefacevertexa.position[1], thefacevertexa.position[2]); glvertex3f( thefacevertexb.position[0], thefacevertexb.position[1], thefacevertexb.position[2]); glvertex3f( thefacevertexc.position[0], thefacevertexc.position[1], thefacevertexc.position[2]); glend(); // finished drawing triangle afacenode = afacenode->next; } ameshnode = ameshnode->next; } glpopmatrix(); homecoming true; // went ok
}
here select modelview matrix, load identity matrix. between matrix force , pop photographic camera refresh , adjustment (which includes setview) set tranform object want draw, followed drawing object.
thats all. played around lot force , pops of matrix, looked @ flipcode photographic camera tutorial (http://www.flipcode.com/archives/opengl_camera.shtml), flickering still remains. have ideas wrong?
it depending on fact depth_test in application disable.
alternatively depending on size of depth buffer device support.
opengl matrix camera rotation camera-matrix
Comments
Post a Comment