Example #1
0
void ViewportUtil::setView() {
    // passage souris en normalisé : xn=1/wv*xs-xv, yn=1/yw*ys-yv
	Matrix4d mproj;
	Matrix4d mmodelview;
	Matrix4d localNormalized;
	double viewport[4]; // viewport : [0]=x_min,[1]=y_min, [2]=width, [3]=height
	double mat[16];
	glGetDoublev(GL_VIEWPORT, viewport);
	glGetDoublev(GL_PROJECTION_MATRIX,mat);
	mproj.set(mat);
	glGetDoublev(GL_MODELVIEW_MATRIX, mat);
	eyeLocal.set(mat);
	mmodelview.set(mat);
	normalizedLocal.mul(mproj,mmodelview);
	localNormalized.invert(normalizedLocal);


	normalizedWindow.setRow(0,2.0/viewport[2],0,0,-1-viewport[0]);
	normalizedWindow.setRow(1,0,-2.0/viewport[3],0,1+viewport[1]);
	normalizedWindow.setRow(2,0,0,1,0);
	normalizedWindow.setRow(3,0,0,0,1);
//	normalizedWindow.print("normalizedWindow");
	windowNormalized.invert(normalizedWindow);
//	windowNormalized.print("windowNormalized");
	localWindow.mul(localNormalized,normalizedWindow);
//	localWindow.print("localWindow=");
}
Example #2
0
Point3d ViewportUtil::cameraLocal() {
	float mat[16];
	glGetFloatv(GL_MODELVIEW_MATRIX,mat);
	Matrix4d m;
	m.set(mat);
	m.invert();
	Point3d p(0,0,0);
	m.transform(&p);
	return p;
}
Example #3
0
void Camera::computeMatrix(){
	
	Vector3d z = e - d;
	z.normalize();
	Vector3d x = up.cross(z);
	x.normalize();
	Vector3d y = z.cross(x);
	y.normalize();
	Matrix4d r;
	r.identity();
	r.set(0, 0, x[0]);
	r.set(1, 0, x[1]);
	r.set(2, 0, x[2]);

	r.set(0, 1, y[0]);
	r.set(1, 1, y[1]);
	r.set(2, 1, y[2]);

	r.set(0, 2, z[0]);
	r.set(1, 2, z[1]);
	r.set(2, 2, z[2]);
	Matrix4d t;
	t.identity();
	t.makeTranslate(-e[0], -e[1], -e[2]);
	m = r * t;
	
}
Example #4
0
void Camera::setCamera(double eyeX, double eyeY, double eyeZ,
	double centerX, double centerY, double centerZ,
	double upX, double upY, double upZ){
	
	double f[3];
	f[0] = centerX - eyeX; 
	f[1] = centerY - eyeY;
	f[2] = centerZ - eyeZ;
	double m_f = sqrt(f[0] * f[0] + f[1] * f[1] + f[2] * f[2]);
	f[0] /= m_f;
	f[1] /= m_f;
	f[2] /= m_f;

	double up[3];
	up[0] = upX;
	up[1] = upY;
	up[2] = upZ;
	double m_u = sqrt(up[0] * up[0] + up[1] * up[1] + up[2] * up[2]);
	up[0] /= m_u;
	up[1] /= m_u;
	up[2] /= m_u;

	double s[3];
	s[0] = f[1] * up[2] - f[2] * up[1];
	s[1] = f[2] * up[0] - f[0] * up[2];
	s[2] = f[0] * up[1] - f[1] * up[0];

	double u[3];
	u[0] = s[1] * f[2] - s[2] * f[1];
	u[1] = s[2] * f[0] - s[0] * f[2];
	u[2] = s[0] * f[1] - s[1] * f[0];

	Matrix4d r;						// inverse rotation
	r.identity();
	r.set(0, 0, s[0]);
	r.set(1, 0, s[1]);
	r.set(2, 0, s[2]);

	r.set(0, 1, u[0]);
	r.set(1, 1, u[1]);
	r.set(2, 1, u[2]);

	r.set(0, 2, -f[0]);
	r.set(1, 2, -f[1]);
	r.set(2, 2, -f[2]);


	Matrix4d t;						// inverse translation
	t.identity();
	t.makeTranslate(-eyeX, -eyeY, -eyeZ);

	m = r * t;						// inverse camera


}