我的建筑系统即将完成;问题是当我通过使用Physics.OverlapBox()
和下面显示的代码来调试Gizmos.DrawWireCube()
时:
void OnGizmosDraw()
{
Gizmos.matrix = Matrix4x4.TRS(transform.position + boundingOffset, transform.rotation, boundingExtents);
Gizmos.DrawWireCube(Vector3.zero, Vector3.one);
}
我看到了问题,但我会以图片的形式显示出来,因为我很难解释。
我曾经考虑过一种解决方案,但是我找不到方程式和它是什么方法。基本上,有一个原始矢量将添加一个偏移量(如果已定义),并且它的最终矢量会受到旋转的影响。会在另一部分中详细解释。
也许这是基于三角的计算。我希望您能找到方法。
谢谢。
答案 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);