在3D中两条射线的相交性检测
摘自[3D数学基础: 图形与游戏开发]
考虑在3D中两条以参数形式定义的射线:
\(\vec{r_1}(t_1)=\vec{p_1}+t_1\vec{d_1}\)
\(\vec{r_2}(t_2)=\vec{p_2}+t_2\vec{d_2}\)
我们能够解得它们的交点。暂时先不考虑\(t_1,t_2\)的取值范围。因此,我们考虑的是无限长的射线;同样,向量\(\vec{d_1},\vec{d_2}\)也不必是单位向量。如果这两条射线在一个平面中,那么和前一节的情况一样,也存在有一种可能性:
- 两条射线交于一点;
- 两条射线平行,没有交点;
- 两条射线重合,有无限多交点。
在3D中,还有第四种可能性:两条射线不在一个平面中。
下面演示如何解得交点处的\(t_1,t_2\):
\(\vec{r_1}(t_1)=\vec{r_2}(t_2)\)
\(\Rightarrow \vec{p_1}+t_1\vec{d_1}=\vec{p_2}+t_2\vec{d_2}\)
\(\Rightarrow t_1\vec{d_1}=\vec{p_2}+t_2\vec{d_2}-\vec{p_1}\)
\(\Rightarrow (t_1\vec{d_1})\times\vec{d_2} =(\vec{p_2}+t_2\vec{d_2}-\vec{p_1})\times\vec{d_2}\)
\(\Rightarrow t_1(\vec{d_1}\times\vec{d_2}) =t_2(\vec{d_2}\times\vec{d_2})+(\vec{p_2}-\vec{p_1})\times\vec{d_2}\)
\(\Rightarrow t_1(\vec{d_1}\times\vec{d_2}) =t_2\vec{0}+(\vec{p_2}-\vec{p_1})\times\vec{d_2}\)
\(\Rightarrow t_1(\vec{d_1}\times\vec{d_2})\cdot(\vec{d_1}\times\vec{d_2}) =(\vec{p_2}-\vec{p_1})\times\vec{d_2}\cdot(\vec{d_1}\times\vec{d_2})\)
\(\Rightarrow t_1 =\cfrac{(\vec{p_2}-\vec{p_1})\times\vec{d_2}\cdot(\vec{d_1}\times\vec{d_2})}{(\vec{d_1}\times\vec{d_2})\cdot(\vec{d_1}\times\vec{d_2})}\)
\(\Rightarrow t_1 =\cfrac{(\vec{p_2}-\vec{p_1})\times\vec{d_2}\cdot(\vec{d_1}\times\vec{d_2})}{\Vert\vec{d_1}\times\vec{d_2}\Vert^2}\)
也可以用类似的方法求出\(t_2\):
\(t_2 =\cfrac{(\vec{p_1}-\vec{p_2})\times\vec{d_1}\cdot(\vec{d_2}\times\vec{d_1})}{\Vert\vec{d_2}\times\vec{d_1}\Vert^2}\)
\(\Rightarrow t_2 =\cfrac{(\vec{p_2}-\vec{p_1})\times\vec{d_1}\cdot(\vec{d_1}\times\vec{d_2})}{\Vert\vec{d_1}\times\vec{d_2}\Vert^2}\)
如果两条射线平行或重合,\(\vec{d_1},\vec{d_2}\)的叉乘为零,所以上面两个等式的分母都为零。如果两条射线不在一个平面内,那么\(\vec{r_1}(t_1),\vec{r_2}(t_2)\)是相距最近的点。通过检查\(\vec{r_1}(t_1),\vec{r_2}(t_2)\)间的距离即可确定两条射线相交的情况。当然,在实践中,因为浮点数的精度问题,精确的相交很少出现,这时就需要用到一个偏差值。
上面的讨论假设没有限定\(t_1,t_2\)的取值范围,如果射线的长度有限(或只沿一个方向沿伸),在计算出\(t_1,t_2\)后,还应作适当的边界检测。
在3D中两条射线的相交性检测的更多相关文章
- AABB和平面的相交性检测
[AABB和平面的相交性检测]
- SqlServer表中两条全然同样的记录,怎样删除当中1条
描写叙述:表无主键ID,误插入两遍数据,怎样删除内容同样的记录,而仅仅留下1条. SELECT DISTINCT * INTO #temp FROM grade; DROP TABLE grade; ...
- C# 判断两条直线是否相交
直接上代码,过程不复杂 /// <summary> /// 判断两条线是否相交 /// </summary> /// <param name="a"& ...
- cocos2d-x 判断两条直线是否相交
bool GraphicsUtil::linesCross(b2Vec2 v0, b2Vec2 v1, b2Vec2 t0, b2Vec2 t1, b2Vec2 &intersectionPo ...
- 【sql】mysql数据库做两条数据替换的操作,不使用第三方变量
需求: 1.将数据库中两条数据中的唯一约束列 做值的替换 原始思想: 将两条数据查出来,在程序中设置第三方变量,进行两条数据的替换,然后将原始两条数据删除,将新的两条替换后的数据插入. 新思想: 1 ...
- [SQL]开启事物,当两条插入语句有出现错误的时候,没有错误的就插入到表中,错误的语句不影响到正确的插入语句
begin transaction mustt insert into student values(,'kkk','j大洒扫','j','djhdjh') insert into student v ...
- 关于Unity中NGUI的3D角色血条的实现
首先要到Unity的Assets Store里面去下载一个扩展的Package叫NGUI HUD Text v1.13(81),注意如果没有安装NGUI就必须先安装NGUI插件,否则会用不了,因为HU ...
- c编程:求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和。
//求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和 #include <stdio.h> int main() { int sum=0; int max, ...
- 一条SQL语句查询两表中两个字段
首先描述问题,student表中有字段startID,endID.garde表中的ID需要对应student表中的startID或者student表中的endID才能查出grade表中的name字段, ...
随机推荐
- LINUX-磁盘空间
df -h 显示已经挂载的分区列表 ls -lSr |more 以尺寸大小排列文件和目录 du -sh dir1 估算目录 'dir1' 已经使用的磁盘空间' du -sk * | sort -rn ...
- 程序员如何在百忙中更有效地利用时间,如何不走岔路,不白忙(忙得要有效率,要有收获)-----https://www.cnblogs.com/JavaArchitect/p/9080484.html
https://www.cnblogs.com/JavaArchitect/p/9080484.html 程序员如何在百忙中更有效地利用时间,如何不走岔路,不白忙(忙得要有效率,要有收获)
- Oracle 关于几个随机函数sys_guid、dbms_random.random、dbms_random.value(取随机的结果集)
sys_guid():SYS_GUID (),是Oracle 8i 后提供的函数.SYS_GUID产生并返回一个全球唯一的标识符(原始值)由16个字节组成.更适合多个数据库数据集成时使用(--源自百度 ...
- 常州模拟赛d5t3 appoint
分析:这道题比较奇葩.因为字符串没有swap函数,所以一个一个字符串交换只有30分.但是我们可以不用直接交换字符串,而是交换字符串的指针,相当于当前位置是哪一个字符串,每次交换int,可以拿60分. ...
- noip模拟赛 蒜头君的坐骑
分析:标准的棋盘dp问题. 如果没有技能,那么就很好做了,相当于传纸条的做法.有了技能的限制,我们就要加上一维表示用了多少次技能,这个时候转移就要用到dfs了,而且不能用填表法,要用刷表法,从当前位置 ...
- Spring 进行junit单元测试时,出现method ‘initializationError’ 错误
首先检查一下所有的方法是否为public 然后看是否有commons-logging这个日志包
- 为 Windows Phone 8.1 app 解决“The type does not support direct content.”的问题
我在 VS 14 CTP 中新建了一个空的 app store 项目名叫 PlayWithXaml ,项目的 MainPage.xaml 文件改为了以下内容: <Page x:Class=&qu ...
- 20181010关于pt-kill自动杀死运行超长的进程
转自: http://blog.chinaunix.net/uid-16844903-id-4442030.htmlhttp://blog.chinaunix.net/uid-31396856-id- ...
- W3School Redis教程(安装/基本操作/高级操作/命令/官方文档/官方集群教程)
说明:Redis有自身的客户端连接软件,也可以使用Telnet进行连接操作. 来自W3School的Redis教程,基本上涵盖了从安装到状态监控的教程. W3School:https://www.gi ...
- Tomcat配置文件server.xml(转)
前言 Tomcat隶属于Apache基金会,是开源的轻量级Web应用服务器,使用非常广泛.server.xml是Tomcat中最重要的配置文件,server.xml的每一个元素都对应了Tomcat中的 ...