问题标签 [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.

0 投票
3 回答
13720 浏览

terrain - 3d perlin 噪声函数如何用于生成地形?

我可以使用 2D Perlin 噪声函数来生成高度值,但我不明白为什么要使用 3D Perlin 噪声函数。在Notch 的博客中,他提到在 Minecraft 上使用 3D Perlin 噪声函数生成地形。有谁知道如何做到这一点以及为什么会有用?如果您正在传递x,yzvalues ,这是否意味着您已经拥有高度?

0 投票
2 回答
3982 浏览

opengl - GLSL - 计算片段的法线

我正在尝试创建一个显示带有地形的地球仪的程序,并在 GPU 上执行所有纬度/经度/Alt 到 XYZ (ECEF)。

我已经编写了一个工作顶点着色器,它将表示经度、纬度和高度的 XYZ(分别)转换为正确的 XYZ(使用 ECEF)。

我做不到的是灯光。

只要没有地形数据,我就可以使用定向灯正确地照亮每个顶点。地形数据未正确点亮,我无法获得不同的坡度以获得正确的阴影。

这是我正在使用的顶点着色器:

为了绘制地球网格,需要执行以下操作:

谁能指导我如何正确遮蔽地形?

0 投票
1 回答
1232 浏览

c# - 在 XNA / C# 中的地形上渲染多个纹理

我正在研究 XNA/C# 中的地形。我的目的是能够在整个地形的地面上渲染多个纹理。但是,像这样的所有教程都只能使用大约 3-4 个纹理。

我目前的想法是在 TGA 中创建一个具有不同颜色 (RGBA) 的纹理贴图,其中每种颜色代表一个特定的纹理。颜色中 Alpha 的数量描述了该位置上的顶点应该有多少 Alpha。并且会有一个基础纹理。

但是,我是这个领域的新手,所以我真的需要一些入门指南。到目前为止,我已经设法没有找到。尽管所有现代游戏都有很多纹理,但所有教程和资源在它们支持的纹理数量方面都是有限的。

0 投票
1 回答
179 浏览

rendering - 平滑块

所以我希望在这里获得一些一般信息,但我不确定从哪里开始。我正在考虑探索实时地形变形(我指的是硬核变形,例如挖洞、洞穴和隧道,而不仅仅是高度图),我的想法是制作一个 3D 点数组,表示可以是实心的或不实心的立方体,并且可以删除或添加。我不是在寻找完美的地形曲率或高精度变形。但我想编写引擎,使立方体(实际上只是点,不是实际的多边形)平滑成类似于网格的东西(不是高度详细的网格)。其目的是地形的有限变形性既可以简化必要的算法,又有望降低所需的处理器功率。

基本上,我想制作类似于 Minecraft 的东西,但有一种视觉错觉,即世界不是由立方体构成的,而是由网格构成的。我只是想看看它是否可以完成,并制作一个简单的演示。但我不知道从哪里开始,以及程序员中可变形地形的当前状态。我发现了一些关于体素和体积渲染之类的文章,但我更愿意听取现场程序员的一些意见。你怎么看?

0 投票
1 回答
866 浏览

opengl - 将顶点和索引缓冲区上传到 GPU

我正在创建一个地形引擎,目前我正在将整个地形 VB(顶点缓冲区)和 IB(索引缓冲区)一次上传到 GPU,因为地形并不大。目前是 256x256。

现在,假设我想创建一个程序地形,它使用 perlin 噪声来生成高度图。

当然,我可以生成“补丁”并将补丁的所有 VB 和 IB 一次上传到 GPU,但是当玩家移动很远并且必须生成新补丁时,我将不得不生成新补丁并上传将它们发送到 GPU。我心中的困惑或问题是:

  1. 将VB和IB上传到GPU很慢吗?当数据上传到 GPU 时,播放器会注意到闪烁吗?

  2. 如果我将补丁的VB和IB逐步上传到GPU而不是一次全部上传,性能会更好吗?基本上我在问VB和IB的大小是否很重要。

任何有关此概念的信息将不胜感激。

谢谢!

0 投票
0 回答
220 浏览

shader - 高对比度着色器

我在 NVidia 网站上发现了一个看起来不错的着色器,但没有提供我想要的东西。

这是一张图片: 在此处输入图像描述

问题是,这个小“凹凸”是由大量的三角形组成的,有没有免费的着色器可以在不同的三角形之间提供更多的对比度? 在此处输入图像描述

0 投票
1 回答
7303 浏览

landscape - 基于现有地形的动态地形生成

这个问题与这里提出的问题非常相似。

我的问题是我有一张地图,如下所示:

主地图

这张地图是使用 2D Perlin 噪声制作的,然后运行创建的高度图,根据相应元素的高度或坡度为地形中的每个元素分配类型和颜色值,非常标准。地图数组是二维的,屏幕尺寸的精确尺寸(每像素像素),所以在 1200 x 800 生成时,在我的装备上大约需要 2 秒。

现在放大突出显示的矩形:

http://i.stack.imgur.com/hrZnM.png

显然,随着尺寸的增加,细节会丢失。这就是问题所在。我想即时创建额外的细节,然后在玩家四处移动时将其写入磁盘(玩家只是一个限制沿网格移动的点)。我看到了两种方法,我很快就想到了第一种方法:

http://i.stack.imgur.com/bbLia.png

这是从旧地形的采样元素创建的新的有偏差的局部地形的放大视图,在上一张图像中由黄色网格空间(中心左侧)突出显示。然而,这个系统需要大量的修改,例如,如果你将一个单元从黄色网格空间的左上方移动到海滩瓷砖上,地形就会完全改变:

http://i.stack.imgur.com/6shKz.png

所以为了让它正常工作,你需要做大量的,我猜这个词应该是插值,以创建一个平滑的过渡,因为玩家在本地世界中移动了 40 个左右的网格空间,需要到达下一个世界在世界各地平铺。这看起来很复杂而且很不雅。

第二种方法是将原始地图的网格分解成更小的位,也许将每个正方形除以 4?我还没有实现这个,我不确定我会如何以一种实际增加细节的方式,但我认为这可能最终成为最好的解决方案。

关于我如何解决这个问题的任何想法?请记住,它必须是本地的和即时的。只是增加地图的分辨率是我想不惜一切代价避免的事情。

0 投票
1 回答
4406 浏览

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制作地图很有趣!

克里斯

0 投票
3 回答
2857 浏览

algorithm - 来自两个输入的伪随机数生成器

我需要一个伪随机数生成器,它从浮点类型的两个输入中为我提供范围 [-1, 1](范围是可选的)中的数字。

我还将尝试解释为什么我需要它:

我正在使用Diamond-Square 算法为我的地形引擎创建高度图。地形被分割成块(Chunked LOD)。

Diamond-Square 的问题在于它使用随机函数,所以假设两个相邻块共享相同的点 (x, z),那么我希望它们的高度相同,这样我就不会出现裂缝影响。

有人可能会说我可以从邻居补丁中获取高度信息,但是在首先创建补丁之后结果可能会有所不同。

所以这就是为什么我需要一个伪数生成器,它在给定两个输入(x,z)的情况下返回一个唯一的数字。

(我不是要求某人编写这样的函数,我只需要一般反馈和/或执行类似操作的已知算法)。

0 投票
2 回答
1464 浏览

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