Ejemplo n.º 1
0
    void rotate(Points *p, Line axis, float degrees) {

        if (degrees == 0.0)
            return;

        float rads = degrees*M_PI/180.0;
        //float sign = (rads >= 0) ? -1.0 : 1.0;

        rads = fabs(rads);

        // Do not return points
        Point p1 = axis.a;
        Point p2 = axis.b;

        if (magnitude(p1) > magnitude(p2))
            swap(p1, p2);

        Point d = unit_length(Line(p1, p2));

        if (isnan(d.x) || isnan(d.y) || isnan(d.z))
            return;

        float u = d.x;
        float v = d.y;
        float w = d.z;
        float a = p1.x;
        float b = p1.y;
        float c = p1.z;

        Matrix *M = new Matrix(4, 4);
        M->data()[0][0] = u*u + (v*v + w*w) * cos(rads);
        M->data()[0][1] = u*v*(1-cos(rads)) - w*sin(rads);
        M->data()[0][2] = u*w*(1-cos(rads)) + v*sin(rads);
        M->data()[0][3] = (a*(v*v + w*w) - u*(b*v + c*w))*(1-cos(rads)) + (b*w - c*v)*sin(rads);

        M->data()[1][0] = u*v*(1-cos(rads)) + w*sin(rads);
        M->data()[1][1] = v*v + (u*u + w*w)*cos(rads);
        M->data()[1][2] = v*w*(1-cos(rads)) - u*sin(rads);
        M->data()[1][3] = (b*(u*u + w*w) - v*(a*u + c*w))*(1-cos(rads)) + (c*u - a*w)*sin(rads);

        M->data()[2][0] = u*w*(1-cos(rads)) - v*sin(rads);
        M->data()[2][1] = v*w*(1-cos(rads)) + u*sin(rads);
        M->data()[2][2] = w*w + (u*u + v*v)*cos(rads);
        M->data()[2][3] = (c*(u*u + v*v) - w*(a*u + b*v))*(1-cos(rads)) + (a*v - b*u)*sin(rads);

        M->data()[3][0] = 0;
        M->data()[3][1] = 0;
        M->data()[3][2] = 0;
        M->data()[3][3] = 1;

        apply_transform(p, M);

        delete M;

    }
Ejemplo n.º 2
0
void jitter_view()
{
struct point eye, view, up, vdir, utemp, vtemp;

eye.x = 2.0; eye.y = 2.0; eye.z = 2.0;
view.x = JITTER*genrand(); view.y = JITTER*genrand(); view.z = JITTER*genrand();
up.x = 0.0; up.y = 1.0; up.z = 0.0;
vdir.x = view.x - eye.x; vdir.y = view.y - eye.y; vdir.z = view.z - eye.z;
// Calculate correct up vector as orthogonal to vdir and in the plane of
// vdir and (0,1,0).
vtemp = cross(vdir,up);
utemp = cross(vtemp,vdir);
up = unit_length(utemp);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(eye.x,eye.y,eye.z,view.x,view.y,view.z,up.x,up.y,up.z);
}