如何判断一个点是否在某个形状(2 维或 3 维)内部

本文分享了一种通过射线与图形或物体相交点数判断点位置的方法,包括射线与球面、隐式表面及显式表面的求交,以及使用轴对齐包围盒的优化技术,以减少计算量,适用于计算机图形学中的光线追踪。
摘要由CSDN通过智能技术生成

分享一个小技巧,如何判断一个点是否在某个形状内部,可以是 2 维空间的图形,也可以是 3 维空间的物体。

方法:

  1. 从这个点向任意方向做一条射线;
  2. 如果这条射线与图形或物体相交的点数为奇数个,说明点在图形内部;
  3. 如果相交点数为偶数个,说明点在图形外部。

举例:

2 维示意图,3 维同理:
在这里插入图片描述

数学表示:

首先解释射线与球面的求交方法,推广到射线与一般隐式表面的求交方法,之后再解释射线与显式表面的求交方法以及优化加速办法。

射线与球面求交

射线的数学表示:
在这里插入图片描述
球面的数学表示:
在这里插入图片描述
联立射线表达式与球面表达式求交点:
在这里插入图片描述
t 的解可能有一个解、有两个解,或者无解,分别对应以下几种情况:
在这里插入图片描述
类似还可以推广到一般的隐式表面求解的情况。

一般隐式表面与射线求交点

一般隐式表面与射线的表达式:
在这里插入图片描述
联立隐式表面与射线表达式:
在这里插入图片描述
解出 t,t 要满足:

  1. 正数
  2. 实数
    即为射线与隐式表面交点。

下面解释显示表面与射线的求交点方法:

显示表面与射线求交点:

首先从简单的思路引入,就是射线与全部三角形面逐个计算,判断是否相交,逐个计算交点,原始的思路是:

  1. 射线与三角形的所在平面进行求交(这里忽略射线正好与三角形面平行的情况)
  2. 判断交点是否在三角形内(之前文章解释过)

按照这种思路,首先定义平面的表达式,这里用法向量 N 和平面内的一点 P’ 来表示:
在这里插入图片描述
与射线方程联立:
在这里插入图片描述
解得:
在这里插入图片描述
再将得到得交点与三角形判断是否在三角形内即可。
优化1,下面介绍一种能够一步操作就得出交点是否在三角形内得方法。
在这里插入图片描述
主要思想是利用重心坐标(后边会补充文章介绍)与射线表达式联立,解出参数 t, b1, b2,根据解判断交点是否在三角形内,如下:
在这里插入图片描述
其中, t, b1, b2 的解法如下:
在这里插入图片描述
这样就能够一步判断射线与三角形的交点是否在三角形内了,但是如果对物体的每个三角形面都进行逐个计算的话,计算量是非常大的,每个像素都要对每个三角形面计算,下面进行加速优化:

优化2:使用轴对齐包围盒进行加速。

首先从二维引入:
这里射线与两个坐标轴方向的轴线分别相交,可以得到 tmin 和 tmax,再将两个轴向求出的 tmin 和 tmax 取交集,就得到了与二维包围盒的交点 tmin 和 tmax, 如下图所示:
在这里插入图片描述
拓展到三维情况下,包围盒可以看成三组对面夹出来的区域,按照以下的思路可以得到进入包围盒和离开包围盒的 t 。

  1. 只有全部对面都进入了,射线才进入到了盒子里;
  2. 只要射线离开了任何一对面,就说明已经离开了包围盒。

所以,盒子的进入时的 tenter,以及离开包围盒时的 texit,分别为:
在这里插入图片描述
讨论 t 为负数的情况:

  1. texit < 0 : 盒子在射线的背后,不可能有交点;
  2. texit > 0, tenter < 0 : 射线起点在盒子里面,一定有交点。

所以,当且仅当 tenter < texit && texit >= 0 的时候,射线和轴对齐包围盒有交点。

参考自:GAMES101-现代计算机图形学入门-闫令琪,第十三课,光线追踪1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值