【问题标题】:How to map screen coordinates to individual Tiles in a rotated Tilemap?如何将屏幕坐标映射到旋转的 Tilemap 中的单个 Tiles?
【发布时间】:2022-06-19 04:22:06
【问题描述】:

我试图弄清楚如何正确计算光标相对于旋转的Tilemap 的位置。首先,用几张图片来说明问题。

Camera rotation: 0
Tilemap rotation: 0

一切看起来都很好,效果很好,除了我们希望瓷砖具有伪 3d 透视图,这意味着它们沿 x 轴旋转:

Camera Rotation: 0
Tilemap rotation: 60

这让我们看到了我们的观点,但是除了中间附近的窄带之外,寻找瓷砖的计算停止工作:

到目前为止,我已经尝试了两种不同的方法,它们都获得了相同的结果:

var touchPosition = getScreenPosition();
var worldPosition = Camera.main.ScreenToWorldPoint(touchPosition);
worldPosition.z = 0;
var cellPosition = tilemap.WorldToCell(position);

值得注意的是,我不得不做一些 z 轴操作来解释我怀疑可能是我最初问题的一部分的相机位置。相反,我转而进行光线投射以找到我的交点:

var plane = new Plane(Vector3.back, Vector3.zero);

var touchPosition = getScreenPosition();
var ray = Camera.main.ScreenPointToRay(new Vector3(touchPosition.x, touchPosition.y, 0f));
if (plane.Raycast(ray, out float hit))
{
    var point = ray.GetPoint(hit);
    var cellPosition = tilemap.WorldToCell(point);
}

这消除了调整 z 轴的需要,但是随着 Tilemap 的旋转,我仍然无法找到正确的 Tile。有趣的是,如果我也旋转Camera 本身,一切都会重新开始工作,没有透视和偏移(因为相机的物理位置没有改变)。

Camera rotation: 60
Tilemap rotation: 60

我的怀疑是,尽管光线投射找到了有效的命中,WorldToCell() 在进行转换时并没有考虑到变换的旋转。我找不到那个特定功能的来源,所以如果它在某个地方可用,我会很乐意从那里开始。除此之外,如果有人能帮我指出我可能需要做的数学运算以使这个计算正确,那就太好了。

非常感谢!

【问题讨论】:

    标签: c# unity3d rotation isometric


    【解决方案1】:

    原来这个问题的答案非常简单:https://gamedev.stackexchange.com/a/5220 有我需要的信息,特别是句子:

    这是带有水平六边形的传统版本,在垂直轴上被有效挤压以形成伪等距外观。

    我没有将 Tilemap 旋转 60 度,而是将其 Y 比例设置为 0.5,瞧,一切都很完美。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2019-12-29
      • 1970-01-01
      相关资源
      最近更新 更多