Beispiel #1
0
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;
}
Beispiel #2
0
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();
}
Beispiel #3
0
View* initview(void)
{
  setview(NEWSTRUCT(View));
  setviewdefaults();
  makeviewV();
  makeviewC();
  makeviewP();
  makeviewS();
  return getview();
}
Beispiel #4
0
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();
}
Beispiel #5
0
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();
}
Beispiel #6
0
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();
}