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所做的那样?谢谢,我原以为它会有这么多复杂的数学运算,但它只是用一个函数来解决的