我有一个对象(A),旁边有另一个对象(B)。我正在尝试计算对象B的“高度”,以便可以将另一个对象相对于对象A的位置定位在该高度。我知道这听起来像胡言乱语(我有点累),所以我放了图表尝试解释。
因此,在左图中,黄线表示我要计算的内容。我在圆柱体(灰色)的表面上有一个位置(橙色)(使用网格数据计算的位置),我正尝试使用该位置来计算对象的半径(黑线)。为此,我需要在对象中心(灰色)的同一高度(红色点)处放置一个位置,以便我可以计算从一个方向到另一个方向,并使用长度(.magnitude)作为半径。
我的问题是我无法计算出如何在不旋转的情况下计算高度(黄线)。
我目前正在使用projectOnPlane,但是,如果我旋转对象(如第二幅图像所示),则半径应在应保持一致的情况下显着减小,因为对象没有改变大小。
Vector3 RadDirection = (Vector3.ProjectOnPlane(orangePoint, grey.transform.up) - Vector3.ProjectOnPlane(grey.transform.position, grey.transform.up));
float radius = RadDirection.magnitude;
非常感谢您的帮助。
**更新:图中的灰色块是vector3位置,而不是游戏对象。我尝试执行的半径计算在运行时进行,因此我无法将对象设为灰色并检查检查器。
**更新2:对不起,我应该提到的东西。我正在执行此操作的对象并不总是一个完美的圆柱体,可能是诸如酒杯之类的东西,在这里我需要计算玻璃的半径而不是茎的半径。另一个例子可能是化学烧杯,该烧杯通常会逐渐变细到一个点,因此我需要计算橙色点高度处的半径。抱歉,我应该把这个放在问题中。
这是一个图表,说明我在更新2中的含义。再次,橙色点充当对象(在本例中为烧杯)网格表面上Vector3位置的可视表示。
**更新3:我似乎已经解决了该问题,所以我在下面发布了我的答案,但是在撰写本文时,我无法接受(必须等待2天),因此无法关闭/回答问题。我要感谢所有为我解决这一问题做出贡献并竭力帮助我的人。希望有一天我能为您提供帮助:)
答案 0 :(得分:1)
您可以使用transform.TransformDirection()
或transform.InverseTransformDirection()
要获取高度,请减去结果,然后将X,Z坐标设置为零:
Vector3 height = orangeBox.position - greenPoint.position;
height.x = 0;
height.z = 0;
完整的解决方案:
Vector3 direction = orangeBox.position - greenPoint.position;
direction = greyBox.transform.InverseTransformDirection(direction);
direction.x = 0;
direction.z = 0;
height = direction.magnitude;
redPoint.position = greenPoint.position + greyBox.transform.up * height;
答案 1 :(得分:0)
我似乎已使用以下方法解决了我的问题:
public static Vector3 ProjectPointOnLine(Vector3 linePoint, Vector3 lineVec, Vector3 point)
{
//get vector from point on line to point in space
Vector3 linePointToPoint = point - linePoint;
float t = Vector3.Dot(linePointToPoint, lineVec);
return linePoint + lineVec * t;
}
我在这里找到了它,它还有很多其他有用的功能: http://wiki.unity3d.com/index.php/3d_Math_functions
我基本上将烧杯(绿点)的原点作为“ linePoint”传递,将烧杯“ lineVec”的向上方向与beaker.transform.up传递,最后我传递世界表面上的vector3点烧杯网格(橙色点)会返回烧杯中间的一个点,该点的高度与我的橙色点相同。然后,我将一个减去另一个,然后将大小作为半径。计算出的半径值是正确的,因为它是我所期望的值,并且仅在旋转过程中小数点后第六位发生变化,这提供了足够的精度,因为我只需要三到四个小数位即可。
如果有人需要帮助,我很乐意提供更多详细信息或帮助。