如何定位C gameObject
,使其与A and B
形成直角三角形。我尝试使用(B.transform.position.x,A.transform.position.z)
,但仍然可以给我一些接近A
的东西(需要全局使用)。我希望C
与local red axis of A
和local green axis of B
一样,如图所示。我该怎么办?
答案 0 :(得分:1)
有几种表达这个问题的方法。
一个发现是沿着B的上轴找到这样一个点,使得它与A成直角。这会忽略A的任何旋转。
为此,请沿B向上投影A的位置。换句话说,找到(A-B)和B的点积,再乘以B的点,再将其加到B。
Vector3 cPos = B.transform.position + Vector3.Dot(A.transform.position - B.transform.position, B.transform.up) * B.transform.up;
C.transform.position = cPos;
另一种方法是找到B向上和A右侧的交点。根据A和B的旋转,这可能会使角度不成直角,甚至根本没有一点。
这有点复杂,the link in the comments有一个很好的实现:
public static bool LineLineIntersection(out Vector3 intersection, Vector3 linePoint1, Vector3 lineVec1, Vector3 linePoint2, Vector3 lineVec2){ Vector3 lineVec3 = linePoint2 - linePoint1; Vector3 crossVec1and2 = Vector3.Cross(lineVec1, lineVec2); Vector3 crossVec3and2 = Vector3.Cross(lineVec3, lineVec2); float planarFactor = Vector3.Dot(lineVec3, crossVec1and2); //is coplanar, and not parrallel if(Mathf.Abs(planarFactor) < 0.0001f && crossVec1and2.sqrMagnitude > 0.0001f) { float s = Vector3.Dot(crossVec3and2, crossVec1and2) / crossVec1and2.sqrMagnitude; intersection = linePoint1 + (lineVec1 * s); return true; } else { intersection = Vector3.zero; return false; } }
然后找到您的位置:
Vector3 cPos;
bool doIntersect = LineLineIntersection(out cPos, A.transform.position, A.transform.right, B.transform.position, B.transform.up);
if (doIntersect) {
C.transform.position = cPos;
} else {
// do something reasonable, like using projection, or not changing the position
Vector3 cPos = B.transform.position + Vector3.Dot(A.transform.position - B.transform.position, B.transform.up) * B.transform.up;
C.transform.position = cPos;
}