问题标签 [terrain]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
terrain - 3d perlin 噪声函数如何用于生成地形?
我可以使用 2D Perlin 噪声函数来生成高度值,但我不明白为什么要使用 3D Perlin 噪声函数。在Notch 的博客中,他提到在 Minecraft 上使用 3D Perlin 噪声函数生成地形。有谁知道如何做到这一点以及为什么会有用?如果您正在传递x
,y
和z
values ,这是否意味着您已经拥有高度?
opengl - GLSL - 计算片段的法线
我正在尝试创建一个显示带有地形的地球仪的程序,并在 GPU 上执行所有纬度/经度/Alt 到 XYZ (ECEF)。
我已经编写了一个工作顶点着色器,它将表示经度、纬度和高度的 XYZ(分别)转换为正确的 XYZ(使用 ECEF)。
我做不到的是灯光。
只要没有地形数据,我就可以使用定向灯正确地照亮每个顶点。地形数据未正确点亮,我无法获得不同的坡度以获得正确的阴影。
这是我正在使用的顶点着色器:
为了绘制地球网格,需要执行以下操作:
谁能指导我如何正确遮蔽地形?
c# - 在 XNA / C# 中的地形上渲染多个纹理
我正在研究 XNA/C# 中的地形。我的目的是能够在整个地形的地面上渲染多个纹理。但是,像这样的所有教程都只能使用大约 3-4 个纹理。
我目前的想法是在 TGA 中创建一个具有不同颜色 (RGBA) 的纹理贴图,其中每种颜色代表一个特定的纹理。颜色中 Alpha 的数量描述了该位置上的顶点应该有多少 Alpha。并且会有一个基础纹理。
但是,我是这个领域的新手,所以我真的需要一些入门指南。到目前为止,我已经设法没有找到。尽管所有现代游戏都有很多纹理,但所有教程和资源在它们支持的纹理数量方面都是有限的。
rendering - 平滑块
所以我希望在这里获得一些一般信息,但我不确定从哪里开始。我正在考虑探索实时地形变形(我指的是硬核变形,例如挖洞、洞穴和隧道,而不仅仅是高度图),我的想法是制作一个 3D 点数组,表示可以是实心的或不实心的立方体,并且可以删除或添加。我不是在寻找完美的地形曲率或高精度变形。但我想编写引擎,使立方体(实际上只是点,不是实际的多边形)平滑成类似于网格的东西(不是高度详细的网格)。其目的是地形的有限变形性既可以简化必要的算法,又有望降低所需的处理器功率。
基本上,我想制作类似于 Minecraft 的东西,但有一种视觉错觉,即世界不是由立方体构成的,而是由网格构成的。我只是想看看它是否可以完成,并制作一个简单的演示。但我不知道从哪里开始,以及程序员中可变形地形的当前状态。我发现了一些关于体素和体积渲染之类的文章,但我更愿意听取现场程序员的一些意见。你怎么看?
opengl - 将顶点和索引缓冲区上传到 GPU
我正在创建一个地形引擎,目前我正在将整个地形 VB(顶点缓冲区)和 IB(索引缓冲区)一次上传到 GPU,因为地形并不大。目前是 256x256。
现在,假设我想创建一个程序地形,它使用 perlin 噪声来生成高度图。
当然,我可以生成“补丁”并将补丁的所有 VB 和 IB 一次上传到 GPU,但是当玩家移动很远并且必须生成新补丁时,我将不得不生成新补丁并上传将它们发送到 GPU。我心中的困惑或问题是:
将VB和IB上传到GPU很慢吗?当数据上传到 GPU 时,播放器会注意到闪烁吗?
如果我将补丁的VB和IB逐步上传到GPU而不是一次全部上传,性能会更好吗?基本上我在问VB和IB的大小是否很重要。
任何有关此概念的信息将不胜感激。
谢谢!
shader - 高对比度着色器
我在 NVidia 网站上发现了一个看起来不错的着色器,但没有提供我想要的东西。
这是一张图片:
问题是,这个小“凹凸”是由大量的三角形组成的,有没有免费的着色器可以在不同的三角形之间提供更多的对比度?
landscape - 基于现有地形的动态地形生成
这个问题与这里提出的问题非常相似。
我的问题是我有一张地图,如下所示:
这张地图是使用 2D Perlin 噪声制作的,然后运行创建的高度图,根据相应元素的高度或坡度为地形中的每个元素分配类型和颜色值,非常标准。地图数组是二维的,屏幕尺寸的精确尺寸(每像素像素),所以在 1200 x 800 生成时,在我的装备上大约需要 2 秒。
现在放大突出显示的矩形:
显然,随着尺寸的增加,细节会丢失。这就是问题所在。我想即时创建额外的细节,然后在玩家四处移动时将其写入磁盘(玩家只是一个限制沿网格移动的点)。我看到了两种方法,我很快就想到了第一种方法:
这是从旧地形的采样元素创建的新的有偏差的局部地形的放大视图,在上一张图像中由黄色网格空间(中心左侧)突出显示。然而,这个系统需要大量的修改,例如,如果你将一个单元从黄色网格空间的左上方移动到海滩瓷砖上,地形就会完全改变:
所以为了让它正常工作,你需要做大量的,我猜这个词应该是插值,以创建一个平滑的过渡,因为玩家在本地世界中移动了 40 个左右的网格空间,需要到达下一个世界在世界各地平铺。这看起来很复杂而且很不雅。
第二种方法是将原始地图的网格分解成更小的位,也许将每个正方形除以 4?我还没有实现这个,我不确定我会如何以一种实际增加细节的方式,但我认为这可能最终成为最好的解决方案。
关于我如何解决这个问题的任何想法?请记住,它必须是本地的和即时的。只是增加地图的分辨率是我想不惜一切代价避免的事情。
python - 创建海拔/高度场gdal numpy python
我想使用 python、gdal 和 numpy 创建一些高程/高度场栅格。我被困在 numpy 上(可能还有 python 和 gdal。)
在 numpy 中,我一直在尝试以下操作:
从 osgeo 导入 gdal 从 gdalconst 导入 *
我想我错过了一些简单的东西,期待你的建议。
谢谢,
克里斯
(稍后继续)
- terragendataset.cpp,v 1.2 *
- 项目:Terragen(tm) TER 驱动程序
- 目的:Terragen TER 文档的阅读器
- 作者:Ray Gardener,Daylon Graphics Ltd. *
- 该模块的部分来自 GDAL 驱动程序
- 弗兰克·沃默丹,见http://www.gdal.org
我提前向 Ray Gardener 和 Frank Warmerdam 道歉。
Terragen 格式说明:
对于写入:SCAL = gridpost 距离,以米为单位 hv_px = hv_m / SCAL span_px = span_m / SCAL offset = 参见 TerragenDataset::write_header() scale = see TerragenDataset::write_header() 物理 hv = (hv_px - offset) * 65536.0/scale
我们告诉来电者:
这告诉我,在上面的 WriteArray(somearray) 之前,我必须同时设置 GeoTransform 和 SetProjection 以及 SetUnitType 才能工作(可能)
来自 GDAL API 教程:Python import osr import numpy
我很抱歉创建了一个过长的帖子和一个忏悔。如果我做对了,将所有笔记放在一个地方(长篇文章)会很好。
忏悔录:
我之前拍摄了一张照片(jpeg),将其转换为 geotiff,并将其作为瓷砖导入 PostGIS 数据库。我现在正在尝试创建用于覆盖图片的高程栅格。这可能看起来很愚蠢,但我希望向一位艺术家致敬,同时又不冒犯那些辛勤工作以创造和改进这些伟大工具的人。
这位艺术家是比利时人,所以米是有序的。她在纽约曼哈顿下城工作,因此,UTM 18。现在一些合理的 SetGeoTransform。上面提到的图片是w=3649/h=2736,我得考虑一下。
另一个尝试:
显然越来越近,但不清楚 SetUTM(18,1) 是否被拾取。这是哈德逊河中的 4x4 还是 Local_CS(坐标系)?什么是无声的失败?
更多阅读
4x4 米是一个相当小的逻辑跨度。
所以,也许这是最好的。SetGeoTransform 得到正确的单位,设置比例,你就有了你的 Terragen 世界空间。
最后的想法:我不编程,但在某种程度上我可以跟随。也就是说,我首先想知道我的小 Terragen 世界空间中的数据是否以及是什么样的(以下感谢http://www.gis.usu.edu/~chrisg/python/2009/第 4 周):
所以这是令人欣慰的。我想上面使用的 numpy c 和这个结果之间的区别在于在这个非常小的逻辑跨度上应用 Float16 的操作。
然后到'hf2':
几乎完全令人满意,虽然看起来我在 La Concordia 秘鲁。所以我必须弄清楚如何说-like more north, like New York North。SetUTM 是否采用第三个元素来暗示北或南“多远”。似乎我昨天遇到了一个带有字母标签区域的 UTM 图表,比如赤道的 C 和纽约地区的 T 或 S。
我实际上认为 SetGeoTransform 本质上是建立左上角的北向和东向,这影响了 SetUTM 的“北/南多远”部分。转到 gdal-dev。
后来还是:
帕丁顿熊去秘鲁是因为他有一张票。我到那里是因为我说那是我想去的地方。Terragen 以它的方式工作,给了我我的像素空间。随后对 srs 的调用作用于 hf2 (SetUTM),但东移和北移是在 Terragen 下建立的,因此 UTM 18 已设置,但位于赤道的边界框内。够好了。
gdal_translate 带我去了纽约。我在windows中,所以是命令行。和结果;
所以,我们回到了纽约。可能有更好的方法来处理这一切。我必须有一个接受 Create 的目标,因为我也从 numpy 假设/即兴创作数据集。我需要查看其他允许创建的格式。GeoTiff 中的海拔是一种可能性(我认为。)
感谢所有评论、建议和对适当阅读的温和推动。用python制作地图很有趣!
克里斯
algorithm - 来自两个输入的伪随机数生成器
我需要一个伪随机数生成器,它从浮点类型的两个输入中为我提供范围 [-1, 1](范围是可选的)中的数字。
我还将尝试解释为什么我需要它:
我正在使用Diamond-Square 算法为我的地形引擎创建高度图。地形被分割成块(Chunked LOD)。
Diamond-Square 的问题在于它使用随机函数,所以假设两个相邻块共享相同的点 (x, z),那么我希望它们的高度相同,这样我就不会出现裂缝影响。
有人可能会说我可以从邻居补丁中获取高度信息,但是在首先创建补丁之后结果可能会有所不同。
所以这就是为什么我需要一个伪数生成器,它在给定两个输入(x,z)的情况下返回一个唯一的数字。
(我不是要求某人编写这样的函数,我只需要一般反馈和/或执行类似操作的已知算法)。
java - 中点置换地形伪影
我正在尝试在 Java中实现中点位移算法。它也被称为菱形平方算法。我的参考是http://www.lighthouse3d.com/opengl/terrain/index.php3?mpd。除了右侧和底部边缘外,它似乎工作正常。
仔细检查后,可以看到“粗糙”的边缘。谁能指出什么是错的?在该算法的其他在线实现中没有观察到这种效果。
代码
注释
这部分定义了一个变量displacementBound,一个初始化为默认值的二维双精度数组,以及另一个称为迭代的变量。
这部分是声明循环的地方。它将运行mPDIterations循环。创建一个临时数组B以保存A的更新版本,使B大于A以保存新数据点。之后有两个 for 循环,一个嵌套在另一个循环中,它将A的当前值放入临时B中,注意每隔一行和每隔一列留空。看看这个例子:
现在来看下一段代码:
在本节中,中心的每个点,指在北、南、东、西的每个基本方向上都有一个空的相邻单元格的单元格,给定四个相邻角点的平均值,并且随机位移值添加到它。这称为钻石步骤。澄清什么是“中心”:
下一个代码部分:
这部分的作用类似于上一段代码。它为每个非中心和空点分配一个新值;该值是北、南、东、西基本方向上相邻元素的平均值,并添加了另一个随机位移值。这称为方步。上面的代码确保只有非中心点和空点被赋予新值;这些点等同于侧点,如下所述:
下面给出了结束while循环的部分:
根据上述文章中给出的信息,变量displacementBound在上面的部分中被减少,其中包括while 循环的结束。在开始循环的另一次迭代或终止循环之前,通过将B的更新内容分配给 A 来更新A的内容。
最后,还包括了辅助方法averageFromCornersAndDisplace()、averageFromSidesAndDisplace()和wrap() ,但不需要对它们进行额外的解释。根本没有包含方法randomDisplacement() 。供您参考,它返回一个以给定数字b为界的随机浮点数x: