射线与球体相交

射线与球的相交

字数1183 阅读142 评论0 喜欢1

今天来说说射线和球的相交检测。

从图形来说

![射线和圆相交, origin 是射线起点, dir 是射线的方向向量。p0,p1是两个交点,center 为圆心,半径为R ,d 为圆心到射线的距离][ray-sphere] 我们先以2D 切面图来说明,当射线和圆相交的时候,可以看到,球心 center 到射线 ray 的距离 d

1. 设圆心在射线上的投影为c' ,则 origin ,center, c' 形成了一个直角三角形。

2. 获得射线起点到圆心的向量 Voc = Vcenter - Vorigin

3. 在射线方向上的投影为: Poc= Voc·(Voc·dir)

4. 勾股定理:d·d = Voc·Voc - Poc·Poc

可以求出d 的数值,

∙ d R,射线在圆外,没有交点。

接下来求P0,P1:

1. c' ,center ,P0 or P1点构成直角三角形。

2. P0 or P1到c' 的距离 tca·tca = R·R - d·d;

3. 有如下式子 P0 = dir·( |Poc| - tca );

P1 = dir·( |Poc| + tca );

要注意,没有交点的时候, tca·tca

推导三维情况可以照上面的去做,dot 能保证投影点在同一个平面上的。 附代码

