Val view_parse(int pass, Pval *pl) { Val v = {V_NULL, 0}; if (pass == T_EXEC) { View *view = initview(); Vector3 ref = pvl_get_v3(pl, "from", v3_make(0,-5,0)); Vector3 at = pvl_get_v3(pl, "at", v3_make(0,0,0)); Vector3 up = pvl_get_v3(pl, "up", v3_make(0,0,1)); double fov = pvl_get_num(pl, "fov", 90); double w = pvl_get_num(pl, "imgw", 320); double h = pvl_get_num(pl, "imgh", 240); lookat(view, ref.x, ref.y, ref.z, at.x, at.y, at.z, up.x, up.y, up.z); setviewpoint(ref.x, ref.y, ref.z); setviewnormal(at.x - ref.x ,at.y - ref.y, at.z - ref.z); makeviewV(); perspective(view, fov * DTOR, w/h, 1.0, 100000.0); viewport(view, 0.,0., w, h); v.type = V_CAMERA; v.u.v = view; } return v; }
void lookat(View *v, Real vx, Real vy, Real vz, Real px, Real py, Real pz, Real ux, Real uy, Real uz) { setview(v); setviewpoint(vx, vy, vz); setviewnormal(px - vx ,py - vy, pz - vz); setviewup(ux, uy, uz); makeviewV(); }
View* initview(void) { setview(NEWSTRUCT(View)); setviewdefaults(); makeviewV(); makeviewC(); makeviewP(); makeviewS(); return getview(); }
void camera(View *v, Real rx, Real ry, Real rz, Real nx, Real ny, Real nz , Real ux, Real uy, Real uz, Real deye) { setview(v); setviewup(ux, uy, uz); setviewnormal(nx, ny, nz); setviewpoint(rx - (v->normal.x*deye), ry - (v->normal.y*deye), rz - (v->normal.z*deye)); makeviewV(); }
void polarview(View *v, Real dist, Real azimuth, Real pich, Real roll) { setview(v); setviewnormal(sin(azimuth)*cos(pich), cos(azimuth)*cos(pich), sin(pich)); setviewpoint(-dist * v->normal.x,-dist * v->normal.y, -dist * v->normal.z ); if (fabs(v->normal.x) < ROUNDOFF && fabs(v->normal.y) < ROUNDOFF) setviewup(sin(roll)*v->normal.z, -cos(roll)*v->normal.z,0.0); else setviewup(sin(roll)*v->normal.y, -sin(roll)*v->normal.x, cos(roll)*hypot(v->normal.x,v->normal.y)); makeviewV(); }
void GLWidget::keyPressEvent(QKeyEvent *event) { Matrix4 M; Vector3 Dir; switch (event->key()) { case Qt::Key_Q: case Qt::Key_A: M = m4_rotate('y', 0.5); scene->view->center = v3_m4mult(scene->view->center,M); scene->view->normal = v3_m4mult(scene->view->normal,M); makeviewV(); setview(scene->view); break; case Qt::Key_D: M = m4_rotate('y', -0.5); scene->view->center = v3_m4mult(scene->view->center,M); scene->view->normal = v3_m4mult(scene->view->normal,M); makeviewV(); setview(scene->view); break; case Qt::Key_W: M = m4_rotate('x', 0.5); scene->view->center = v3_m4mult(scene->view->center,M); scene->view->up = v3_m4mult(scene->view->up,M); scene->view->normal = v3_m4mult(scene->view->normal,M); makeviewV(); setview(scene->view); break; case Qt::Key_S: M = m4_rotate('x', -0.5); scene->view->center = v3_m4mult(scene->view->center,M); scene->view->up = v3_m4mult(scene->view->up,M); scene->view->normal = v3_m4mult(scene->view->normal,M); makeviewV(); setview(scene->view); break; case Qt::Key_Left: Dir = v3_cross(scene->view->up,scene->view->normal); scene->view->center = v3_add(scene->view->center,v3_scale(0.5,Dir)); makeviewV(); setview(scene->view); break; case Qt::Key_Right: Dir = v3_cross(scene->view->up,scene->view->normal); scene->view->center = v3_sub(scene->view->center,v3_scale(0.5,Dir)); makeviewV(); setview(scene->view); break; case Qt::Key_Up: scene->view->center = v3_add(scene->view->center,v3_scale(0.5,scene->view->up)); makeviewV(); setview(scene->view); break; case Qt::Key_Down: scene->view->center = v3_sub(scene->view->center,v3_scale(0.5,scene->view->up)); makeviewV(); setview(scene->view); break; case Qt::Key_Escape: exit(0); break; case Qt::Key_R: if (!lastfile.isEmpty()) load_scene_file(lastfile.toLatin1().data()); break; } update(); }