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

足球游戏开发:求camera.forward直线与守门员移动直线的交点

足球游戏守门员定位计算方案

核心思路

要实现守门员自动移动到射门瞄准的球门位置,本质是求射门轨迹直线和守门员移动直线的交点,再将守门员位置设为该交点(并限制在球门范围内)。

步骤拆解(以Unity坐标系为例)

假设游戏采用Unity右手坐标系:

  • X轴:球门左右方向(守门员移动方向)
  • Y轴:垂直地面的高度方向
  • Z轴:前后射门方向

1. 定义关键参数

  • 射门轨迹:过相机位置cameraPos,方向为相机前向向量shootDir(需归一化)
  • 守门员移动线:球门左/右门柱连线,固定Y高度(守门员站立高度)和Z位置(球门所在的前后位置)

2. 计算交点

用参数方程求解:

  • 射门轨迹参数方程:P(t) = cameraPos + t * shootDir,t为参数
  • 守门员移动线的Z坐标固定为goalZ,代入Z分量求t:
    t = (goalZ - cameraPos.z) / shootDir.z
    
  • 用t计算交点的X坐标:
    intersectX = cameraPos.x + t * shootDir.x
    
  • 交点的Y和Z直接取守门员固定高度keeperY和球门Z位置goalZ

3. 限制位置在球门范围内

将计算出的X坐标限制在左右门柱的X值之间,避免守门员跑出球门。

代码示例(Unity C#)

// 获取相机参数
Vector3 cameraPos = Camera.main.transform.position;
Vector3 shootDir = Camera.main.transform.forward.normalized;

// 球门参数(根据你的游戏场景调整数值)
Vector3 leftGoalPost = new Vector3(-4.5f, 1.6f, 30f); // 左门柱位置
Vector3 rightGoalPost = new Vector3(4.5f, 1.6f, 30f); // 右门柱位置
float keeperFixedY = leftGoalPost.y;
float goalFixedZ = leftGoalPost.z;

// 计算参数t,找到射门轨迹到达球门Z平面的点
float t = (goalFixedZ - cameraPos.z) / shootDir.z;
// 计算交点X坐标
float targetX = cameraPos.x + t * shootDir.x;

// 构造目标位置,限制X在球门范围内
Vector3 keeperTargetPos = new Vector3(
    Mathf.Clamp(targetX, leftGoalPost.x, rightGoalPost.x),
    keeperFixedY,
    goalFixedZ
);

// 设置守门员位置
keeperTransform.position = keeperTargetPos;

适配其他引擎的注意事项

如果用UE4等其他引擎,仅需调整坐标系对应轴:

  • UE4中Z轴为高度,Y轴为前后方向,此时用Y轴计算t即可:t = (goalFixedY - cameraPos.y) / shootDir.y

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:42:43