Posted on 2005-11-08 15:20
繁星 阅读(1513)
评论(0) 编辑 收藏 引用
计算机图形学中Bezier曲面在vb6.0中用DirectX8.0也能实现。我们先回顾一下由16个顶点控制的双三次Bezier曲面矩阵表达式:
1 0 0 0 v
00 v
01 v
02 v
03 1 -3 3 -1 1
r(u,w)=[1,u,u
2,u
3] [-3 3 0 0 ] [ v
10 v
11 v
12 v
13 ][ 0 3 -6 3 ] [ w ]
3 -6 3 0 v
20 v
21 v
22 v
23 0 0 3 -3 w
2 -1 3 -3 1 v
30 v
31 v
32 v
33 0 0 0 1 w
3设:
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
v
ij=<x
ij , y
ij , z
ij>
我们先计算曲面的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个顶点大小。如果更细分的话,画出来的网格更平滑。
原代码下载:
http://www.cnitblog.com/Files/seesea/bezier网格.rar