百度地图动态渲染windowinfo_【奇正游戏×史图馆】《兵法 战国篇》开发日志——地图制作(二)...

本文主要是介绍百度地图动态渲染windowinfo_【奇正游戏×史图馆】《兵法 战国篇》开发日志——地图制作(二)...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

d5344289535a03836a7e974b950a7183.png

如果想支持一下我们,

可以在这里添加一个愿望单:

兵法:战国篇 on Steam​store.steampowered.com
f5f82698ea67ff62b8527238dafda3e3.png

ef24104dbb1095c7a3566c859cea313b.png

同时也可以下载免费试玩DEMO体验一下:

248a33ce5e317f9336e42fe7a319e63c.png

或者点「关注」能看到更新日志。

1134121286edba7dcb9ceb15e9dbed1a.png

QQ群也可以了解开发情况:991942345

如果你迫不及待想玩bug,可以在这里加入内测:

爱发电 · 连接创作者与粉丝的会员制平台​afdian.net
9a9af399ad59312dbbf3f5a2c9e6a3c9.png

2D地图的尝试

地图最初考虑的是使用2D的方式制作,因此在此方向上进行了一些尝试,最终因为一些较为致命的原因选择了放弃2D地图,改为尝试3D地图。

尝试合适的制作方式

2D地图的制作方式,不外乎两种:①手绘地图,②三转二渲染地图。

中国的地图面积极为巨大,加上我们的地图比例尺很大,因此整个绘制工作量非常巨大,后期修改起来难度也很高。另一方面,要确定地图的绘制风格,也需要时间进行尝试,如果持续找不到合适的风格,成本也会难以承受。

0ce90bb31a70526b4fe2bc44aa91b9ae.png
最初的地图概念图

经过折中考虑后,我认为可以尝试将不同的地形和物件绘制成基本元件,然后在引擎中用代码将元件生成在地图上,理论上可以更高效的获得具有手绘感的地图。

但经过实际尝试,近距离的效果还好,但如果拉远距离后,如秦岭、云贵高原等大面积山地的区域看起来会非常丑,重复感也会很重。

2de45deecb3a5d33a280ca7c48be3644.png
程序生成山地的测试

经过反复尝试最终决定放弃手绘风格的地图,而改为尝试三转二渲染地图。

在经过一些「邪道」的技术尝试之后,做出了一个三转二渲染的地图效果,综合分析这个方式是比较容易实现且能够得到不差的视觉效果,于是决定就以这个方式制作游戏中的地图。

6572973025b6c916b4cd6e39eb6f7925.png
三转二地图测试效果

制作用的工具

在前面所明确的三转二的制作方式,涉及了不同工具与插件之间的配合使用。

首先需要借助Unity引擎的Gaia插件来实现。Gaia是Unity一款非常强大的Terrain地形制作插件,其中有一个Stamp功能,可以基于指定的高度图,将对应的地形以任意大小和角度「戳印」到地形上。这一步就利用的这个功能,在untiy中任意做出需要的地形。

4c240a5e4c694d29e189aa3a315d1790.png
Gaia插件效果

00e70ecd4fe228bf677de23e884b05ea.png
Gaia制作地图效果

接下来需要将做好的地形导出成模型以便可以渲染成图片。通过百度可以找到将Unity中的Terrain导出为FBX模型的插件,利用这个插件就可以实现这一步的目的了。

61a6cd3157c1d93b419e5d37ba9df48e.png
3DMAX中渲染地图

b4ab144c54be24fd6f7b74d37f4d8ad2.png
三转二地图素模

最后通过叠加纹理,在渲染出来的素模上增加地表纹理的变化,就能得到基本的地图效果了。

2ec5edd329acedc1f786b3995300968b.png
三转二地图测试效果

经过一小块地形的验证,这个做法理论上是可行的,因此可以正式确定所有地图的一套制作流程,以便更快的将剩下的地图全部制作出来

分析工作量

当前这个做法最麻烦的地方在于,为了还原黄土高原被黄河冲刷形成的侵蚀地形,需要手动一点点将这一片的地形刷出来,这个过程是非常缓慢的,黄土高原这一大片范围就需要大约两三周的时间才能完成。

如果所有地形都需要这样手动一点点做出来,效率低下的程度是无法接受的,所以需要有其他优化方式将制作效率大幅度提升。

最终的解决方案是,直接将整块地图的高度图在Photoshop中做出来,每一座山都用相同的基础高度图进行旋转拼接。因为使用Stamp逐个戳印也相当于将相同的高度图反复印在地形上,所以这个方法相当于利用Photoshop省略了Stamp逐个戳印的过程。最终只需要将整块地图的高度图作为一个整体,戳印一次即可完成。

157ae212e48ffed98ba70ad36e5492ad.png
局部地图块高度图

另一方面,因为模型渲染的精度较高,渲染过程非常慢。为了加快渲染过程,我直接租借了云渲染农场进行模型渲染,使渲染需要的时间降低到了最小。

