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

Unity3D类8球池游戏中母球碰撞目标球后运动方向的计算方法

台球碰撞示意图

Unity 3D 8球池母球碰撞后运动方向实现方案

以下实现基于无旋转(不加塞)的理想弹性碰撞规则,符合常规8球池物理表现:

核心实现步骤

  • 计算碰撞法线
    优先通过两个球的球心位置计算,精度高于接触点计算结果:
    Vector3 collisionNormal = (targetBall.transform.position - cueBall.transform.position).normalized;
    如果你要使用已有的射线检测接触点计算也可以:
    Vector3 collisionNormal = (cueBall.transform.position - hitPoint).normalized;
  • 计算碰撞后运动方向
    直接调用Unity内置的向量反射方法即可:
    Vector3 dir2 = Vector3.Reflect(dir1.normalized, collisionNormal).normalized;
    如果你需要手动实现反射逻辑,不依赖内置API,可以用通用反射公式:
    dir2 = dir1 - 2 * Vector3.Dot(dir1, collisionNormal) * collisionNormal;

适配优化说明

  • 如果你的游戏需要支持加塞效果,在上述基础上额外根据母球的旋转角速度,给dir2叠加切向的偏移量即可
  • 如果要模拟碰撞能量损失,直接给最终方向乘以你设定的衰减系数即可,比如dir2 *= 0.98f

完整示例代码

// 已有已知参数
public Vector3 dir1; // 母球碰撞前的运动方向
public Vector3 hitPoint; // 射线检测获取的碰撞接触点
public GameObject cueBall; // 母球对象
public GameObject targetBall; // 被碰撞的目标球
public float cueBallSpeed; // 母球碰撞后的移动速度

private void CalculateCueBallDirectionAfterCollision()
{
    // 计算碰撞法线
    Vector3 collisionNormal = (targetBall.transform.position - cueBall.transform.position).normalized;
    // 计算碰撞后方向
    Vector3 dir2 = Vector3.Reflect(dir1.normalized, collisionNormal).normalized;
    // 赋值给母球刚体,控制运动
    cueBall.GetComponent<Rigidbody>().velocity = dir2 * cueBallSpeed;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 10:54:02