java3d bezier曲面_使用Bezier曲面渲染飘动的红旗

本文介绍了如何使用Java3D库中的Bezier曲面技术,结合纹理,渲染出飘动的红旗。通过计算曲面上各点的伯恩斯坦多项式及其导数,求得法线,进而实现3D空间中红旗的动态效果。代码示例展示了从创建顶点数据、索引数据到设置顶点着色器的过程。
摘要由CSDN通过智能技术生成

本例中我们使用的纹理如下:

5a7d4006fccdb33784683b72fa3b4d21.png

Bezier曲线大家应该都很熟悉了,Bezier曲线由4个控制点定义,Bezier曲线的数学定义为:

b7a88bf3c6b7d4f7d294c0ea6364ae07.png

其中,p0~p3定义了4个控制点,b0~b3为伯恩斯坦多项式的项,s的范围为0.0~1.0从而覆盖了曲线上的所有点,如图:

2733eca01999927ec03572c7e43798e0.png

伯恩斯坦多项式的形式如下:

11f0b62372bd5a94e184d006a76e0c37.png

在3D世界中,我们需要用Bezier曲面来代替Bezier曲线,由Bezier曲线扩展到Bezier曲面是十分简单的,只需将4个控制点扩展为4*4控制网格即可,Bezier曲面的数学定义如下:

d6468572d9d6f66a519de28be9b06231.png

其中,p0~p15代表4*4控制网格上的16个控制点,b0~b3与Bezier曲线一样,代表伯恩斯坦多项式的项,s与t代表2个方向,范围为0.0~1.0从而覆盖了曲面上的所有点。

关于Bezier曲面的知识了解这些就够了,我们就可以使用它来渲染飘动的红旗了,但是在渲染时,我们还有一个问题需要考虑,就是法线的问题,该如何求曲面上的点的法线呢?

我们知道,导数描述了任一给定点处的曲线的斜率,下图描述了

fd3f74ded9619b268f63beb552594c15.png及其导数的图形表示:

314b8e13f975952a88cbb1ddd4cefc1f.png

所以,我们只要使用Bezier曲线的导数形式就可以求出对于Bezier曲面上的任一给定点在s和t两个方向上的曲线的斜率,然后使用向量叉积就求得了法线,如图:

ad4b56b7ec118df7cb3deafb93b91951.png

有许多求导数的方法,在这里我们使用最简单的形式,我们定义:

285d3a6d26ae6b24b397719907193e0b.png的导数形式为

c7aa0b0a50a7b2f73420b9de823a3702.png。记住,常数的导数为0。

根据如上的定义,我们就可以得到伯恩斯坦多项式的项的导数的定义:

f77fcc720db4bbcaf2909badb033ad01.png

好了,至此我们已经了解了所有所需的知识,接下来,就是用代码实现的时刻了^-^!

首先我们定义x,z方向上顶点的数量:

1 const int VERTEX_ROW_COUNT = 20;

2 const int VERTEX_COL_COUNT = 20;

接着我们定义顶点结构:

1 struct BEZIER_VERTEX

2 {

3 float x, y, z; //顶点坐标4 float u, v; //纹理坐标5 float Bs0, Bs1, Bs2, Bs3; //关于s的Bernstein多项式的4项的值6 float Bt0, Bt1, Bt2, Bt3; //关于t的Bernstein多项式的4项的值7 float dBs0, dBs1, dBs2, dBs3; //关于s的Bernstein多项式的4项的导数的值8 float dBt0, dBt1, dBt2, dBt3;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值