【发布时间】: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