【发布时间】:2021-08-02 15:13:53
【问题描述】:
不要害怕这个问题,因为它很长。事实上,这个问题很简单也很有趣,我相信很容易理解,但我想适当地解释一下。如果您选择这样做,无论如何感谢您的阅读:)。
出于不相关的原因,我执行以下操作,从从射线投射命中检索到的点,我向上移动一米,然后向下投射另一条射线,以获得地面点。请参阅“我为什么要这样做?”最后是上下文,与问题无关。只是为了解释为什么从一个 raycasthit 点会是从另一个 raycast 重新计算的同一点。
在这种情况下,检索到的点应该完全相同。在代码中查看为什么当从 exact same point 上方抛出某个距离上方的光线投射时,应该检索 exact same point 作为起始点是有意义的用raycast检索,代码其实很简单:
if (Physics.Raycast(ray, out RaycastHit result1, maxDistance, mask, triggerInteraction))
{
Debug.LogError($"main camera picked point: {result1.point.x:G9}, {result1.point.y:G9}, {result1.point.z:G9}");
if (Physics.Raycast(result1.point + Vector3.up * 1, -Vector3.up, out RaycastHit result2, 32, mask))
{
Debug.LogError($"1m up from above raycast point: {result2.point.x:G9}, {result2.point.y:G9}, {result2.point.z:G9}");
}
returnValue = true;
}
第一次光线投射检索世界位置,第二次光线投射从上方 1m 处向下投射光线。考虑到它是完全相同的点,因为原点是result1.point + Vector3.up * 1。记录所有小数点,这就是为什么我强调它是完全相同的点。
问题是,有一个表面不会发生这种情况并且小数会发生变化。像这样:
正如我在遇到问题之前所说的那样,检索到的点完全相同:
在精度方面没什么大不了的,但我想知道为什么会发生这种情况。 这个表面有一个网格,有法线、切线等。当我在网格导入设置中删除这些时,问题就消失了,检索到的点是相同的。查看设置的屏幕截图。
来自状态:(点差是如何产生的):
陈述(点差如何不产生):
网格法线在 raycasthit 计算中的影响是什么?任何可以检查光线投射如何在幕后工作的资源?
我为什么要这样做?
这与问题本身无关,但会根据上下文进行解释并避免不必要的答案/cmets。 它是将空间路径中的一些点移动到地面。该路径的节点(从中检索路径的参考点)已经存在于地面中(从主摄像机抛出以使用光线投射“拾取”世界点以定义路径节点)。所以我不需要找到节点本身的接地点,因为它们已经在地下,但这样做是不必要的,因为我正在遍历所有路径点,我偶然发现了这个问题。
感谢阅读。
编辑:在网格导入设置中删除法线,按照统一docs 建议:“优化提示:如果网格碰撞器仅使用网格,您可以在导入设置中禁用法线,因为物理系统不会不需要它们。” 但是,如果我以法线为无启动应用程序,并且在设置导入选项 + ctrl + R 后,y 会得到一个不同的点,法线为无,并且在设置法线导入选项后得到确切的点。因此,似乎它与选项更改 + 在运行时重新编译和网格烹饪这一事实相比,它与网格法线的具体关系更大。
网格形状图像,从上方红色箭头方向投射光线:
【问题讨论】:
标签: unity3d collision-detection collision physics-engine