C# 如何基于对象的旋转和统一边界向后移动对象?

C# 如何基于对象的旋转和统一边界向后移动对象?,c#,unity3d,quaternions,bounds,C#,Unity3d,Quaternions,Bounds,好的,我有一个对象,它也有一个界。我还有一个主播点,如果你愿意的话,这就是对象的位置,我有一个边界向量3位置,我不希望对象通过 编辑: 我将在以下场景中阐明我的示例: 好的,让我们以一个矩形棱镜为例,因为它是一个完美的例子。显然,当你长距离地观察它时,如果你将它在y轴上旋转90度到你观察对象末端的位置,它就不会离你那么近。即使对象没有改变位置,并且基本上处于相同的位置,也只是旋转。我想检查在旋转过程中,对象是否通过了称为边界的某个点。如果它超过了该点,则我希望在其z方向上向前移动对象,以便对象的

好的,我有一个对象,它也有一个界。我还有一个
主播点
,如果你愿意的话,这就是对象的位置,我有一个
边界
向量3位置,我不希望对象通过

编辑:

我将在以下场景中阐明我的示例:

好的,让我们以一个矩形棱镜为例,因为它是一个完美的例子。显然,当你长距离地观察它时,如果你将它在y轴上旋转90度到你观察对象末端的位置,它就不会离你那么近。即使对象没有改变位置,并且基本上处于相同的位置,也只是旋转。我想检查在旋转过程中,对象是否通过了称为
边界的某个点。如果它超过了该点,则我希望在其z方向上向前移动对象,以便对象的末端与
边界
位置相交

假设对象的初始位置在下图中保持不变

结束编辑

当我想旋转对象时,这个问题就出现了。如何检测对象的一部分是否已移动到此边界位置之前;这并不是说物体的中心已经过了这个位置,而是说物体的那个部分已经过了。我认为最好的方法是使用边界,但我不太确定如何将旋转与边界结合起来


到目前为止,我写的任何东西都没有什么好运气。如果您在这方面有任何帮助,我们将不胜感激。

假设最简单的情况是,如果您有一个矩形、轴对齐的边界框,那么您有8个点组成边界框(8个角)

要进行的第一项检查是查看锚点是否位于边界平面的“错误”一侧。这是一个简单的矢量点积检查

Vector3 anchorDir = anchorPoint - boundaryPoint;
bool wrongSide = Vector3.Dot(anchorDir, boundaryDir) <= 0;
请注意,要使点积返回正确的距离,localBoundaryDir需要是单位向量

编辑2 在这里描述边界点问题比在评论中更容易

你的问题并没有解释你如何定义一个边界点,但让我们假设它只是一个游戏对象。你可以在上面实现一个脚本,但技术上你甚至不需要它

GameObject boundaryObject = ...
Vector3 boundaryPoint = boundaryObject.transform.position;
Vector3 boundaryDir = boundaryObject.transform.forward;

transform.forward
始终指向z轴,即蓝色箭头。因此,如果在Unity编辑器中构建场景,蓝色箭头将指向平面的法线。您的“边界线”延伸到右侧和左侧(x轴,红色箭头)以及上下(y轴,绿色箭头)

当你说边界时,你到底是什么意思?向量3的位置就是空间中的一个点。您是否试图确定您的对象是否与源自
边界
(例如,方向为
边界
-
原点
)的向量相交?或者您是否想象一个更基于物理的边界,例如墙/平面/球体?也许物体的任何一点从某个原点延伸超过n个单位?它只是空间中的一个位置,但你可以把它想象成一堵墙,我不想让它通过,但如果物体旋转超过该点,它会向后移动。对象位置和边界位置位于同一平面上。这就是为什么我把它叫做矢量。你需要的不仅仅是一个点来定义一个边界。在图片示例中,如果未旋转立方体的点标记了从右到左的边界(而不是从上到下),则该立方体已跨过边界。所以你需要一个点和一个方向(它基本上定义了一个平面)。好吧,那么我可以把它变成一个平面,下一步是什么@avariant?@Dtb49,我添加了一个答案,上面有更多描述,boundaryDir是什么?与其将你的边界定义为一个点,它需要是一个“平面”。平面始终定义为点和方向(通常称为“法线”)。因此,除了点位置的矢量3外,还需要定义平面法线的矢量3方向。在您的图片示例中,这将是一个指向屏幕顶部的向量,就像您在图像中绘制的箭头一样。嗯,那么我必须创建一个实际的平面对象,还是可以用另一种方式确定这个方向?不一定。Unity3d中定义了一个平面类型,您可以在脚本中使用它,但也可以只定义一个矢量3位置和一个矢量3方向。
float maxDistance = 0;
foreach(Vector3 pt in boundingBoxPoints)
{
    Vector3 pointDir = pt- localBoundaryPoint;
    //note the negative sign
    float distance = -Vector3.Dot(pointDir, localBoundaryDir );
    if (distance > maxDistance) maxDistance = distance;
}
if (maxDistance> 0)
{
    //Shift your object by maxDistance amount along the localBoundaryDir;
}
GameObject boundaryObject = ...
Vector3 boundaryPoint = boundaryObject.transform.position;
Vector3 boundaryDir = boundaryObject.transform.forward;