- 好友
- 21
- 在线时间
- 3375 小时
- 最后登录
- 2024-1-16
波耶[MOD制作小组]
殿堂筑师
- UID
- 324735
- 第纳尔
- 3976
- 精华
- 1
- 互助
- 47
- 荣誉
- 25
- 贡献
- 0
- 魅力
- 70
- 注册时间
- 2010-10-15
鲜花( 172) 鸡蛋( 67)
|
本帖最后由 Borr 于 2017-7-9 01:03 编辑
(2011/08/28更新)
(2011/02/20 更新, 见更新内容以及回复部分)
(2011/01/02 更新, 见更新内容部分)
姊妹贴,大地图合集:
http://bbs.mountblade.com.cn/vie ... 7069&extra=page%3D8
===============================
给大家的节日礼物~ 制作这个自动生成大地图的程序原因是我觉得Thorgrim的地图编辑器制作复杂地图时不够灵活方便,而且对真实地图上色要用画图软件仔细地处理象素,实在是太累人。Thorgrim的地图编辑器导入导出时用的是方格子,并且数据按网格密度挤压过,而我希望可以直接对每个面进行批量处理。此外鄙人悲剧地对3D绘图软件一窍不通,于是便有了利用无所不能的Mathematica来代替我做苦力活的念头。
一句话简介[02/20/2011]: 导入海拔地图(2D灰度地图),生成3D网格和法向图,自动判别地形并上色,最后导出为map.txt。(自从02/20/2011版本后直接生成map.txt,跳过ObjToMap工具。程序里ToMapObj函数仍然保留但不一定具备所有功能。)
本贴分以下几个部分:
1 详细介绍
2 更新内容
3 源程序,地形数据下载(web地址)
4 地图制作图文实例(全流程)
=========== 功能介绍 ===============
* 使用这个程序需要Mathematica。我用的版本是6.0,现在更新的版本应该可以通用。
* 可导入绝大多数常用的图形格式的2D地形图(bmp, jpg 等) 默认为灰度图,图片大小分辨率不限。
* 可随意调整大地图的尺寸以及网格密度
* 使用真实地理数据,按照经纬度判定地表类别,如草原,荒漠,海洋等等
* 可调整的真实地形类别和M&B地形之间对应表。
* 可添加更复杂的地表判别条件,更灵活,更真实。
* (Mathematica自带功能)可将没有上色过的网格导出为任意兼容格式, 3ds, obj, maya, ply ...
* 按法向图计算坡度,将陡坡设定为不可进入的山地。自定义参考坡度。
* 添加雪线,将高海拔地区设定为雪地,自定义雪线高度。
* 可调节树林密度,去除低海拔雪地,去处水面地形等功能(详见更新) (2011/01/02)
* 将着色过的3D地图导出为文本的obj格式
* 将着色过的3D地图导出为文本的map.txt [02/20/2011]
* 强化海岸线 [02/20/2011]
* 自动细分网格 [02/20/2011]
** 注: 可随意编辑源代码,但请保留程序开头原作者的信息。
==================================
============ (2011/08/28 更新) ====================
修正bug:地型编号错误.
============ (2011/02/20 更新) ====================
这次更新主要是自动网格细分,自动海岸线,陆地高度调节等功能。详见15楼回复。
[2011/02/20]版本后直接生成map.txt
============ (2011/01/02 更新) ====================
** 修正了ToMesh[]函数的坐标范围和y轴倒置的错误
* 添加了以下绘图参数
gridzmax(必要参数): 这个是map.txt里边的地形最大高度,如果想避免山峰过高可降低这个数值。
NoSnowBelowSnowLine(非必要参数): 将雪线以下的所有雪地换成平地。
LessForest(非必要参数): 按照自定义的比例减少树木的数量。
DryLand(非必要参数): 将所有河流地形替换为平地
做了一张220*180的东亚大地图。为了降低山地锯齿海拔图已经羽化过。下载map.obj, map.txt和海拔图:
http://www.rayfile.com/zh-cn/files/f9cafe5c-16d8-11e0-8605-0015c55db73d/
(map_work.nb里的参数就是做这张图的参数)
大地图效果:
青藏高原竟是如此的挺拔~
边缘锯齿是受网格所限。河流的宽度在这个比例尺上根本看不见,需要另外添加。比例尺很大导致有些山坡非常陡峭。可以考虑降低gridzmax至10以下。不过这么来平原上的山就被抹煞了。另外台湾的山的高度...真是不能小瞧的。
================== 资源下载 (图片超大,仅给连接地址) ==========
(最新)地图生成程序[08/28/2011]
如果rayfile抽风,见附件下载
map_work_vAug28.zip
(19.66 KB, 下载次数: 1186)
http://www.rayfile.com/en/files/43be7314-d1ae-11e0-887b-0015c55db73d/
旧程序[02/20/2011]:http://www.rayfile.com/en/files/6661c5f5-3d2f-11e0-a2e2-0015c55db73d/
旧程序[01/02/2011]: map_work.nb http://www.rayfile.com/zh-cn/files/9e9118b5-16d8-11e0-a503-0015c55db73d/。
5965*3307象素的世界植被地图: http://www.theresilientearth.com/files/images/globcover_poster_V2-esa.jpg
若原链接失效,可用百度云下载: http://pan.baidu.com/s/1eScPNXK
(这个图是必需的,程序默认用这张图)
世界降雨量图: http://www.jisao.washington.edu/data/gpcp/precipgpcpcticormjjaso.global.big.gif
世界气温图: http://earthobservatory.nasa.gov/images/imagerecords/3000/3505/temperature_airs_200304_lrg.jpg
===================================
========地图制作演示适用[02/20/2010以前版本]=========
作为例子这里做一张中皇山的地图。
1. 准备工作。 中皇山在东经113度37分北纬36度38分。前去SRTM的网站 srtm.csi.cgiar.org 找来90m的卫星地图,把目标附近的海拔图存为灰度图
然后下载资源里的那张植被图,找来官网里的ObjToMap和MapEditor, 打开map_work.nb.
2. map_work.nb第一段不用管他,第二段是做地图必须要填的一些参数:
obj2mapdir ObjToMap工具的地址 程序会直接把map.obj文件写到这里,请备份原map.obj.
ElevationFile 海拔地图的路径+文件名
RefColorFile 这个是默认的那张大植被图的路径+文件名
hmax 真实地图的最大海拔高度(单位:米)
hmin 真实地图的最低海拔高度(单位:米),如果有海一般填0
bmax 真实地图的最大纬度(单位:度)
bmin 真实地图的最小纬度(单位:度),如果是南纬就填负数
lmax 真实地图的最大经度(单位:度)
lmin 真实地图的最小经度(单位:度),如果是西经就填负数
slmin 判为陡坡的最小坡度(单位:米/千米)
MapSizex 游戏中的大地图长度
MapSizey 游戏中的大地图宽度
gridx 3D网格水平横向格数
gridy 3D网格水平纵向格数
还有些辅助的参数:
SnowLine 雪线高度(单位:米)
NoMountain 不判定山地(全陆地可进入)
MaxPixelSample 每一个面的判定地形时的采样数
MaxRecur 没有任何作用 不用管他
ColorReload 重复读入植被图,这个主要是用来节约内存。
把参数都填上。中皇山地图里最高点是1140米,最低520米,我把雪线定到900米。参考坡度定为每公里上升100米。地图的经纬度边缘分别为(36.6833N,36.5333N, 113.75E, 113.567E)。这里把地图的游戏尺寸设为220*220,横向80格,纵向70格。 然后可以继续。
3. 运行打头一串红字“Definitions and preparations. Just run through till next red notice”的第三段程序,这里是程序读入你给他的海拔图和植被地图。如果一切正常会现以下字样:
elevation file loaded
terrain file loaded
如果刷红字警告,你可能把文件名或路径搞错了啦。如果读了老半天+硬盘狂转,则是内存不够。说实话那张植被图够大的,到这一步我的本子会几乎用掉1G的内存。
4. 接下来直接运行下一段看起来很长的程序。这里是定义一些要用到的函数,不用做任何修改。如果报错你可能是前边哪一步漏了。这一段执行完毕会刷一张图标列表(如下图),其中是植被图与M&B地形的映射关系。
这里再废话几句,默认的地形判定是计算一个区域可能是MB某一地形的概率,然后按照概率随机决定。比如一个地区有50%平地50%草地,在游戏地图里就是plain steppe二选一,概率55开。具体设置可参考以下几个量的定义:ltab, TerrainNames, TerrainSet,程序中在相关位置有具体说明。
5. 好了,最后是激动人心的一步:画地图
这里也不用输入什么,直接运行。先是会把你的海拔图文件名字打出来,接着是3D模型(mesh)
http://img208.poco.cn/mypoco/myphoto/20101225/11/562000022010122511285706_640.jpg
接着会刷地形判定,上色等等的进度,如下
Height conversion prepared
Vertices done.
Working on terrain types. This may take a while depending on mesh size ...
IdentifyTerrain: Progress ii= 1000 / 10902
IdentifyTerrain: Progress ii= 2000 / 10902
IdentifyTerrain: Progress ii= 3000 / 10902
IdentifyTerrain: Progress ii= 4000 / 10902
IdentifyTerrain: Progress ii= 5000 / 10902
IdentifyTerrain: Progress ii= 6000 / 10902
IdentifyTerrain: Progress ii= 7000 / 10902
IdentifyTerrain: Progress ii= 8000 / 10902
IdentifyTerrain: Progress ii= 9000 / 10902
IdentifyTerrain: Progress ii= 10000 / 10902
Terrain types done.
Normals calculated
Mountains added.
Finished.
如果看到Finished字样说明一切正常,map.obj已经输出到ObjToMap目录下。
这个程序到这就收工了。用ObjToMap把地图加工一下,打开来瞧瞧:
中皇晴雪图
注: obj文件格式用Mathematica自带的输出是不行的,必须要用程序里的ToWingsObj函数。否则只有网格没有添图而且不保证绘图软件能打开。为了写这个劳什子Obj输出我还专门学了一把obj格式。如果一定要把无涂色的网格输出为标准的3DS文件,可用Export["filename.3ds",plot,"3DS"]命令。
希望这个工具对做大地图的汽油们有所帮助。 |
评分
-
查看全部评分
|