我正在研究类似文明的游戏,我正在寻找一种用于生成类似地球的世界地图的好算法.我已经尝试了一些替代方案,但尚未找到真正的赢家.
一种选择是使用Perlin噪声生成高度图,并在一定水平上添加水,以便世界上大约30%的土地是土地.虽然Perlin噪声(或类似的基于分形的技术)经常用于地形并且相当逼真,但它并没有提供太多控制结果的数量,大小和位置,我想从游戏角度来看.
第二种选择是从随机定位的单瓦种子开始(我正在处理瓷砖网格),确定大陆的所需大小,每个回合添加一个水平或垂直邻近现有大陆的图块,直到你达到了所需的大小.重复其他大陆.这种技术是文明4中使用的算法的一部分.问题在于,在放置前几个大陆之后,可以选择被其他大陆包围的起始位置,因此不适合新的大陆.此外,它有一种太靠近的地方产生大陆的趋势,导致看起来更像河流而不是大陆.
有没有人碰巧知道一个好的算法,用于在基于网格的地图上生成逼真的大陆,同时保持对其数量和相对大小的控制?
我正在尝试实现我在网上找到的一些源代码,使用Perlin Noise生成高度图.我已成功设法使用noise3函数获取高度图,第三个坐标是随机"种子",以允许随机高度贴图.
我的问题是产生的地形相当沉闷 - 我想要山脉,我正在滚动草原.我已经完成了对Perlin Noise的阅读(主要是在这里).由于源代码我发现显然没有考虑到可读性和我对Perlin Noise概念的一般掌握,我无法弄清楚我需要在代码中调整什么(幅度和频率?)到创造更加激烈的地形.
有关使用Perlin Noise,Perlin Noise,甚至更多可解码代码生成高度贴图的更多信息也将受到欢迎.
编辑:我理解(有点)Perlin Noise的工作原理,例如关于振幅和频率,我只是想知道在上面链接的代码中要改变哪些变量,这些变量用于这两个方面.
任何人都可以告诉我一种方法来生成像我的世界中的岛屿结构或山丘结构?
我只是为随机形状生成寻找合适的理论,但它应该保持一个定义的基本模式..
喜欢:岛屿应该是圆形的,但形状和规模各不相同(最小/最大宽度和高度).
或:河流不应该是直线,它们应该有曲线和随机宽度.
甚至:生成某种森林,其中树木以一种用户仍然可以穿过森林的方式放置(我认为这是一个简单的森林,只是说树周围的一些块应该保持空白,如果代码试图放入最后一个周围的树木更多)
我可以用什么样的数学来做这些事情?
我会很高兴有一些教程或参考的链接.我在网上搜索了几个小时,但我能找到的只是一些书籍,比如"游戏数学"或其他东西,但我的预算设定为零.
编辑:
首先,我很抱歉我的不好意思.
中学我想感谢你们所有人的答案.这些都是很好的参考,我会花很多时间深入研究.
我正在开发一个iOS应用程序.我在哪里显示某个区域的高程和地形图.我已经设法从这里下载应用程序内的.hgt文件.
到目前为止,我能够从hgt文件中提取Elevation.现在我还要显示该区域的地形图.我一直在搜索它,我想我不能直接用iOS应用程序中的hgt文件创建地形图.我必须使用GRASS GIS,SRTM2OSM或TileMill来创建地形图,然后在应用程序中使用它.
可以请任何人指导我在这里可以做什么以及如何继续.
我已经要求不要使用任何类型的地图.所以基本上我必须使用核心绘图来创建地图,我不知道它.
像这样没有文字的东西:
我的方法是分别计算平行于轴X和Y的两个切向量.然后计算叉积以找到法向量.
切线向量由两条最近段上的中点交叉的线给出,如下图所示.
我想知道是否有更直接的计算,或者在CPU周期方面更便宜.
我想为我的游戏制作一个想法的原型.这个游戏的想法是玩家将挖掘地面,创建隧道和寻找宝藏.
我正在寻找创建"蠕虫风格"的地形,通过碰撞检测让玩家在隧道中游荡和跳跃.在这些图片中可以看到这种类型的动态地形的例子.
示例1 http://img301.imageshack.us/img301/1675/30184730wd6.png
我的问题是如何实现这种类型的可破坏地形的最佳方法?我正在使用XNA游戏工作室.
我有一个宠物项目来创建地图图像,在那里我绘制道路和其他东西在地形高程的等高线图上.它旨在计划山地自行车路线(过去我手工制作了一些矢量图,它们非常适合可视化).
目前,我从GeoTIFF下载数字高程模型:http: //www.ecologia.ufrgs.br/labgeo/arquivos/downloads/dados/SRTM/geotiff/rs.rar
然后使用GDAL和Matplotlib contourf
函数创建绘图:
from osgeo import gdal
import matplotlib
import matplotlib.pyplot as plt
from pylab import cm
import numpy
f = 'rs.tif'
elev = gdal.Open(f)
a = elev.GetRasterBand(1).ReadAsArray()
w = elev.RasterXSize
h = elev.RasterYSize
print w, h
altura = (0.35, 0.42)
largura = (0.70, 0.82)
a = a[int(h*altura[0]):int(h*altura[1]),
int(w*largura[0]):int(w*largura[1])]
cont = plt.contourf(a, origin='upper', cmap=cm.gist_earth, levels=numpy.arange(0,1000,20))
plt.title('Altitudes - max: %d m; min: %d m' % (numpy.amax(a), numpy.amin(a)))
plt.show()
Run Code Online (Sandbox Code Playgroud)
这使:
问题是轮廓线是"白色的",并产生一些视觉污染,这是不希望的,因为我想稍后绘制道路和河流.
因此,我试图contourf
通过参数设置或通过hack(更改源代码)来修改创建这些较轻线的方式,类似于此处提出的方法:
此外,如果有人知道如何以更优雅的方式生成这样的地图,使用其他库,我会非常感谢这个提示!
谢谢阅读.
我有以下格式的2D高度图
06 36 39 42 43 55 ...
37 40 43 43 45 46 ...
40 43 44 45 46 48 ...
44 44 46 47 48 50 ...
41 44 45 47 48 48 ...
...
Run Code Online (Sandbox Code Playgroud)
我需要将其重新映射为基于grin的轮廓格式(因此它可以进一步映射到精灵)
. . . . | . .
. . . . \ . .
. . . / / . .
. . . | . . .
. . . | . . .
. / - / . . . …
Run Code Online (Sandbox Code Playgroud) 我一直在搜索谷歌,但找不到任何基本的东西.在它最基本的形式中,如何实现双重轮廓(对于体素地形)?我知道它做了什么,为什么,但无法理解如何做到这一点.JS或C#(最好)是好的.有没有人之前使用过双轮廓线并可以简单解释一下?
我最近创建了一些风景代码并为场景添加了一些漫反射光照,然而,令我失望的是,没有阴影.我在网上浏览了几个小时寻找在OpenGL中获得阴影的方法,但是它们看起来都非常复杂; 并且他们自己的演示程序非常独特.
有没有简单的方法来制作阴影?