开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:1871

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 2309|回复: 38

[Y-miku] 仿无人深空-大型星球地形实现

[复制链接]  [移动端链接]
排名
330
昨日变化

41

主题

380

帖子

4815

积分

Rank: 9Rank: 9Rank: 9

UID
26484
好友
17
蛮牛币
12552
威望
0
注册时间
2014-5-24
在线时间
2498 小时
最后登录
2017-9-22

游戏蛮牛QQ群会员VIP

QQ
发表于 2017-3-22 22:22:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 Y-miku 于 2017-3-27 20:06 编辑

QQ截图20170322211300.png QQ截图20170327200531.png
实现了类似无人深空的星球地形,当然,网格地形和体素地形的自由度还是没法比的~

效果如上图
基本原理和我的上一篇博文一样,且对裂缝消除进行了优化,将搜寻邻居的时间复杂度从n^2降到了n
http://www.manew.com/thread-101305-1-1.html
下载地址 https://github.com/Ymiku/SpherePlanet-QuadTreeimplement

QQ截图20170322211244.png
在角色不移动状态下,每帧占用7ms左右
QQ截图20170322211221.png
在剧烈移动情况下(80%以上节点需更新),每帧85ms,大部分时间用在了烘焙碰撞体上,有待解决
下面说一下具体思路
这个球体是由6个面组成的,每个面都是一个独立的地形
初始时当做正常平面处理(计算位置,计算高度),在处理完毕后,对每个点进行归一化后乘以半径即可,此方法最简单好用,assetstore里的一些插件也是用的此方法,缺点是面不是很规则,不过问题不大
for (int i = 0; i < max; i++) {
        verts
= MathExtra.FastNormalize(verts ) * radius;
}

也可以把球形顶点信息预先存储为一个数组,保存到文件,初始化时读取,用到时直接读数组就行了,但是当lod层级过多时会导致数据过大
QQ截图20170322213015.png QQ截图20170322213024.png QQ截图20170322213036.png

接下来进行裂缝消除优化
具体算法在上一篇已经讲了,这里的性能瓶颈就是如何高效的获取邻居节点
由于四叉树的性质,我们只能直接获取两个邻居,那剩下的两个就要写算法去寻找了
在上一个版本中,我使用暴力枚举的方法,比如,当获取上方邻居时,先计算此节点上方的边的纵坐标(z),遍历寻找下方边与之纵坐标相等的顶点,然后再比较横坐标的范围,使用此算法,lod最大层级为8,,cl为3时就能感受到明显卡顿
除了暴力枚举,还有其他两种算法,
第一种,预先生成所有节点(全部最细分),预先计算邻居节点,当节点回退时,并不消除节点,而只是将活跃标记从此节点移到父节点,而寻找邻居时,直接就可以找到,当为失效节点时,继续找他的父节(活跃节点也可能为子节点,但这时由于算法需求,就不必找了,直接返回),直到找到活跃节点,这种方法的速度最快,但缺点就是,当lod过大时,会导致产生大量实例,以8为例,会产生约8w个实例
第二种,从根节点寻找,有点二分查找的意思,比如,当寻找上方节点时,先找到节点中心上方(半径+0.1m)的位置,即我们要找的节点正好包含这个位置,之后从根节点开始,找到四个子节点中距离此位置最近的节点,之后将找到的节点作为新的根节点进行递归,直到无子节点或lod与原节点相同,这里计算距离时,不用计算实际距离,用下面的函数即可
         public static float FastDis(Vector3 a,Vector3 b)
        {
                return Mathf.Abs (a.x - b.x) + Mathf.Abs (a.y - b.y) + Mathf.Abs (a.z - b.z);
        }

