SubdivideAndDrawQuad 函数解析
1 void SubdivideAndDrawQuad( int uSteps, int vSteps, 2 float s0, float t0, float x0, float y0, float z0, 3 float s1, float t1, float x1, float y1, float z1, 4 float s2, float t2, float x2, float y2, float z2, 5 float s3, float t3, float x3, float y3, float z3 ) 6 { 7 float tc0[3] = { s0, t0, 0.0 }; float v0[3] = { x0, y0, z0 }; 8 float tc1[3] = { s1, t1, 0.0 }; float v1[3] = { x1, y1, z1 }; 9 float tc2[3] = { s2, t2, 0.0 }; float v2[3] = { x2, y2, z2 }; 10 float tc3[3] = { s3, t3, 0.0 }; float v3[3] = { x3, y3, z3 }; 11 12 glBegin( GL_QUADS ); 13 14 for ( int u = 0; u < uSteps; u++ ) 15 { 16 float uu = (float) u / uSteps; 17 float uu1 = (float) (u + 1) / uSteps; 18 float Atc[3], Btc[3], Ctc[3], Dtc[3]; 19 float Av[3], Bv[3], Cv[3], Dv[3]; 20 21 for ( int i = 0; i < 3; i++ ) 22 { 23 Atc[i] = tc0[i] + uu * ( tc1[i] - tc0[i] ); 24 Btc[i] = tc3[i] + uu * ( tc2[i] - tc3[i] ); 25 Ctc[i] = tc0[i] + uu1 * ( tc1[i] - tc0[i] ); 26 Dtc[i] = tc3[i] + uu1 * ( tc2[i] - tc3[i] ); 27 Av[i] = v0[i] + uu * ( v1[i] - v0[i] ); 28 Bv[i] = v3[i] + uu * ( v2[i] - v3[i] ); 29 Cv[i] = v0[i] + uu1 * ( v1[i] - v0[i] ); 30 Dv[i] = v3[i] + uu1 * ( v2[i] - v3[i] ); 31 } 32 33 for ( int v = 0; v < vSteps; v++ ) 34 { 35 float vv = (float) v / vSteps; 36 float vv1 = (float) (v + 1) / vSteps; 37 float Etc[3], Ftc[3], Gtc[3], Htc[3]; 38 float Ev[3], Fv[3], Gv[3], Hv[3]; 39 40 for ( int i = 0; i < 3; i++ ) 41 { 42 Etc[i] = Atc[i] + vv * ( Btc[i] - Atc[i] ); 43 Ftc[i] = Ctc[i] + vv * ( Dtc[i] - Ctc[i] ); 44 Gtc[i] = Atc[i] + vv1 * ( Btc[i] - Atc[i] ); 45 Htc[i] = Ctc[i] + vv1 * ( Dtc[i] - Ctc[i] ); 46 Ev[i] = Av[i] + vv * ( Bv[i] - Av[i] ); 47 Fv[i] = Cv[i] + vv * ( Dv[i] - Cv[i] ); 48 Gv[i] = Av[i] + vv1 * ( Bv[i] - Av[i] ); 49 Hv[i] = Cv[i] + vv1 * ( Dv[i] - Cv[i] ); 50 } 51 52 glTexCoord2fv( Etc ); glVertex3fv( Ev ); 53 glTexCoord2fv( Ftc ); glVertex3fv( Fv ); 54 glTexCoord2fv( Htc ); glVertex3fv( Hv ); 55 glTexCoord2fv( Gtc ); glVertex3fv( Gv ); 56 } 57 } 58 59 glEnd(); 60 }
主要需要理解的点:
1 ustep和vstep是沿着x,y两个方向的增量;
2 uu = u/ustep,float类型参数,假如ustep=24,u=1,则uu=1/24,因为如果直接放1和24的话,结果也会是int类型,这样就得不到精确结果;
3 同时需要uu,uu1,是因为uu和uu1使之能够话出小多边形,uu1是uu的下一点;
4 同时使用 t0,t1 与 t2,t3 来计算上下边在u方向上的变化(t0t1是下面的边,t2t3是上面的边)是因为当这个正方形是斜着的,就是边不与坐标轴垂直或平行时,x,y,z的坐标都不同,都得重新计算,当然,当垂直或平行时,可以只计算一边,另一边只需相应的改变y就行。

浙公网安备 33010602011771号