C# 从原始位置查找最终位置+;偏移和旋转

C# 从原始位置查找最终位置+;偏移和旋转,c#,unity3d,C#,Unity3d,我的建筑系统几乎完工了;问题是当我调试我的Physics.overlappbox()时,使用了Gizmos.DrawWireCube(),代码如下所示: void OnGizmosDraw() { Gizmos.matrix=Matrix4x4.TRS(transform.position+boundingOffset、transform.rotation、boundingextenses); Gizmos.DrawWireCube(Vector3.0,Vector3.1); } 我看到了这个

我的建筑系统几乎完工了;问题是当我调试我的
Physics.overlappbox()
时,使用了
Gizmos.DrawWireCube()
,代码如下所示:

void OnGizmosDraw()
{
Gizmos.matrix=Matrix4x4.TRS(transform.position+boundingOffset、transform.rotation、boundingextenses);
Gizmos.DrawWireCube(Vector3.0,Vector3.1);
}
我看到了这个问题,但我会在一张图片中展示出来,因为我有点难以解释

我已经想到了一个解决办法,但我找不到方程和它是什么方法。基本上,存在一个原始向量,将向其添加偏移(如果已定义),并使其最终向量受旋转影响。这在另一篇文章中有更多的解释

也许这是一个基于三角的计算。我希望你能找到办法


提前感谢。

好的,如果我这次理解正确的话,问题是只要变换没有缩放或旋转,偏移就可以工作

原因是

transform.position + boundingOffset
使用普通世界空间坐标。正如您所看到的,在两张图片中,从橙色到红色圆点的偏移量完全相同(在世界坐标中)

您想要的是相对于
变换
位置和比例的偏移量。您可以使用以下命令将
边界偏移
转换为相对于变换的局部坐标:

位置
从局部空间转换到世界空间

所以用

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
,而是简单地使用一个子游戏对象,例如,称为
OffsetPivot
,并根据需要将其放置在场景中。由于它是
变换的子对象,因此在旋转/缩放/移动父对象时,它将始终保持正确的偏移

然后在代码中,我将简单地执行

[SerializeField] private Transform boundingOffsetPivot;

...

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

什么是
boundingOffset
boundingExtends
boundingOffset
是框的中心,而
boundingExtends
是框的大小。基本上,我使用它们来创建一个重叠框,
boundingOffset
将添加到相对于父对象位置的位置(
transform.position
+
boundingOffset
),但问题是父对象有旋转。子组件只获取它是很好的,但是对于我需要的代码,位置仍然是(transform.position+boundingOffset),不受父对象旋转的影响,所以问题似乎出在您没有展示给我们的代码中?那么,您是否可以包括您正在使用
Physics.overlappbox
的实现?我不明白现在的问题是关于
gizmo
没有显示正确的位置,还是关于
物理.overlapper box
没有使用您期望的框?对于
什么是
元素,如何计算
边界偏移
边界延伸
?这将是一行代码:
碰撞器[]碰撞器=物理.overlapper(transform.position+boundingOffset,boundingextensts/2,blueprint.transform.rotation)边界偏移量和边界范围是一个常量变量,取决于对象,它的实现与“框碰撞器”(Box Collider)设置的实现相同。因此,您的主要问题似乎是如何将
边界偏移量和
边界范围坐标转换为1相对于变换位置和旋转,对吗?就像你在Gizmo中使用Matrix4x4所做的那样?谢谢,我原以为它会有这么多复杂的数学运算,但它只是用一个函数来解决的