网格系统坐标对齐偏移 - CENTER vs CORNER/VERTEX

问题描述 投票:0回答:1

我在 UnrealEngine 中用简单的网格系统搞砸了,我问自己我应该如何将我的WorldCoordinate转换/解析/对齐到GridCoordinate。 例如 RedCylinderBlueBox 是网格上的实体,GridCoordinates 在我的例子中是网格中单元格的索引,假设 (0,0) 是左下角,X 作为上向量: BlueBox - ( 5,5), RedCylinder - (6,7)

但是 UnrealEngine 有自己的网格,由 WorldCoordinates 表示,假设 MyGrid 的 (0,0) 和 WorldGrid 的 (0,0) 对齐并且比例为 1:100 - 突然我的 RedCylinder GridCoord( 6,7) 将有 WorldCoord(650, 750)。显然这是因为实体位于单元格的中心。

这绝对不是问题,但我想知道是否存在使用 2 个彼此不同规模的网格的标准和最佳实践。现在我看到两种方法:

  1. 将实体放在单元格 CORNER / VERTEX 上,但是在某些情况下可能有必要在单元格中放置实体而不是指向不仅视觉上的 - 例如像库存系统或基于回合的单位,但机械以及碰撞检查GridFloor 到实体。

  2. 我当前的实现将 MyGrid 移动一半大小,因此 (0,0) 不是单元格 CORNER/VERTEX,而是 CENTER。使用这种方法 RedCylinder.GridCoord = (6,7) 是 WorldCoord = (600,700)。但是现在我需要做数学来对齐两个网格 - 将单元格一半大小添加到网格位置。我担心当在 (0,0) 周围的所有方向上构建网格时,这会变得非常复杂非常快,倾斜,旋转,与方形等不同。

我的纯学术问题是:

是否有解决此类问题的推荐方法,特别是如果 MyGrid 每个单元格的顶点数量与 WorldGrid(DiamonGrid、TriangleGrid)不同?

geometry grid game-development unreal-engine4 unreal-engine5
1个回答
0
投票

冻结!

这是一个大问题(也很有趣),但让我们首先说没有理想的方法或一种真正的方法来设置它。所以没有一个推荐的方法,我很确定如果你查看多个基于网格的游戏的源代码,你可能会发现同一事物的许多不同实现。

但简而言之,您需要两个函数:一个获取世界空间坐标并为您提供网格坐标。另一个做相反的事情是它接收网格坐标并将其转换为空间坐标。

我可以告诉你我会做什么,并指出有人写了一篇关于他们如何设置网格的超级有趣的文章。

关于从

World Coordinate
Grid Coordinate
的转换,反之亦然: 如果您考虑一下,这就是将数字从一个空间坐标系转换到另一个空间坐标系的问题。那是一个线性代数问题。这是一个优秀的视频系列,展示了一种更直观的线性代数思考方式:https://www.youtube.com/playlist?list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab

理想情况下,您将有一个转换,您可以乘以从世界到网格,另一个从网格到世界。我的猜测是您只需要将向量与标量相乘即可。所以乘以 100 得到 Grid to World 和 0.01 并做一个 floor 操作得到 World to Grid(或者如果你想知道坐标在 Grid Space 中的确切位置,则没有 floor)。 World to Grid 会有点棘手,因为它取决于您定义网格系统边界的位置。

这是另一篇关于 OpenGL 坐标系的文献。如果您考虑一下,您正在创建一个名为“网格空间”的新坐标系:https://learnopengl.com/Getting-started/Coordinate-Systems

您需要考虑的另一件事是,如果您的游戏是 2D 或具有固定的等距相机,则需要在转换为网格空间之前在世界和屏幕空间之间进行转换。

现在,转到一些我认为您会喜欢的链接,因为这个人正在探索与您相同的问题:

  • https://www.redblobgames.com/grids/parts/
  • https://www.redblobgames.com/grids/hexagons/#coordinates
我想你会喜欢阅读我发送的参考资料,我期待听到你如何在你的游戏中设置它!再次重申——这只是设置它的一种方式,没有最好的方式。最好的方法可能是适合您和您的架构的独特方法。

© www.soinside.com 2019 - 2024. All rights reserved.