使用三点系统计算模型的压痕深度?

时间:2019-01-09 21:04:52

标签: c# unity3d math vector

通过光线投射可以选择GameObjects Collider上的一个点。在简短的视觉中,用小球体表示三个点,表示用户选择。期望计算模型压痕中任何斑点的深度。当前的想法是使用一种系统,在该系统中,用户选择压痕深度以外的两个点和压痕深度内的一个点,然后计算压痕深度。

可供我们使用的信息是空间中的三个点(向量),它们与利用三个点的任何其他向量数学之间的距离。我们如何使用上述数据计算压痕深度?计算与深度中的点垂直的点是否可行且合理?认为如果此点比深度可计算,则为那两个点之间的距离。如何解决这个问题,是否可行,是否有更好的方法?

short_visual

indenttest_003_A indenttest_003_B

2 个答案:

答案 0 :(得分:3)

这是一个非常开放的问题,因为简单的“深度”非常模糊。如果您可以在世界空间中找到模型上的一些点,则有两种方法:

方法1:从曲面上的3个点创建参考平面。

  1. 让用户单击他们想知道其“深度”的点。

    RaycastHit indentHit;
    Vector3 depthPoint = indentHit.point;
    
  2. 让用户单击“缩进”之外的三个点。这三个点定义了一个平面,我们将用它作为“深度”测量的参考。

    RaycastHit hitA;
    RaycastHit hitB;
    RaycastHit hitC;
    
    Vector3 a = hitA.point;
    Vector3 b = hitB.point;
    Vector3 c = hitC.point; 
    
    Plane surfacePlane = new Plane(a, b, c); 
    
  3. 使用Plane.GetDistanceToPoint查找点到平面的距离。我们不在乎方向,仅在乎距离,因此我们使用Mathf.Abs来确保距离为正值:

    float depth = Mathf.Abs(surfacePlane.GetDistanceToPoint(depthPoint));
    

方法2:从曲面上的1个点及其法线创建参考平面。

另一种方法是,在模型表面上获取一个点,在压痕上获取一个点,然后在模型表面上的单个点之外创建一个平面,并使用其法线创建平面从这一点出发:

  1. 让用户单击他们想知道其“深度”的点。

    RaycastHit indentHit;
    Vector3 depthPoint = indentHit.point;
    
  2. 让用户单击“缩进”之外的一个点。然后,在该点找到法线。通过这些,您可以生成飞机。

    RaycastHit surfaceHit;
    Vector3 surfacePoint = surfaceHit.point;
    Vector3 surfaceNormal = surfaceHit.normal;
    
    Plane surfacePlane = new Plane(surfaceNormal.normalized, surfacePoint);
    

    可能值得尝试的事情是允许获取多个点和法线并将它们取平均值以创建平面。 如果您尝试这样做,只需确保您获得普通的normalized形式。

  3. 使用Plane.GetDistanceToPoint查找点到平面的距离。我们不在乎方向,仅在乎距离,因此我们使用Mathf.Abs来确保距离为正值:

    float depth = Mathf.Abs(surfacePlane.GetDistanceToPoint(depthPoint));
    

答案 1 :(得分:1)

要补充Ruzihm的答案,正如我在previous question中指出的那样,您确实需要4(3 + 1)分。 3(2 + 1)点仍然不够。回到我的上一个示例,假设曲面a上的一个点是A,是(0,0,0),另一个B(0,0,1),并且点缩进平面bI为(2,1,0)。压痕有多深?答案是:您仍然不知道。在该示例中,添加点B仍然有两个选择:

  • aX = 0,而bX = 2。那么压痕深度显然是2。
  • aY = 0,而bY = 1。那么压痕深度显然是1。

还有无限多种其他选择。

之所以会这样,是因为两个点(AB)仅固定一条直线,而不是整个平面。要修复飞机,您确实需要3个点(不在同一条线上)。这就是Ruzihm的答案。