bool Intersect (const Ray& ray, const Sphere& sphere, float & t0, float & t1) {

Vector3 oc = sphere.GetCenter() - ray.GetOrigin();

float projoc = dot(ray.GetDirection(), oc);

if (projoc

return false;

float oc2 = dot(oc, oc);

float distance2 = oc2 - projoc * projoc;

if (distance2 > sphere.GetRadiusSquare())

return false;

float discriminant = sphere.GetRadiusSquare() - distance2;

if (discriminant

t0 = t1 = projoc;

else

{

discriminant = sqrt (discriminant);

t0 = projoc - discriminant;

t1 = projoc + discriminant;

if (t0

t0 = t1;

}

return true;

}

从方程角度来看

射线方程:ray : P(t) = O + D·t ( t >= 0 )

球的方程:sphere : sqr( P-C ) = R·R (sqr(x) = x^2 = x·x)

O=origin, D=direction, C=center, R=radius

射线方程表明的是如下一个点的集合P ,当t 从零增大时, D·t 会沿着D 向量的方向从零逐步变长,t 取值无限表示了射线单方向。从O 点开始在D 方向上无限个点构成了一条射线。

球的方程表明了任何点P ,只要到C 点的距离等于半径R ,则表明点在球面上,这么一个球面上的点的集合。

因此当射线与球相交的时候,这个点既在射线上,又在球面上。等式射线的P(t) = 球的P 成立。

联立两个方程,试着求解 t 有:

s qr( O + D·t - C ) = R·R

设 O-C=OC,有:

sqr( OC+D·t ) - R·R = 0

//展开得到如下式子

=>D ·D ·t ·t + 2·OC·D ·t + OC·OC - R·R = 0

=> (D ·D )·t ·t + 2·(OC·D )·t + OC·OC - R·R = 0

因为 D 是单位向量有D·D = dot(D, D) = 1最后方程为:

t·t + 2·(OC·D)·t + OC·OC - R·R = 0;

这是一个关于 t 的二次方程at^2 + bt + c = 0那么解就已经出来了: ∙

∙ t0 = -(b + √Δ) / 2a t1 = -(b - √Δ) / 2a

o

o

o

o a = D·D = dot(D, D) = 1; b = 2·OC·D = 2·dot(OC, D); c = OC·OC - R·R = dot(OC, OC) - R·R; 判别式 Δ = sqr(b) - 4ac

= 4·sqr( OC·D ) - 4·( OC·OC - R·R )

= 4·( sqr( OC·D ) - OC·OC + R·R );

如果判别式 Δ > 0,则表明球与射线相交。 根据以上方程,我们其中试着展开 t 的式子

t0 = -(b + √Δ) / 2a = -(b + √Δ) / 2·1

= -b/2 - √(Δ/4)

= -dot(OC, D) - √( sqr( dot(OC, D) ) - dot(OC, OC) + R·R ) 求出 t 后可以根据 P(t) = O + D * t 得到交点。

附代码

bool Intersect (const Ray& ray, const Sphere& sphere, float & t0, float & t1) {

Vector3 oc = ray.GetOrigin() - sphere.GetCenter();

float dotOCD = dot(ray.GetDirection(), oc);

if (dotOCD >0)

return false;

float dotOC = dot(oc, oc);

float discriminant = dotOCD*dotOCD - dotOC + sphere.GetRadiusSquare();

if (discriminant

return false;

elseif (discriminant

t0 = t1 = -dotOCD;

else

{

discriminant = sqrt (discriminant);

t0 = -dotOCD - discriminant;

t1 = -dotOCD + discriminant;

if (t0

t0 = t1;

}

return true;

}

补充一些内容:

交点的法线

因为交点在球面上,球面法线反向是从球心指向球面的点。 设交点为 IntersecionP ,只需要简单的计算:

normal = ( IntersectionP - sphere.GetCenter() ).Normalize ();

射线与球的相交

字数1183 阅读142 评论0 喜欢1

今天来说说射线和球的相交检测。

从图形来说

![射线和圆相交, origin 是射线起点, dir 是射线的方向向量。p0,p1是两个交点,center 为圆心,半径为R ,d 为圆心到射线的距离][ray-sphere] 我们先以2D 切面图来说明,当射线和圆相交的时候,可以看到,球心 center 到射线 ray 的距离 d

1. 设圆心在射线上的投影为c' ,则 origin ,center, c' 形成了一个直角三角形。

2. 获得射线起点到圆心的向量 Voc = Vcenter - Vorigin

3. 在射线方向上的投影为: Poc= Voc·(Voc·dir)

4. 勾股定理:d·d = Voc·Voc - Poc·Poc

可以求出d 的数值,

∙ d R,射线在圆外,没有交点。

接下来求P0,P1:

1. c' ,center ,P0 or P1点构成直角三角形。

2. P0 or P1到c' 的距离 tca·tca = R·R - d·d;

3. 有如下式子 P0 = dir·( |Poc| - tca );

P1 = dir·( |Poc| + tca );

要注意,没有交点的时候, tca·tca

推导三维情况可以照上面的去做,dot 能保证投影点在同一个平面上的。 附代码

bool Intersect (const Ray& ray, const Sphere& sphere, float & t0, float & t1) {

Vector3 oc = sphere.GetCenter() - ray.GetOrigin();

float projoc = dot(ray.GetDirection(), oc);

if (projoc

return false;

float oc2 = dot(oc, oc);

float distance2 = oc2 - projoc * projoc;

if (distance2 > sphere.GetRadiusSquare())

return false;

float discriminant = sphere.GetRadiusSquare() - distance2;

if (discriminant

t0 = t1 = projoc;

else

{

discriminant = sqrt (discriminant);

t0 = projoc - discriminant;

t1 = projoc + discriminant;

if (t0

t0 = t1;

}

return true;

}

从方程角度来看

射线方程:ray : P(t) = O + D·t ( t >= 0 )

球的方程:sphere : sqr( P-C ) = R·R (sqr(x) = x^2 = x·x)

O=origin, D=direction, C=center, R=radius

射线方程表明的是如下一个点的集合P ,当t 从零增大时, D·t 会沿着D 向量的方向从零逐步变长,t 取值无限表示了射线单方向。从O 点开始在D 方向上无限个点构成了一条射线。

球的方程表明了任何点P ,只要到C 点的距离等于半径R ,则表明点在球面上,这么一个球面上的点的集合。

因此当射线与球相交的时候,这个点既在射线上,又在球面上。等式射线的P(t) = 球的P 成立。

联立两个方程,试着求解 t 有:

s qr( O + D·t - C ) = R·R

设 O-C=OC,有:

sqr( OC+D·t ) - R·R = 0

//展开得到如下式子

=>D ·D ·t ·t + 2·OC·D ·t + OC·OC - R·R = 0

=> (D ·D )·t ·t + 2·(OC·D )·t + OC·OC - R·R = 0

因为 D 是单位向量有D·D = dot(D, D) = 1最后方程为:

t·t + 2·(OC·D)·t + OC·OC - R·R = 0;

这是一个关于 t 的二次方程at^2 + bt + c = 0那么解就已经出来了: ∙

∙ t0 = -(b + √Δ) / 2a t1 = -(b - √Δ) / 2a

o

o

o

o a = D·D = dot(D, D) = 1; b = 2·OC·D = 2·dot(OC, D); c = OC·OC - R·R = dot(OC, OC) - R·R; 判别式 Δ = sqr(b) - 4ac

= 4·sqr( OC·D ) - 4·( OC·OC - R·R )

= 4·( sqr( OC·D ) - OC·OC + R·R );

如果判别式 Δ > 0,则表明球与射线相交。 根据以上方程,我们其中试着展开 t 的式子

t0 = -(b + √Δ) / 2a = -(b + √Δ) / 2·1

= -b/2 - √(Δ/4)

= -dot(OC, D) - √( sqr( dot(OC, D) ) - dot(OC, OC) + R·R ) 求出 t 后可以根据 P(t) = O + D * t 得到交点。

附代码

bool Intersect (const Ray& ray, const Sphere& sphere, float & t0, float & t1) {

Vector3 oc = ray.GetOrigin() - sphere.GetCenter();

float dotOCD = dot(ray.GetDirection(), oc);

if (dotOCD >0)

return false;

float dotOC = dot(oc, oc);

float discriminant = dotOCD*dotOCD - dotOC + sphere.GetRadiusSquare();

if (discriminant

return false;

elseif (discriminant

t0 = t1 = -dotOCD;

else

{

discriminant = sqrt (discriminant);

t0 = -dotOCD - discriminant;

t1 = -dotOCD + discriminant;

if (t0

t0 = t1;

}

return true;

}

补充一些内容:

交点的法线

因为交点在球面上,球面法线反向是从球心指向球面的点。 设交点为 IntersecionP ,只需要简单的计算:

normal = ( IntersectionP - sphere.GetCenter() ).Normalize ();


相关内容

  • 基于OPENGL的球体碰撞动画模拟
  • 该文各种抄袭被挂了 基于OpenGL 的球体碰撞动画模拟 摘要 虚拟现实的时代到来了,在各大领域飞速发展的今天,三维动画技术也随之飞速的发展.本文通过实现设计出一个虚拟的动画来模拟球体碰撞效果,从而来研究真实场景中问题运动情况. 球体的运动设计到许多物理知识,同时还要运动数学和力学相关知识.在球体碰 ...

  • 图形和相交线
  • 图形初步认识和相交线与平行线学案 姓名: 日期: (一)几何图形 1. 几何图形 ⎧平面图形:矩形.圆.三角形.梯形等 (1) 分类:几何图形⎨ 立体图形:球.三棱柱.六棱锥.圆锥.正方体等⎩ (2) 常见的立体图形:常见的立体图形有柱体.椎体.球体. ① 常见的柱体: 棱柱.圆柱. ② 常见的椎体 ...

  • 高中数学必修二知识点总结
  • 高中数学必修二 第一章 空间几何体 1.1棱柱 1.2棱锥(几何特征:侧面.对角面都是三角形:平行于底面的截面与底面相似,其相似比等于顶点到截面距离与高的比的平方.) 1.3棱台(定义:用一个平行于棱锥底面的平面去截棱锥,截面和底面之间的部分.几何特征:侧棱交于原棱锥的顶点) 1.4圆柱 1.5圆锥 ...

  • 高中数学必修2知识点
  • 高中数学必修2知识点 一.直线与方程 (1)直线的倾斜角 定义:x 轴正向与直线向上方向之间所成的角叫直线的倾斜角. 特别地, 当直线与x 轴平行或重合时, 我们规定它的倾斜角为0度. 因此, 倾斜角的取值范围是0°≤α<180° (2)直线的斜率 ①定义:倾斜角不是90°的直线, 它的倾斜角 ...

  • 浙教版初一数学(上)教学内容整理
  • 第一章:从自然数到有理数 有理数的定义:整数和分数统称有理数 自然数的用法:计数.测量.标号.排序 自然数的分类 按正有理数.零.负有理数分 按整数.分数分 正整数 正有理数 正整数 正分数 整数 零 负整数 自然数 零 自然数 负整数 正分数 负和理数 分数 负分数 负分数 数轴 概念:规定了原点 ...

  • 人教版数学必修二知识点总结
  • 第一章 立体几何初步 1.柱.锥.台.球的结构特征 (1)棱柱:定义:两个面互相平行,其余各面都是四边形,且每相邻两个四边形的公共边都互相平行的几何体. 分类:以底面多边形的边数作为分类的标准分为三棱柱.四棱柱.五棱柱等. 表示:用各顶点字母,如五棱柱ABCDE -A B C D E 或用对角线的端 ...

  • 高二数学_立体几何的概念.公理.定理
  • 立体几何的概念.公理.定理 公理.定理,并根据图形写出它们的条件与结论. (一)立体几何三公理 公理1:如果一条直线上的两点在一个平面内,那么这条直线上的所有的点都在这个平面内. 公理2:如果两个不重合的平面有一个公共点,那么它们有且只有一条通过这个点的公共直线. P ∈α,且P ∈β推出α交β=l ...

  • 高一数学必修2知识点1
  • 高中数学必修2知识点 一.直线与方程(1)直线的倾斜角 定义:x 轴正向与直线向上方向之间所成的角叫直线的倾斜角.特别地,当直线与x 轴平行或重合时, 我们规定它的倾斜角为0度.因此,倾斜角的取值范围是0°≤α<180° (2)直线的斜率 ①定义:倾斜角不是90°的直线,它的倾斜角的正切叫做这 ...

  • 初一数学知识点总结
  • 初一(七年级) 上册数学知识点:一元一次方程 2013-07-08 17:14来源:互联网 作者:佚名 ∙ ∙ ∙ ∙ ∙ [ 标签: 知识点 初一上册数学 ] 五.知识点.概念总结 1. 一元一次方程:只含有一个未知数,并且未知数的次数是1,并且含未知数项的系数不是零的整式方程是一元一次方程. 2 ...