从原始位置+偏移和旋转找到最终位置

时间:2019-09-22 09:08:14

标签: c# unity3d

我的建筑系统即将完成;问题是当我通过使用Physics.OverlapBox()和下面显示的代码来调试Gizmos.DrawWireCube()时:

void OnGizmosDraw()
{
     Gizmos.matrix = Matrix4x4.TRS(transform.position + boundingOffset, transform.rotation, boundingExtents);
     Gizmos.DrawWireCube(Vector3.zero, Vector3.one);
}

我看到了问题,但我会以图片的形式显示出来,因为我很难解释。

enter image description here

我曾经考虑过一种解决方案,但是我找不到方程式和它是什么方法。基本上,有一个原始矢量将添加一个偏移量(如果已定义),并且它的最终矢量会受到旋转的影响。会在另一部分中详细解释。

enter image description here

也许这是基于三角的计算。我希望您能找到方法。

谢谢。

1 个答案:

答案 0 :(得分:0)

好的,如果我这次正确理解了问题,那就是只要不缩放或旋转变换,偏移量就可以工作。

原因是

transform.position + boundingOffset

使用普通的世界空间坐标。如您所见,在两张图片中,橙色到红色点的偏移量完全相同(在世界坐标下)。

您想要的是相对于transform位置和比例的偏移量。您可以使用TransformPoint

boundingOffset转换为相对于变换的局部坐标
  

position从本地空间转换为世界空间。

所以改用

Collider[] colliders = Physics.OverlapBox(transform.TransformPoint(boundingOffset), boundingExtents / 2, blueprint.transform.rotation);

它的作用基本上是

transform.position 
    + transform.right * boundingOffset.x * transform.lossyScale.x 
    + transform.up * boundingOffset.y * transform.lossyScale.y
    + transform.forward * boundingOffset.z * transform.lossyScale.z;

或者

在这种情况下,我经常使用的更具可维护性的方法不是通过硬块/字段向量提供boundingOffset,而是仅使用子GameObject例如称为OffsetPivot并根据需要将其放置在场景中。由于它是您transform的子代,因此在旋转/缩放/移动父代时,它将始终保持正确的偏移量。

然后在代码中我会简单地

[SerializeField] private Transform boundingOffsetPivot;

...

Collider[] colliders = Physics.OverlapBox(boundingOffsetPivot.position, boundingExtents / 2, blueprint.transform.rotation);