射线与圆、球相交检测

本篇讨论2D中射线和圆的相交检测,本方法同样适用于3D中射线和球的相交检测,这是因为可以在包含射线和球心的平面中进行检测,从而将3D问题转化为2D问题。如果射线穿过球心,那么平面不是唯一的,但是不影响问题的解。

下面直接降阶为 2D讨论射线与圆的相交检测。
射线与圆的三种关系:相交、相切、相离
其中相切是相交的特殊情况
看下图,

如何判断射线与圆是否相交?
如果相交,如何计算交点坐标?

下图中是射线与圆相交的一般情形。交点为E,其实相交时交点是两个,行切时交点是一个,我们只讨论第一个,感兴趣的同学可以自行求解两个不同交点坐标
上图中加了辅助线和字母标记,帮助我们清晰理解求解过程
Vector3 source 射线起点坐标
Vector3 rayDirection 射线方向
Vector3 sphereCenter 球中心点坐标
float sphereRadius 球半径

P 射线起点坐标
O 球心坐标
E 射线与球的交点
A 球心到射线画垂线的交点

e = PO长度:射线与球中心连线长度
a = PA长度:向量PO 到 射线方向rayDirection 上的投影长度 Dot(PO, rayDirection)
b = OA长度:球中心到射线的距离, e、a、b 构成一个直角三角形,e 为斜边,a、b为直角边

如果射线与球相交才会有交点 E
t (小写字母T)= PE长度:射线源点到 射线与球的交点距离
f (小写字母F) = EA长度
PA = PE + EA

上边 PAO 三个点构成一个直角三角形,A为直角
上边 EAO 三个店构成一个直角三角形,A为直角

r 为圆半径

e x e = a x a + b x b
r x r = f x f + b x b
推导出
f x f = r x r - e x e + a x a
t = a - f
射线与球交点坐标为 source + rayDirection * t

逻辑代码如下

/// <summary>
/// 射线与球的相交检测
/// </summary>
///
public class RaySphereCollision
{private float a;private float e;public bool IsCollision(Vector3 source, Vector3 rayDirection, Vector3 sphereCenter, float sphereRadius){rayDirection.Normalize();Vector3 offset = sphereCenter - source;e = offset.magnitude;a = Dot(offset, rayDirection);return sphereRadius * sphereRadius - (e * e - a * a) >= 0;}public Vector3 CollisionPosition(Vector3 source, Vector3 rayDirection, Vector3 sphereCenter, float sphereRadius){if (!IsCollision(source, rayDirection, sphereCenter, sphereRadius)){return Vector3.zero;}// 如果不相交 sphereRadius * sphereRadius - e * e + a * a < 0float f = (float)Math.Sqrt(sphereRadius * sphereRadius - e * e + a * a);float t = a - f;return source + rayDirection * t;}public float Dot(Vector3 vector1, Vector3 vector2){return vector1.x * vector2.x + vector1.y * vector2.y + vector1.z * vector2.z;}
}

射线与圆、球相交检测相关推荐

  1. 射线和三角形的相交检测(ray triangle intersection test)

    http://www.cnblogs.com/graphics/archive/2010/08/09/1795348.html 本文以Fast, Minimum Storage Ray Triangl ...

  2. AABB上距离点最近的距离、AABB与球相交检测

    AABB上距离点最近的距离.AABB与球相交检测 AABB 即轴对其矩形边界框(每一条边都平行于坐标轴的矩形边界框),2D中为无旋转的 矩形,3D中为无旋转的六面体,长宽高可以各不相同. AABB内的 ...

  3. hdu1174(3维射线与圆是否相交)

    简单的题意,要注意z2 = h2*0.9-r2 #include <iostream> #include <cmath> #include <vector> #in ...

  4. 《用一周学习光线追踪》2.BVH树、AABB相交检测

    本项目上接<用两天学习光线追踪>,继续学习光线追踪. 项目链接:https://github.com/maijiaquan/ray-tracing-with-imgui 目录: <用 ...

  5. 射线与OBB相交检测

    在上一篇 射线与AABB相交检测 射线与OBB3D 相交检测的原理跟射线与AABB相交检测的原理相同,本篇不再讲解原理 上篇推论出:射线与平面相交点距离射线起点距离t的距离公式为 t = (d - D ...

  6. 射线与AABB相交检测

    Box2D使用了一个叫做 slab 的碰撞检测算法. 在2D中AABB是一个矩形边界框,slab 指的是矩形一组平行线之间的范围,所以在2D中矩形边界框四条边,两两一组,可以组成两个 slab. 如下 ...

  7. NX/UG二次开发—3D几何—包围盒相交检测(转载)

    一:包围盒介绍 包围盒是指能够包容物体的三维立方体或者二维长方形,是包围体的一种,常常用于模型的碰撞检测.包围体主要包括球体.轴对齐包围盒(AABB).有向包围盒(OBB)和凸包(Convex Hul ...

  8. 【Unity】图形相交检测

    前言 图形相交检测常常用在伤害判定,使用自定义的图形相交检测,可以在一定程度上控制性能. 比如2D格斗游戏中使用的矩形包围盒(AABB),一些动作游戏中常常出现的扇形攻击. 2D的图形相交检测能够满足 ...

  9. 土木搬砖工图形学学习之路——射线与包围盒的相交测试

    本人土木转计算机,目前刚刚开始研究生生涯.最近喜欢上了三维计算机图形学,被射线与包围盒的相交测试函数卡了许久,以下分享一些个人的学习理解. 一.结构体定义 包围盒定义为三维空间中一个立方体,其六个面分 ...

最新文章

  1. Excel 计算除法并显示为万分之几,如0.15‱
  2. matlab配对交易回测,精品案例 | 经典投资策略之配对交易策略
  3. 数据结构与算法一 - 二叉树基础
  4. 用SSDT方法恢复冒险岛的部分函数
  5. 【二分法万能模板,告别死循环、越界】Leecode 69. Sqrt(x)——Leecode日常刷题系列
  6. mysql-表完整性约束
  7. JAVA入门级教学之(package和import)
  8. javascript中Date对象及方法
  9. openssh升级_Redhat 6.5源码编译升级openssh到7.8版本
  10. 计算机一级ftp协议传输,文件传输协议(FTP)必将消亡
  11. 线性可分支持向量机与硬间隔最大化
  12. java中pmt计算_5个财务函数FV、PV、PMT、NPER与
  13. 转载:Fiddler 教程
  14. linux下列出绝对路径的最快捷的方法lls
  15. Git 学习(篇六 --储藏与清理)
  16. 数学建模所需计算机知识
  17. windows使用命令执行exe文件
  18. Linux实战(一):服务器应用迁移
  19. cudnn.benchmark = True?是什么意思
  20. 华科计算机全qs球排名,这所大学,全国排名前十,多名应届生年薪高达百万,却不被人熟知...

热门文章

  1. CVPR2019|Depth-Aware Video Frame Interpolation【论文阅读笔记】
  2. 微信小程序中实现获奖名单滚动播放
  3. 服务器七雄争霸官方网站,腾讯七雄争霸微端登录器
  4. 问题解决:java.lang.IllegalArgumentException: character to be escaped is missing
  5. 【54期】Java序列化三连问,是什么?为什么需要?如何实现?
  6. 日本超高人气聊天软件LINE最全注册攻略来了
  7. 线下门店如何运营私域流量
  8. 对待事物,乐观积极。
  9. 企业品牌私域化运营,私域流量只是起步
  10. 细粒度 文档图像版面分析