… | |
… | |
50 | |
50 | |
51 | glMatrixMode (GL_PROJECTION); |
51 | glMatrixMode (GL_PROJECTION); |
52 | glLoadIdentity (); |
52 | glLoadIdentity (); |
53 | |
53 | |
54 | GLdouble aspect = (GLdouble)w/h; |
54 | GLdouble aspect = (GLdouble)w/h; |
55 | GLdouble zNear = 0.001; |
55 | GLdouble zNear = 0.1; |
56 | GLdouble zFar = 100.; |
56 | GLdouble zFar = 50.; |
57 | |
57 | |
58 | GLdouble ymax = zNear * tan (fov * (M_PI / 360.0)); |
58 | GLdouble ymax = zNear * tan (fov * (M_PI / 360.0)); |
59 | glFrustum (-ymax * aspect, ymax * aspect, -ymax, ymax, zNear, zFar); |
59 | glFrustum (-ymax * aspect, ymax * aspect, -ymax, ymax, zNear, zFar); |
60 | |
60 | |
|
|
61 | d = normalize (d);//D |
|
|
62 | u = normalize (u);//D |
61 | vec3 rz = -d; |
63 | vec3 rz = -d; |
62 | vec3 rx = cross (u, rz); |
64 | vec3 rx = cross (u, rz); |
63 | vec3 ry = cross (rz, rx); |
65 | vec3 ry = cross (rz, rx); |
64 | |
66 | |
65 | gl_matrix &m = ctx.projection; |
67 | gl_matrix &m = ctx.projection; |
66 | m(0,0) = rx.x; m(0,1) = rx.y; m(0,2) = rx.z; m(0,3) = 0; |
68 | m(0,0) = rx.x; m(0,1) = rx.y; m(0,2) = rx.z; m(0,3) = -p.x; |
67 | m(1,0) = ry.x; m(1,1) = ry.y; m(1,2) = ry.z; m(1,3) = 0; |
69 | m(1,0) = ry.x; m(1,1) = ry.y; m(1,2) = ry.z; m(1,3) = -p.y; |
68 | m(2,0) = rz.x; m(2,1) = rz.y; m(2,2) = rz.z; m(2,3) = 0; |
70 | m(2,0) = rz.x; m(2,1) = rz.y; m(2,2) = rz.z; m(2,3) = -p.z; |
69 | m(3,0) = 0; m(3,1) = 0; m(3,2) = 0; m(3,3) = 1; |
71 | m(3,0) = 0; m(3,1) = 0; m(3,2) = 0; m(3,3) = 1; |
70 | |
72 | |
71 | glMultMatrixf ((GLfloat *)m.data); |
73 | glMultMatrixf ((GLfloat *)m.data); |
|
|
74 | |
72 | glTranslatef (-p.x, -p.y, -p.z); |
75 | //glTranslatef (-p.x, -p.y, -p.z); |
73 | |
76 | |
74 | glGetFloatv (GL_PROJECTION_MATRIX, (GLfloat *)&m); |
77 | glGetFloatv (GL_PROJECTION_MATRIX, (GLfloat *)&m); |
75 | |
78 | |
76 | ctx.frustum.l = plane ( m(0,3) + m(0,0), m(1,3) + m(1,0), m(2,3) + m(2,0), m(3,3) + m(3,0) ); |
79 | ctx.frustum.l = plane ( m(3,0) + m(0,0), m(3,1) + m(0,1), m(3,2) + m(0,2), m(3,3) + m(0,3) ); |
77 | ctx.frustum.r = plane ( m(0,3) - m(0,0), m(1,3) - m(1,0), m(2,3) - m(2,0), m(3,3) - m(3,0) ); |
80 | ctx.frustum.r = plane ( m(3,0) - m(0,0), m(3,1) - m(0,1), m(3,2) - m(0,2), m(3,3) - m(0,3) ); |
78 | ctx.frustum.b = plane ( m(0,3) + m(0,1), m(1,3) + m(1,1), m(2,3) + m(2,1), m(3,3) + m(3,1) ); |
81 | ctx.frustum.b = plane ( m(3,0) + m(1,0), m(3,1) + m(1,1), m(3,2) + m(1,2), m(3,3) + m(1,3) ); |
79 | ctx.frustum.t = plane ( m(0,3) - m(0,1), m(1,3) - m(1,1), m(2,3) - m(2,1), m(3,3) - m(3,1) ); |
82 | ctx.frustum.t = plane ( m(3,0) - m(1,0), m(3,1) - m(1,1), m(3,2) - m(1,2), m(3,3) - m(1,3) ); |
80 | ctx.frustum.n = plane ( m(0,3) + m(0,2), m(1,3) + m(1,2), m(2,3) + m(2,2), m(3,3) + m(3,2) ); |
83 | ctx.frustum.n = plane ( m(3,0) + m(2,0), m(3,1) + m(2,1), m(3,2) + m(2,2), m(3,3) + m(2,3) ); |
81 | ctx.frustum.f = plane ( m(0,3) - m(0,2), m(1,3) - m(1,2), m(2,3) - m(2,2), m(3,3) - m(3,2) ); |
84 | ctx.frustum.f = plane ( m(3,0) - m(2,0), m(3,1) - m(2,1), m(3,2) - m(2,2), m(3,3) - m(2,3) ); |
82 | |
85 | |
83 | glMatrixMode (GL_MODELVIEW); |
86 | glMatrixMode (GL_MODELVIEW); |
84 | glLoadIdentity (); |
87 | glLoadIdentity (); |
85 | |
88 | |
86 | world.draw (ctx); |
89 | world.draw (ctx); |
… | |
… | |
89 | |
92 | |
90 | glColorMask (1, 1, 1, 0); |
93 | glColorMask (1, 1, 1, 0); |
91 | glDepthMask (1); |
94 | glDepthMask (1); |
92 | } |
95 | } |
93 | |
96 | |
|
|
97 | |