[C#] 纯文本查看 复制代码
private QTNode FindNearest(QTNode root,Vector3 pos)
        {
                QTNode node = root.GetChild (0);
                if (node == null||root.lodLevel==this.lodLevel)
                        return root;
                float dis;
                float disTemp;
                dis = MathExtra.FastDis (node.center, pos);

                disTemp = MathExtra.FastDis (root.GetChild (1).center, pos);
                if (disTemp < dis) {
                        dis = disTemp;
                        node = root.GetChild (1);
                }
                disTemp = MathExtra.FastDis (root.GetChild (2).center, pos);
                if (disTemp < dis) {
                        dis = disTemp;
                        node = root.GetChild (2);
                }
                disTemp = MathExtra.FastDis (root.GetChild (3).center, pos);
                if (disTemp < dis) {
                        dis = disTemp;
                        node = root.GetChild (3);
                }
                return FindNearest(node,pos);
        }


本来我还打算将 更新节点->尝试继续划分->更新网格 这个过程进行优化,只将改动过的节点传到下一步,但是发现效率并没有得到多大提升,反而有轻微下降,还需要继续优化
另外,在 尝试继续划分 和 更新网格 这两个步骤中,我们分别计算了两次邻居,还有优化空间,但是考虑到继续划分时生成了新的节点,就比较麻烦了,很可能得不偿失,也就没继续弄,而且此优化和上一个优化重合了
接下来就是由噪声生成高度图了,下次再说~





回复

使用道具 举报

6蛮牛粉丝
1292/1500
排名
2406
昨日变化
2

1

主题

463

帖子

1292

积分

Rank: 6Rank: 6Rank: 6

UID
171030
好友
4
蛮牛币
1587
威望
0
注册时间
2016-9-22
在线时间
346 小时
最后登录
2017-9-9

活力之星

发表于 2017-3-23 02:10:59 来自Mobile--- | 显示全部楼层
mark.好东西,研究一下

回复 支持 反对

使用道具 举报

5熟悉之中
913/1000
排名
4115
昨日变化
2

12

主题

482

帖子

913

积分

Rank: 5Rank: 5

UID
206456
好友
1
蛮牛币
2088
威望
0
注册时间
2017-2-14
在线时间
203 小时
最后登录
2017-9-15
发表于 2017-3-23 08:53:17 | 显示全部楼层
{:90:}{:90:}{:90:}
[发帖际遇]: snow3250ARPG 在网吧通宵,花了 3 蛮牛币. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

7日久生情
1529/5000
排名
1194
昨日变化
4

1

主题

199

帖子

1529

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
157507
好友
1
蛮牛币
2610
威望
0
注册时间
2016-7-18
在线时间
551 小时
最后登录
2017-9-23
QQ
发表于 2017-3-23 09:03:54 | 显示全部楼层
厉害啊 楼主。。。期待你的下篇文章。。网上对于动态地形生成都讳莫如深。。其实核心的精华在于如何优化

回复 支持 1 反对 0

使用道具 举报

7日久生情
1757/5000
排名
17035
昨日变化
8

2

主题

1478

帖子

1757

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
185807
好友
0
蛮牛币
2328
威望
0
注册时间
2016-11-22
在线时间
253 小时
最后登录
2017-9-22
发表于 2017-3-23 10:15:17 | 显示全部楼层
赞,不错不错,谢谢分享

回复 支持 反对

使用道具 举报

排名
31624
昨日变化
17

0

主题

8

帖子

18

积分

Rank: 1

UID
174118
好友
0
蛮牛币
21
威望
0
注册时间
2016-10-9
在线时间
4 小时
最后登录
2017-4-1
发表于 2017-3-23 11:08:12 | 显示全部楼层
学习.....

回复

使用道具 举报

3偶尔光临
220/300
排名
7255
昨日变化
89

0

主题

35

帖子

220

积分

Rank: 3Rank: 3Rank: 3

UID
207456
好友
0
蛮牛币
538
威望
0
注册时间
2017-2-20
在线时间
57 小时
最后登录
2017-9-23
发表于 2017-3-23 13:18:09 | 显示全部楼层
谢谢分享!

回复

使用道具 举报

排名
313
昨日变化

1

主题

340

帖子

2485

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
4748
好友
0
蛮牛币
8619
威望
0
注册时间
2013-9-29
在线时间
690 小时
最后登录
2017-9-22

社区QQ达人

发表于 2017-3-23 13:18:10 | 显示全部楼层
学习了 谢谢分享思路

回复 支持 反对

使用道具 举报

排名
24972
昨日变化
16

0

主题

5

帖子

18

积分

Rank: 1

UID
213933
好友
0
蛮牛币
26
威望
0
注册时间
2017-3-23
在线时间
3 小时
最后登录
2017-9-12
发表于 2017-3-23 14:40:22 | 显示全部楼层
学习学习

回复

使用道具 举报

4四处流浪
419/500
排名
6860
昨日变化
6

0

主题

73

帖子

419

积分

Rank: 4

UID
115241
好友
2
蛮牛币
136
威望
0
注册时间
2015-7-26
在线时间
208 小时
最后登录
2017-7-31
发表于 2017-3-23 15:07:48 | 显示全部楼层
请问能不能把实例工程分享一下,另外我的unity版本是4.6可以运行么

点评

https://github.com/Ymiku/SpherePlanet-QuadTreeimplement 我的版本是5.3.6 4.6应该也行,没用什么新特性,有错的话也是小错  发表于 2017-3-23 16:02

回复 支持 反对

使用道具 举报

0

主题

3

帖子

3

积分

Rank: 1

UID
213961
好友
0
蛮牛币
5
威望
0
注册时间
2017-3-23
在线时间
0 小时
最后登录
2017-3-23
发表于 2017-3-23 16:05:03 | 显示全部楼层
6666666666666
[发帖际遇]: wx_q77T7w4C 乐于助人,奖励 2 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

4四处流浪
419/500
排名
6860
昨日变化
6

0

主题

73

帖子

419

积分

Rank: 4

UID
115241
好友
2
蛮牛币
136
威望
0
注册时间
2015-7-26
在线时间
208 小时
最后登录
2017-7-31
发表于 2017-3-23 16:39:15 | 显示全部楼层
1115803755 发表于 2017-3-23 15:07
请问能不能把实例工程分享一下,另外我的unity版本是4.6可以运行么

我下载下来之后发现场景里面没有什么东西,报错有两个我给注释掉了。其实主要是我不知道怎么用

点评

运行时才会生成星球,这个目前只提供了最基本的功能,还不可以直接用,想用的话只能根据需求去改LCQTMesh  发表于 2017-3-23 16:54

回复 支持 反对

使用道具 举报

排名
21478
昨日变化
16

0

主题

18

帖子

40

积分

Rank: 1

UID
212556
好友
0
蛮牛币
15
威望
0
注册时间
2017-3-17
在线时间
8 小时
最后登录
2017-6-27
发表于 2017-3-23 16:40:21 | 显示全部楼层
学习学习。

回复

使用道具 举报

4四处流浪
419/500
排名
6860
昨日变化
6

0

主题

73

帖子

419

积分

Rank: 4

UID
115241
好友
2
蛮牛币
136
威望
0
注册时间
2015-7-26
在线时间
208 小时
最后登录
2017-7-31
发表于 2017-3-23 17:28:01 | 显示全部楼层
1115803755 发表于 2017-3-23 16:39
我下载下来之后发现场景里面没有什么东西,报错有两个我给注释掉了。其实主要是我不知道怎么用 ...

请问下从哪里开始启动,我打开工程里面就有一个1的空场景

点评

版本不兼容吧  发表于 2017-3-23 18:45

回复 支持 反对

使用道具 举报

5熟悉之中
621/1000
排名
3028
昨日变化
2

0

主题

50

帖子

621

积分

Rank: 5Rank: 5

UID
42016
好友
0
蛮牛币
562
威望
0
注册时间
2014-8-26
在线时间
203 小时
最后登录
2017-9-22
发表于 2017-3-24 09:00:58 | 显示全部楼层
楼主真是腻害

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

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