c# - Unity3d:定位一个游戏对象,使其与其他两个游戏对象形成一个直角三角形
问题描述
我如何定位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
如图所示。我该怎么办?
解决方案
有几种方法可以表达这个问题。
一个是沿着 B 的上轴找到这样一个点,使其与 A 成直角。这将忽略 A 的任何旋转。
为此,将 A 的位置沿 B 向上投影。换句话说,找到 (AB) 和 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 的旋转,这可能会产生非直角或根本没有点。
这有点复杂,评论中的链接有一个很好的实现:
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;
}
推荐阅读
- c# - 如何使用 MVC 5 在 ASP.NET 中创建一个组并将角色放入其中并将用户链接到它[asp.net identity]
- r - 了解我的 Ramsey RESET 测试的输出
- ios - 单选按钮在 ColectionView 单元格中不起作用,如果我选择一个按钮,另一个按钮不会取消选择
- vue.js - 捆绑服务器文件(Vue)并启动生产节点服务器的最佳实践
- julia - 为什么在 Julia 中尝试使用 ggplot 时出现错误?
- php - 在 stream_context_create 上更改 curl
- python - 使用“Pymongo”的“聚合”方法和“MongoDB”的“$project”命令从字典中提取键值并将它们转储到父字典中
- c# - 在二维数组中移动值
- javascript - 如何通知移动键盘有关 html 输入控件所需的输入?
- android - 如何在 listView 中获取单个文件大小