三维随机分形地形生成(14)
发布时间:2021-06-07
发布时间:2021-06-07
COpenGLView 有一个 RenderScene 虚成员,我们在 CFractalExampleView 里重载之。这里将完成主要的绘制工作。函数先检查 Rendering type 的设定。当设为 2D mesh/lines or 1D midpoint displacement 时,工作由 RenderScene 完成。否则,别的函数被调用。 CFractalExampleViewe::OnViewDialog 生成 View Options 对话框,并处理设置及在 CFractalExampleView 与对话框类间提取数据。
CFractalExampleView::OnInitialUpdate 管理设置所有 CFractalExamleView 成员变量为其默认值(含对话框值)。
实际上关于代码是如何工作的并没有太多可解释的地方。我假定你是一个能干的程序员,且我已经尽力给代码加上详细的注释。如果你不熟悉 OpenGL ,注意 gl 开头的函数都是 OpenGL API 调用,详见 VC++ 的帮助文档或 Blue Book 。
有一个特性是刚开始加进代码中的。在 FractalExampleView.cpp 文件中,有一个名为
DEF_HIGHT_VALUE 的预处理常量。它传给 fractmod.c 文件中的分形生成函数,用来缩放高度值。其实它应该是由 View Options 对话框控制的变量。尽管加上这个特性好了。
关键代码:
1、Square步的端点值平均算法(fractmod.c)
2、Diamond步的端点值平均算法(fractmod.c)
3、使用Square-Diamond算法进行分形数组填充(fractmod.c)
4、地形排列的边界拼接算法
z = -1.f * (float) (tile-1);
for (i=0; i<tile; i++) {
x = -1.f * (float) (tile-1);
for (j=0; j<tile; j++) {
glPushMatrix ();
glTranslatef (x, 0.f, z);
draw2DFractArrayAsLines (surfFA, size);
glPopMatrix ();
x += 2.f;
}