【问题标题】:Terrain map THREE.JS地形图 THREE.JS
【发布时间】:2022-01-09 14:17:24
【问题描述】:

告诉我谁知道 THREE.JS。我实现了一个类似于游戏 SimCity 50x50 的地图网格。我渲染了具有不同高度的地面块(如屏幕截图所示),现在我想平滑高度过渡,以便在保持 50x50 网格的同时有平滑的浮雕。按照计划,一切都应该像 SimCity 游戏中的那样:用户改变景观类型,改变景观的浮雕。

Image: How it looks now - Image: What I want to get

实现如下:有一个 json 数组,其中每个单元格的 XZ 坐标被列出以放置在 50x50 的地图上,Y 坐标表示地块的高度,以及地形类型(草、土、石头等)。每块土地都是一个 BoxGeometry。

有想法以某种方式将顶点添加到上侧并通过它们的位置平滑过渡,但我没有找到这个。

【问题讨论】:

  • 请提供足够的代码,以便其他人更好地理解或重现问题。

标签: javascript three.js 3d


【解决方案1】:

这个可以BlockGeometry 对象来完成,但这会带来更多的麻烦而不是它的价值。例如,您必须分析周围的地形才能知道如何旋转BlockGeometry 才能正确修改它,并且在编辑地形时可能需要再次旋转它。 在这些情况下,单个网格更加自然。

首先,请注意地图仅包含四种单元格形状,不包括旋转:平面单元格、平行相对边缘倾斜的单元格、向上弯曲形成角的单元格和向下弯曲形成角的单元格。

不要将您的地形视为一组块,而是将其视为由方形单元格缝制而成的一个连续表面。每个单元格都是由四个三角形组成的网格。

在负 y 轴下方查看一个单元格,从左上角开始沿单元格顺时针方向移动,我们将标记单元格角处的顶点 a、bcd。从这个角度来看,我们会将第五个顶点 e 放置在单元格的正中间。这些顶点形成四个三角形,△abe、△bce、△cde和△dae

对于任何单元格,您当前存储的Y 值将变为顶点的y-位置a.

为了得到顶点by-位置,我们查看右边一列的单元格。该单元格左上角 (a) 的 y 位置,,即该单元格存储的 Y 值,也是 y - 我们当前正在构建的单元格右上角 (b) 的位置。类似地,我们当前右下角 (c) 的 y 位置是存储的Y 值,该值是单元格向下一行和右侧一列的值。我们当前左下角的 y 位置 (d) 是下一行单元格的存储的 Y 值。

顶点e有点棘手,但可以这样解决:

  1. 如果abcd中的任意三个具有相同的y -位置,然后 e 共享该 y-位置(这是水平单元格或对角斜率)。
  2. 如果abcd的两个相邻顶点共享一个y -position 和另外两个共享另一个 y-position,那么 ey-position 是这两者的平均值y-位置。
  3. 如果 12 都不是真的,我们有一个错误(因为 SimCity 2000 地图不允许其他类型的几何)。

现在,实际生成网格是另一回事,但有很多可用的教程(通过 Google:Procedural terrain meshes in ThreeJS)。

https://pnichols04.github.io/sc2k-map/ 看到它,源代码在 https://github.com/pnichols04/sc2k-map。 >

【讨论】:

    猜你喜欢
    • 2015-03-16
    • 1970-01-01
    • 2013-04-11
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 2013-07-14
    • 1970-01-01
    相关资源
    最近更新 更多