问题标签 [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 投票
1 回答
1205 浏览

c# - 地形编辑器的 XNA VertexBuffer

我正在从事一个个人项目,与许多 XNA 项目一样,该项目从地形置换贴图开始,该贴图用于生成在Device.DrawIndexedPrimitives()调用中呈现的顶点集合。

我已更新为 custom VertexDeclaration,但我现在无法访问该代码,因此我将发布稍旧但在范式上相同 (?) 的代码。

我将 a 定义VertexBuffer为:

其中“顶点”定义为:

VertexPositionNormalTexture[] vertices

我还有两个在每次 Update() 迭代时交换的索引缓冲区。在Draw()通话中,我设置了GraphicsDevice缓冲区:

忽略我希望不相关的代码行,我有一个方法可以检查边界形状以确定顶点是否在鼠标光标的某个半径内,并根据按下的键升高或降低这些顶点位置。我的问题是VertexBuffer.SetData()在容器类的初始化时只调用一次。

修改VertexPositionNormalTexture[]数组的顶点位置不会反映到屏幕上,尽管顶点位置的值已更改。我相信这与VertexBuffer.SetData()调用有关,但是您不能SetData()在修改顶点数组后简单地调用它。

SetData()在重新检查了 IndexBuffer 的处理方式(2 个缓冲区,有时交换并传入Update())之后,我认为这应该是处理VertexBuffer操作的方式,但这行得通吗?有没有更合适的方法?我在这里看到了对类似问题的另一个参考,但源链接在 MegaUpload 上,所以......

我会尝试我的VertexBuffer.Swap()想法,但我也看到了参考DynamicVertexBuffer并想知道有什么收获?性能据说会受到影响,但是对于地形编辑器,如果我可以动态地操作顶点数据,我认为这不是太大的权衡。

我可以发布更多代码,但我认为这可能是对设备缓冲区的设置方式或数据流式传输方式缺乏了解。

编辑:下面提出的解决方案是正确的。我会尽快发布我的代码。

0 投票
1 回答
2031 浏览

terrain - 基于体素的地形的适当密度函数?

我已经设法在 C# 中实现了 Marching Cubes 算法。到目前为止,我已经尝试过渲染球体的算法。这很容易,因为密度函数的编码不是很复杂。

但现在我想让算法更进一步,为游戏渲染一些有趣的地形。所以我需要适当的密度函数来完成这项任务。我首先想到的是体积 Perlin 噪声。没关系,但我正在寻找一个没有凸形的地形,我的意思是,目前没有洞穴和类似的几何形状。

好的,我知道一个简单的高度图可以完成这项工作,但我想要一个体素生成的地形。我需要什么类型的密度函数或伪代码来实现它们?

0 投票
3 回答
2489 浏览

python - 什么是可以从 Python 访问的简单、快速的 3D 引擎?

我正在尝试分形地形生成器(我正在考虑做一些相当深入的东西,比如树木等),我想要一个快速的 3D 引擎。唯一需要它的是能够绘制线条、曲面、移动相机和简单性。

0 投票
1 回答
1334 浏览

2d - 将高度图映射到基于网格的等高线格式

我有以下格式的二维高度图

而且我需要将其重新映射为基于 grin 的轮廓格式(因此它可以进一步映射到精灵中)

这里.的意思是平坦的区域,|笔直-的悬崖/\悬崖角落(每个代表两种不同的可能性)。

我尝试了标准的行进广场方法,但​​发现仅对 3 个邻居进行抽样会导致很多问题,因为相邻案例超载。(注意下面额外的不合适的直悬崖)

我想要的是对有助于处理这类事情的算法/方法的一些参考。我知道带有某种深度优先搜索的轮廓行走是一种选择,但尚未尝试过,并且宁愿将其作为最后的手段。还有一些特征的表示问题,例如是否包括 1 个元素厚的悬崖脊或忽略它们。另一种选择是通过生成的轮廓并更改它们,以便它们平滑地组合在一起,但这看起来真的很hacky......

0 投票
2 回答
2704 浏览

java - 用于 2D 地形生成的 Java Perlin Noise

更新:正式的问题清单:

  1. 2D 噪声实现的浮点值(输入参数和输出)代表什么?- 部分回答,输入是坐标。输出怎么样?另外,我可以使用我的整数作为坐标的浮点数吗?1.0、122.0 等?
  2. 在 2D 噪声发生器中实现种子的好方法是什么?我是否应该使用第三个参数作为种子使其成为 3D 噪声发生器?这是否意味着每个种子都可以产生独特的 2D 噪声?
  3. 与 2d 地图一起,生成位图似乎是沿着相同的路线。如何从输出中生成位图?估计是飘了。

我的问题是剪切和粘贴柏林噪声 2D 实现的浮点值(输入参数和输出)代表什么?我如何从它们生成位图?如果我可以获得某种数据类型的二维数组,我相信我可以弄清楚如何使用它来模拟我的地形。

而且,如果我能确保我可以为它们播种值,我会使用剪切和粘贴实现。这是问题的另一部分,这是我在这里找到的一个未回答的问题。- 在噪声发生器中实现种子的好方法是什么?

好的,我知道这个问题已经被问过很多次了,所以让我解释一下我的研究和发现。

首先,我在这里找到了这个网站,它似乎是向我解释它的赢家。但是,然后我想出了另一个问题,我发现这个问题在这里没有完全回答。

然后我试着弄脏自己的手,用 Java 编写一些代码,这是我选择的语言。我发现了这个,它让我尝试将作为答案给出的哈希函数作为我的噪声函数,因为我可以在那里使用种子。然后我遇到了一个问题,它没有返回一个浮点数来遵循教程中的其余过程。回到绘图板。在此过程中,我发现了更多有关柏林噪声问题的网站。

我在这里发现了一个我什至没有想到的未回答的问题,因为我还没有让我的实现工作。我再也找不到链接了,但它说了一些类似的话,即使你有一个复制和粘贴的实现,你放入函数的浮点输入是什么?有人告诉我我需要在地图上传递我的 x 和 y 整数。我也从剪切和粘贴实现中获得浮点输出。那些是什么意思?那些2D怎么样?如果我可以将事物保留为整数,那在我的大脑中会很有意义,但在某种程度上,我发现将它们保留为整数对于插值和平滑连续曲线的值是不合理的。

0 投票
3 回答
4714 浏览

directx - 在 Minecraft 风格的地形中处理块 (d3d/c++)

在由数千个立方体(即 Minecraft)组成的 3d 地形中,在位置和渲染方面处理每个块的方法是什么?更具体地说,我知道在 DirectX 9 中绘制一个立方体的基元并对其进行世界变换可能是一种荒谬的方式来实现这一点,因为存在很多性能问题,所以我想知道更合理的方法是什么。

每个立方体应该是一个多次复制的网格,还是它们是一种从顶点缓冲区中的数据创建适当网格的方法?

我发现这篇文章介绍了实现我想要实现的东西背后的一些理论,但我以前从未使用过八叉树,所以我无法从源代码中获取太多内容。如果八叉树确实是要走的路,那么学习它们的好起点在哪里?我的大部分谷歌搜索只找到了关于理论的博客文章,很少或没有实现示例。

似乎使用体素在这样做时会很有用,但就像使用八叉树一样,我在这里没有经验,所以我真的不知道首先要学习什么。

无论如何,感谢您提供的任何建议\资源\书名。我确信这很明显,但我对 3d 编程还是很陌生,所以我很感谢你的帮助。

0 投票
1 回答
591 浏览

python - 从由一串点定义的横截面在固定网格上创建 3D 高程

我正在尝试在间距为 1m 或 0.5m 的固定网格上创建 3D 表面,其中表面是由多个点的横截面定义的通道。理想情况下,它应该是任意数量的点。例如横截面,例如:

PTS = [[0.0,10.0],[3.0,9.0],[30.0,8.5],[33.0,8.0],[35.0,7.8],[37.0,8.0],[40.0,8.5],[67.0,9.0] ,[70.0,10.0]] 这里的河道宽 70 m,截面为双梯形。

我已经尝试过对此进行编码,但未能成功:

我想读取这些点,然后根据间距进行插值以提供计算出的高程(Z 值)。这应该填充 X 和 Y 的域,从而提供 3D 地形的 XYZ 值

这个例子应该创建一个 70 m 宽的 1500 m 长的通道

代码:


设置计算域

当代码遍历 X 时,基本 Z 提供了一个倾斜的床,然后定义的横截面在 Y 的范围内创建了 Z

理想情况下,这也可以沿多段线应用,而不是仅在 x 方向上应用。这样,通道可以沿曲线或 S 形弯曲产生

我希望有人对如何解决这个问题有一些聪明的想法......谢谢

有人提到 scipy 可能会在这里提供帮助....我将尝试理解这一点,以创建一个在点之间进行插值的函数:

从 scipy.interpolate 导入 interp1d

x = np.linspace(0, 10, 10)

y = np.exp(-x/3.0)

f = interp1d(x, y)

f2 = interp1d(x, y, kind='cubic')

xnew = np.linspace(0, 10, 40)

将 matplotlib.pyplot 导入为 plt

plt.plot(x,y,'o',xnew,f(xnew),'-',xnew, f2(xnew),'--')

plt.legend(['data', 'linear', 'cubic'], loc='best')

plt.show()

0 投票
1 回答
2078 浏览

xna - XNA 随机瓦片/地形生成教程?

我一直在尝试找到一个关于如何编程随机瓷砖生成(2D)的好教程。但是,我似乎找不到任何合适的教程。

是否有任何书籍和/或网站提供有关如何编程及其背后的数学的适当教程?

我知道这本身不是编程问题,但它与编程相关,所以希望有人可以通过一两个链接帮助我。

0 投票
1 回答
333 浏览

geometry - 倾斜相机时的地形图块比例

我现在正在研究 3d 地形可视化工具。表面在逻辑上被方形瓷砖覆盖。该平铺可以如下可视化:

平铺的地球

假设我想在这些瓷砖上画一幅画。需要根据为每个图块单独计算的当前相机比例来选择图片的细节级别。

在垂直相机的情况下(没有倾斜,即相机垂直于地面),所有瓷砖都具有相同的比例,即相机焦距除以地面以上的相机高度。

下图描述了这种情况:

没有倾斜的相机

其中红色三角形是没有倾斜的相机,BG 是相机离地高度,EG 是焦距,那么 scale = AC/DF = BG/EG

但是,如果相机有倾斜(即俯仰角不为 0),那么比例会从瓷砖更改为瓷砖(甚至从点到点)。

在此处输入图像描述

所以我想知道在这种情况下是否有任何方法可以为每个瓷砖产生合理的比例?

0 投票
2 回答
526 浏览

java - 区分水陆的算法

我正在尝试提出一种算法来区分水和陆地。我有一个 2D 数组,它只包含 0(黑色方块)和 1(灰色方块),这会产生这个图像。我将其中一个水域涂成蓝色,这样你就可以看到应该是水的地方。水是大而圆形的区域。我将一些土地区域涂成绿色。所有的黑色直线都应该是陆地以及一些较小的圆形。

现在,所有的黑色区域都表示为 0,所有的灰色区域都表示为 1。所以在图片中,绿色和蓝色的点都表示为同一个东西。我需要将一些黑色区域(水)表示为 2。有什么好方法可以做到这一点?到目前为止,我想出的最好的办法是计算每个黑点的面积,并且只允许高于某个阈值的区域是水。我认为有更好的方法,我想知道你们的想法。

在此处输入图像描述