You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity C#:如何在直角三角形中求解直角顶点C的位置?

解决方案:求解直角顶点C的位置

几何分析

已知场景为俯视图(所有点Y=0),直角三角形中A(守门员)、B(球)为非直角顶点,直角在C。结合守门员背向球门的约束,C点是球B到守门员防守线(平行于transform.right、垂直于transform.forward的直线,即球门线方向)的垂足,此时AC与BC垂直,满足直角三角形的要求。

计算方法(Unity C#实现)

以下两种方法等价,可任选其一:

方法1:基于transform.forward(法向量)计算

利用直线的法向量(守门员的前方向transform.forward,单位向量),计算B到防守线的垂足:

// 定义已知点:A是守门员位置,B是球的位置
Vector3 A = transform.position;
Vector3 B = ballTransform.position;

// 防守线的法向量(守门员前方向,垂直于防守线)
Vector3 normal = transform.forward;
// 向量AB
Vector3 AB = B - A;
// 计算B到防守线的投影长度
float projectionLength = Vector3.Dot(AB, normal);
// 计算垂足C
Vector3 C = B - normal * projectionLength;
// 确保Y值为0(场景约束)
C.y = 0;

方法2:基于transform.right(方向向量)计算

利用防守线的方向向量(守门员的右方向transform.right,单位向量),计算AB在该方向上的投影得到C点:

// 定义已知点:A是守门员位置,B是球的位置
Vector3 A = transform.position;
Vector3 B = ballTransform.position;

// 防守线的方向向量(守门员右方向,平行于防守线)
Vector3 dir = transform.right;
// 向量AB
Vector3 AB = B - A;
// 计算AB在防守线方向上的投影长度
float projectionLength = Vector3.Dot(AB, dir);
// 计算垂足C
Vector3 C = A + dir * projectionLength;
// 确保Y值为0(场景约束)
C.y = 0;

验证逻辑

计算完成后,可通过向量点积验证AC与BC是否垂直:

Vector3 AC = C - A;
Vector3 BC = C - B;
if (Mathf.Abs(Vector3.Dot(AC, BC)) < 1e-6) {
    // 验证通过,C点符合直角要求
}

内容的提问来源于stack exchange,提问作者Alexander Kudryavy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 14:27:53