VBGAME-DIRECT3D

坚持并快乐着!——繁星
posts - 15, comments - 15, trackbacks - 0, articles - 1
  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Bezier曲面网格的VB实现

Posted on 2005-11-08 15:20 繁星 阅读(1513) 评论(0)  编辑 收藏 引用
计算机图形学中Bezier曲面在vb6.0中用DirectX8.0也能实现。我们先回顾一下由16个顶点控制的双三次Bezier曲面矩阵表达式:
                              1    0     0    0       v00  v01  v02  v03      1  -3   3  -1       1     
r(u,w)=[1,u,u2,u3]    [-3    3     0    0 ] [ v10  v11  v12  v13 ][  0   3  -6   3 ] [   w  ]
                              3   -6    3     0       v20  v21  v22  v23      0   0   3  -3      w2
                             -1    3   -3    1        v30  v31  v32  v33      0   0   0    1     w3
设:
    f0(u)=1 - 3 * u + 3 u * u - u * u * u
    f1(u) = 3 * u - 6 * u * u + 3 * u * u * u
    f2(u) = 3 * u * u - 3 * u * u * u
    f3(u) = u * u * u
    vij=<xij ,  yij , zij>
我们先计算曲面的x分量,则有  
   a = x(0, 0) * f0(u) + x(1, 0) * f1(u) + x(2, 0) * f2(u) + x(3, 0) * f3(u)
   b = x(0, 1) * f0(u) + x(1, 1) * f1(u) + x(2, 1) * f2(u) + x(3, 1) * f3(u)
   c = x(0, 2) * f0(u) + x(1, 2) * f1(u) + x(2, 2) * f2(u) + x(3, 2) * f3(u)
   d = x(0, 3) * f0(u) + x(1, 3) * f1(u) + x(2, 3) * f2(u) + x(3, 3) * f3(u)
   R(u,w) = a + (-3 * a + 3 * b) * w + (3 * a - 6 * b + 3 * c) * w * w + (-a + 3 * b - 3 * c + d) * w * w * w
其余其他分量(y和z分量)计算方法相同。
在这里我们用10×10网格来生成图形,u和w每隔0.1取一采样点,共121个点。采用Linestrip图元,写入顶点缓存,共用了321个顶点大小。如果更细分的话,画出来的网格更平滑。
   
                 wg.JPG

                 wg1.JPG
原代码下载: http://www.cnitblog.com/Files/seesea/bezier网格.rar                                   
只有注册用户登录后才能发表评论。