完成地图

有了明确且高效的制作流程之后,需要使用的所有地图在较短时间内就得到了一个基本的效果,对于开发中的使用来说已经非常足够,而更多的细化工作可以在之后与开发并行进行。

在完成渲染之后,将得到的所有素模渲染图拼接在一起就能得到整个中国的渲染效果图了。

09fb4441ab095409b8ce5e1a7ac788ba.png
渲染效果图——局部

b081b616f051fe25470f89b76b934af5.png
渲染效果图——整体

基于上面得到的渲染图,在上面叠加不同的地表纹理,就能得到一张足够初步使用的地图了。

399dc6a0db8cf28b33dd2241de4259b2.png
三转二地图的基础效果

测试实际使用时的问题

在测试中发现,因为地图精度要求很高,图片的分辨率极大,完整的渲染图分辨率达到了「67250像素x44724像素」,而上面这个目前使用到的地图范围的分辨率也有「11520像素x17280像素」的大小,这导致内存消耗超过极限

同时因为希望地图更加自然变化更丰富,也不能采用相同元件重复使用的方式,同样为了更加自然而设定的「不规则格子」也使重复元件的使用变得不太可能。

最终经过讨论,决定尝试3D地图的做法,至少能够降低内存的负担,同时也可以验证3D地图的视觉效果。

这篇关于百度地图动态渲染windowinfo_【奇正游戏×史图馆】《兵法 战国篇》开发日志——地图制作(二)...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/375481

相关文章

Linux镜像文件制作方式

《Linux镜像文件制作方式》本文介绍了Linux镜像文件制作的过程,包括确定磁盘空间布局、制作空白镜像文件、分区与格式化、复制引导分区和其他分区... 目录1.确定磁盘空间布局2.制作空白镜像文件3.分区与格式化1) 分区2) 格式化4.复制引导分区5.复制其它分区1) 挂载2) 复制bootfs分区3)

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

Python中4大日志记录库比较的终极PK

《Python中4大日志记录库比较的终极PK》日志记录框架是一种工具,可帮助您标准化应用程序中的日志记录过程,:本文主要介绍Python中4大日志记录库比较的相关资料,文中通过代码介绍的非常详细,... 目录一、logging库1、优点2、缺点二、LogAid库三、Loguru库四、Structlogphp

MyBatis-Plus使用动态表名分表查询的实现

《MyBatis-Plus使用动态表名分表查询的实现》本文主要介绍了MyBatis-Plus使用动态表名分表查询,主要是动态修改表名的几种常见场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录1. 引入依赖2. myBATis-plus配置3. TenantContext 类:租户上下文

Python+wxPython开发一个文件属性比对工具

《Python+wxPython开发一个文件属性比对工具》在日常的文件管理工作中,我们经常会遇到同一个文件存在多个版本,或者需要验证备份文件与源文件是否一致,下面我们就来看看如何使用wxPython模... 目录引言项目背景与需求应用场景核心需求运行结果技术选型程序设计界面布局核心功能模块关键代码解析文件大

C++多线程开发环境配置方法

《C++多线程开发环境配置方法》文章详细介绍了如何在Windows上安装MinGW-w64和VSCode,并配置环境变量和编译任务,使用VSCode创建一个C++多线程测试项目,并通过配置tasks.... 目录下载安装 MinGW-w64下载安装VS code创建测试项目配置编译任务创建 tasks.js

Java中的随机数生成案例从范围字符串到动态区间应用

《Java中的随机数生成案例从范围字符串到动态区间应用》本文介绍了在Java中生成随机数的多种方法,并通过两个案例解析如何根据业务需求生成特定范围的随机数,本文通过两个实际案例详细介绍如何在java中... 目录Java中的随机数生成:从范围字符串到动态区间应用引言目录1. Java中的随机数生成基础基本随

JAVA Log 日志级别和使用配置示例

《JAVALog日志级别和使用配置示例》本文介绍了Java中主流的日志框架,包括Logback和Log4j2,并详细解释了日志级别及其使用场景,同时,还提供了配置示例和使用技巧,如正确的日志记录方... 目录一、主流日志框架1. Logback (推荐)2. Log4j23. SLF4J + Logback

C++简单日志系统实现代码示例

《C++简单日志系统实现代码示例》日志系统是成熟软件中的一个重要组成部分,其记录软件的使用和运行行为,方便事后进行故障分析、数据统计等,:本文主要介绍C++简单日志系统实现的相关资料,文中通过代码... 目录前言Util.hppLevel.hppLogMsg.hppFormat.hppSink.hppBuf

GO语言zap日志库理解和使用方法示例

《GO语言zap日志库理解和使用方法示例》Zap是一个高性能、结构化日志库,专为Go语言设计,它由Uber开源,并且在Go社区中非常受欢迎,:本文主要介绍GO语言zap日志库理解和使用方法的相关资... 目录1. zap日志库介绍2.安装zap库3.配置日志记录器3.1 Logger3.2 Sugared