- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
射线与球体相交
射线与球的相交字数1183?阅读142?评论0?喜欢1今天来说说射线和球的相交检测。从图形来说![射线和圆相交, origin是射线起点, dir是射线的方向向量。p0,p1是两个交点,center为圆心,半径为R,d为圆心到射线的距离][ray-sphere]我们先以2D切面图来说明,当射线和圆相交的时候,可以看到,球心 center 到射线 ray 的距离 d = R,这个即为相交的条件。那么射线与球相切就转化为了球心到射线的距离d的判断。先求出d:设圆心在射线上的投影为c,则 origin,center, c 形成了一个直角三角形。获得射线起点到圆心的向量?Voc = Vcenter - Vorigin在射线方向上的投影为:?Poc= Voc·(Voc·dir)勾股定理:d·d = Voc·Voc - Poc·Poc可以求出d的数值,d R,射线穿过圆,与圆有两个交点。d = R,射线与圆相切,有一个交点为切点。d R,射线在圆外,没有交点。接下来求P0,P1:c,center,P0 or P1点构成直角三角形。P0 or P1到c的距离 tca·tca = R·R - d·d;有如下式子P0 = dir·( |Poc| - tca );P1 = dir·( |Poc| + tca );要注意,没有交点的时候, tca·tca 0 是没办法开平方的推导三维情况可以照上面的去做,dot能保证投影点在同一个平面上的。附代码boolIntersect(const Ray ray, const Sphere sphere, float t0, float t1){ Vector3 oc = sphere.GetCenter() - ray.GetOrigin();float projoc = dot(ray.GetDirection(), oc);if (projoc 0)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 FLOAT_EPSILON) t0 = t1 = projoc;else { discriminant = sqrt(discriminant); t0 = projoc - discriminant; t1 = projoc + discriminant;if (t0 0) 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 有:sqr( 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 + √Δ) / 2at1 = -(b - √Δ) / 2aa = 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·
文档评论(0)