如何根据Unity中的旋转和边界移回对象?

问题描述 投票:0回答:1

好吧,所以我有一个对象,它也有一个界限。我也有一个anchorPoint,如果你愿意,这是对象的位置,我有一个boundary Vector3位置,我不希望对象通过。

编辑:

我将在以下场景中澄清我的示例:

好吧,让我们采取矩形棱镜,因为它是一个完美的例子。显然,当你长时间观察它时,如果你将它在y上旋转90度到你看到物体末端的位置,它就不会那么接近你。即使物体没有改变位置并且基本上处于相同的位置,只需旋转。我想检查在旋转期间是否物体通过了一个名为boundary的点。如果超过该点,那么我想在z方向上向前移动对象,使得对象的末端与boundary位置相交。

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

Example Rotation Image

结束编辑

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

到目前为止,我写的任何东西都没有任何运气。任何有关此事的帮助将不胜感激。

c# unity3d quaternions bounds
1个回答
1
投票

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

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

Vector3 anchorDir = anchorPoint - boundaryPoint;
bool wrongSide = Vector3.Dot(anchorDir, boundaryDir) <= 0;

只要您的锚点位于边界的右侧,您就可以继续以完全相同的方式检查8个边界框点中的每一个。但是,您需要确保您的边界点和您的boundaryPoint位于相同的坐标系(世界与本地)(这实际上也适用于您的anchorPoint)。您可以使用Transform.TransformPoint(https://docs.unity3d.com/ScriptReference/Transform.TransformPoint.html)将所有点转换为World space,但使用InverseTransformPoint(https://docs.unity3d.com/ScriptReference/Transform.InverseTransformPoint.html)将boundaryPoint转换为边界框的局部坐标系会更有效。

Transform boundingBox = ...
Vector3 localBoundaryPoint = boundingBox.InverseTransformPoint(worldBoundaryPoint);
Vector3 localBoundaryDir = boundingBox.InverseTransformDirection(boundaryDirection);
foreach(Vector3 pt in boundingBoxPoints)
{
    Vector3 pointDir = pt- localBoundaryPoint;
    bool ptWrongSide = Vector3.Dot(pointDir , localBoundaryDir ) <= 0;
    //How you handle that is up to you (return false, set a local flag and break, whatever)
}

编辑:如果你想知道你走过边界多远,以便你可以将你的盒子移回去,你将需要稍微改变一下。您必须检查所有点,而不仅仅是在找到第一个违规者时返回,因为您无法确定哪一个是最远的。

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;
}

请注意,要使Dot Product返回正确的距离,localBoundaryDir需要是单位向量。

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

你的问题没有解释你如何定义边界点,但我们假设它只是一个GameObject。您可以在其上实现脚本,但从技术上讲,您甚至不需要它。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.