游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2598|回复: 7

[求教]有关3D地表生成的问题!

[复制链接]

20

主题

398

帖子

398

积分

中级会员

Rank: 3Rank: 3

积分
398
发表于 2005-3-29 22:41:00 | 显示全部楼层 |阅读模式
      今天看了一篇文章——《自己动手编voxel 3D引擎》,对其内容很感兴趣,原理基本看懂了,可惜文章中没有源代码,而作者的主业有过期了,无法访问,所以对一些实现细节不太清楚,请高手指教!

原文如下:
      voxel 3D引擎的地形信息存储在一个数组中,此数组可以看作是一幅存储灰度数据的位图,位图的大小可以根据具体情况选择,我使用的是512*512的位图。位图中每一点处的灰度值代表该坐标处的地形海拔高度,越接近黑色则海拔越低,反之越接近白色则海拔越高。要使地形具有真实感,地形位图必须符合一些要求,主要是灰度数值的连续变化,距离越近的点灰度值越接近。其实地形位图非常容易得到,我们可以利用photoshop “Render”特效的“Clouds”项,将前景设为白色,背景设为黑色,这样得到的图象可以表现出非常真实的地形效果。有了地形数据,我们接下来要为地表覆上色彩,颜色数据同样存储在颜色位图中,大小与地形位图相同,两张位图中的点一一对应,颜色位图中每一点处的颜色代表该坐标处的地表色彩。我们同样使用“Clouds”特效来生成颜色位图。由于山脉的颜色通常是绿色或金黄色,所以这一回将前景设为绿色而背景设为金黄色。颜色位图在载入内存时要做一下光照处理,有光照效果的山脉会更加真实。具体的做法是根据地形位图中对应点处地表与水平方向的斜率计算出一个亮度值,用此亮度值对该点处的颜色进行明暗处理,将处理后的颜色值存入内存中的颜色数组。最后的效果相当不错,我们已经有了voxel 3D引擎的基本资源文件,可以想象一下最终的效果了。地形数据和颜色数据的存储你可以选择熟悉的文件格式,我使用的是gif 文件格式。
      512*512的位图到底能表现多大的地形范围呢?其实我们在处理的时候要将地形位图中的坐标乘以256,这样地形位图中每一点处的高度值代表我们所描绘的实际世界中256*256的正方形区域的高度,也就是说我们所描绘的真实面积是地形位图的65536倍,颜色位图也做同样的处理。这里不免使人迷惑,如此渲染出来的地形岂不是由大块大块的阶梯状平面所构成。的确是这样,只不过我们在处理时使用一些技巧,尽量避免表现出平面特征。我们所描绘的世界中的任何一点总是处于由地形位图中相临的四个点所构成的256*256的正方形区域中,这四个点的高度值代表着正方形区域四个顶点的高度,我们根据所描绘点在此正方形中的位置对四个顶点的高度进行线性插值,将插值得到的高度作为这个点的高度。进行插值处理后的地形会变得比较平滑。同样也要对颜色进行插值处理。由于颜色位图是经过光照处理的,再经过插值,得到的效果类似ground光照效果,将使地表显得更加平滑。
整个引擎的关键之处其实都在三个函数中,getAltitude()函数取得指定坐标处的地形高度值,getColor()函数取得指定坐标处的颜色值,在这两个函数中分别完成对高度和颜色的线性插值。render()函数调用前两个函数进行渲染,整个引擎的几何学部分都集中于此。对数学感到为难的朋友也不要害怕,render()函数只不过三四十行代码,所用的数学知识仅限于简单的三角函数和立体几何,最差也可以对着原码照猫画虎。最后将所有这些封装进一个C++类里,再加上对地形高度和颜色的抖动干扰处理,以表现出草地效果,以及使图象增色不少的天空效果,我们的引擎终于可以出笼了。

[问题]
      “我们根据所描绘点在此正方形中的位置对四个顶点的高度进行线性插值,将插值得到的高度作为这个点的高度。进行插值处理后的地形会变得比较平滑。同样也要对颜色进行插值处理。”

      请问如何对“四个顶点的高度进行线性插值”和“对颜色进行插值处理”?请详细解释一下原理和公式,能提供一些演示代码就更好了!

      万分感谢!感激涕零! [em14]

20

主题

398

帖子

398

积分

中级会员

Rank: 3Rank: 3

积分
398
 楼主| 发表于 2005-3-30 14:01:00 | 显示全部楼层

Re:[求教]有关3D地表生成的问题!

谁来帮帮我啊?我很想知道啊!

63

主题

871

帖子

891

积分

高级会员

Rank: 4

积分
891
QQ
发表于 2005-3-30 15:56:00 | 显示全部楼层

Re:[求教]有关3D地表生成的问题!

线性插值可以用硬件来做

用StretchRect的D3DTEXF_LINEAR放大一下位图,,硬件自己插值

140

主题

1228

帖子

1233

积分

金牌会员

Rank: 6Rank: 6

积分
1233
QQ
发表于 2005-3-31 02:17:00 | 显示全部楼层

Re:[求教]有关3D地表生成的问题!

所谓线性插值,就好像左边是 0 右边是 1 我在中间,我,0,1成一条直线!怎么算,随便你!
举个例子
有一条直线  
y=x;
我们只知道直线上两点   x=4,y=4  , x=5 ,y=5,现在要求 x=4.3时y=?
这就是线性插值了,你怎么办!推导直线公式么?
xl yl是第一点,xr yr 是第二点!x,y是我们要求得点;
线性插值就可以这样算!
(xr-x)*yl + (x-lx)*yr=y;
(yr-y)*xl + (y-ly)*xr=x;

140

主题

1228

帖子

1233

积分

金牌会员

Rank: 6Rank: 6

积分
1233
QQ
发表于 2005-3-31 02:23:00 | 显示全部楼层

Re:[求教]有关3D地表生成的问题!

不过我觉得这篇文章牛皮吹得太大!线性插值要是能令1像素对应256*256的高度产生像样的变化,美工都可以放假了!

20

主题

398

帖子

398

积分

中级会员

Rank: 3Rank: 3

积分
398
 楼主| 发表于 2005-3-31 09:40:00 | 显示全部楼层

Re:[求教]有关3D地表生成的问题!

感谢各位指点!

20

主题

398

帖子

398

积分

中级会员

Rank: 3Rank: 3

积分
398
 楼主| 发表于 2005-3-31 09:45:00 | 显示全部楼层

Re: Re:[求教]有关3D地表生成的问题!

lights: Re:[求教]有关3D地表生成的问题!

不过我觉得这篇文章牛皮吹得太大!线性插值要是能令1像素对应256*256的高度产生像样的变化,美工都可以放假了!


不知道作者是不是在吹牛,不过给的效果图看起来还是不错的哦!
sf_200533194524.jpg

7

主题

54

帖子

54

积分

注册会员

Rank: 2

积分
54
发表于 2005-4-1 00:50:00 | 显示全部楼层

Re:[求教]有关3D地表生成的问题!

效果图要放大了看。以前三角洲就是用这个技术作的。据说这种技术改变观察角度的高低会很麻烦。不过,美工怎么着都省不了吧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-25 02:58

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表