如何根据光线投射的哪一侧来获取正确的坐标?

时间:2018-11-30 14:34:21

标签: c# unity3d

好的,所以我在此描述中添加了图像,以便使问题更清晰。

我有一个Parent Object,其中包含三个Blocks。 父级具有这三个块的组合网格。

玩家(蓝色圆圈)能够摧毁方块。为此,我有一个raycast,从玩家朝其所面对的方向发送,并返回hit.point的位置。

当玩家站在玩家位置1时,命中点可能类似于X = 0.5Z = 0.5(在此示例中,我们忽略Y)。

所以我需要做类似的事情:

float xx = hit.point.x + (1 - (hit.point.x % 1));

然后xx = 1

然后我可以对z做同样的事情。

但是:

当玩家在玩家Pos 2上时,此操作无效。

然后xx将是4,而不是3(这是必需的)。

我考虑过只是检查一下,如果玩家的transform.position.xhit.point.x小还是大,但这还有一个问题:

  

如果玩家在x = 2 z = 1处摧毁了方块,然后进入   在其余两个块之间的中间,然后面向x = 1 z = 1的块,结果将是x = 2,因此他无法销毁左侧的块。

如果不清楚,很抱歉,英语不是我的母语。

我希望有人可以帮助我!

enter image description here

1 个答案:

答案 0 :(得分:1)

因此,为简单起见,我们仅考虑X-Z平面并将父对象放在原点,并假定“块”的大小为1单位* 1单位。
播放器位于P点,光线投射的命中点为H。我们向向量PH添加了非常小的偏移量(类似于0.001 * PH.normalized),因此它将落在块内。然后,我们使用 <img src={umberlla} alt="text"></img> 方法来确定玩家击中的方块。代码类似于:

Mathf.FloorToInt

以下是图形说明(P是玩家,H是命中点,HN是偏移量(出于解释目的而夸大)):enter image description here

但是,此解决方案存在一些次要缺陷:
首先,它不关心父对象的旋转,平移和缩放。您应该做一些数学运算,以便将所有内容置于父对象的局部坐标系下。
其次,当击点位于块的边缘或关节附近时,它不起作用(因为偏移量会导致您离开块外),但这确实很少见(只要您将浮点精度保持在合理范围内) )。