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就行。

posted @ 2013-02-12 10:52  qingsun_ny  阅读(669)  评论(0)    收藏  举报