通过光线投射,我们可以选择游戏对象碰撞器上的一个点。在简短的视觉效果中,三个点用小球体表示,表示用户选择。我们的愿望是计算模型压痕中任何点的深度。当前的想法是使用一种系统,其中用户选择压痕深度之外的两个点和压痕深度内的一个点来计算压痕深度。
我们可以获得的信息是空间中的三个点(向量)、它们之间的距离以及任何其他利用三个点的向量数学。我们如何使用上述数据来计算压痕的深度?计算垂直于深度点的点是否可行且合理?想法是,如果这个点是可计算的,那么深度就是这两点之间的距离。如何解决这个问题,是否可行,是否有更好的方法?
这是一个相当悬而未决的问题,因为简单的“深度”是相当模糊的。如果您可以在世界空间中的模型上找到一些点,则有两种方法:
方法 1:从曲面上的 3 个点创建参考平面。
-
让用户单击他们想了解其“深度”的点。
RaycastHit indentHit;
Vector3 depthPoint = indentHit.point;
-
让用户单击“缩进”之外的三个点。这三个点定义了一个平面,我们将用它作为“深度”测量的参考。
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);
-
使用以下公式求出该点到平面的距离Plane.GetDistanceToPoint
。我们不关心方向,只关心距离,所以我们使用Mathf.Abs
确保我们的距离为正:
float depth = Mathf.Abs(surfacePlane.GetDistanceToPoint(depthPoint));
方法 2:从曲面上的 1 点及其法线创建参考平面。
另一种方法是在模型表面上取一个点,在凹口上取一个点,然后从模型表面上的单个点创建一个平面,并使用其法线从该点创建一个平面观点:
-
让用户单击他们想了解其“深度”的点。
RaycastHit indentHit;
Vector3 depthPoint = indentHit.point;
-
让用户单击“缩进”之外的一点。然后,找到该点的法线。由此,您可以生成一个平面。
RaycastHit surfaceHit;
Vector3 surfacePoint = surfaceHit.point;
Vector3 surfaceNormal = surfaceHit.normal;
Plane surfacePlane = new Plane(surfaceNormal.normalized, surfacePoint);
可能值得尝试的事情是允许采用多个点和法线并对它们进行平均以创建平面。如果您尝试此操作,请确保您获得normalized
正常的形式。
-
使用以下公式求出该点到平面的距离Plane.GetDistanceToPoint
。我们不关心方向,只关心距离,所以我们使用Mathf.Abs
确保我们的距离为正:
float depth = Mathf.Abs(surfacePlane.GetDistanceToPoint(depthPoint));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)