美文网首页
三维模型射线拾取

三维模型射线拾取

作者: aibinMr | 来源:发表于2020-02-21 12:20 被阅读0次

    这篇文档大部分内容来源于网络,我只是加入了一些原文档省去的换算上的内容,由于我在这些地方卡住了很久,所以我把我认为对大家有用的内容补充上,方便初学者学习

    概述

    射线和三角形的相交检测是游戏程序设计中一个常见的问题,最典型的应用就是拾取(Picking),本文介绍一个最常见的方法,这个方法也是DirectX中采用的方法,该方法速度快,而且存储空间少。先讲述理论,然后给出对应的代码实现。

    image
    image

    理论部分

    一个直观的方法

    我想大多数人在看到这个问题时,可能都会想到一个简单而直观的方法:首先判断射线是否与三角形所在的平面相交,如果相交,再判断交点是否在三角形内。

    判断射线是否与平面相交

    判断点是否在三角形内

    但是,上面的方法效率并不很高,因为需要一个额外的计算,那就是计算出三角形所在的平面,而下面要介绍的方法则可以省去这个计算。

    本文的方法

    接下来会涉及到一些数学知识,不过没关系,我会详细解释每一个步骤,不至于太晦涩,只要您不觉得烦就行了,好了开始!

    射线的参数方程如下,其中O是射线的起点,D是射线的方向。

    image

    我们可以这样理解射线,一个点从起点O开始,沿着方向D移动任意长度,得到终点R,根据t值的不同,得到的R值也不同,所有这些不同的R值便构成了整条射线,比如下面的射线,起点是P0,方向是u,p0 + tu也就构成了整条射线。

    image

    三角形的参数方程如下,其中V0,V1和V2是三角形的三个点,u, v是V1和V2的权重,1-u-v是V0的权重,并且满足u>=0, v >= 0,u+v<=1。

    image

    确切的说,上面的方程是三角形及其内部所有点的方程,因为三角形内任意一点都可以理解为从顶点V0开始,沿着边V0V1移动一段距离,然后再沿着边V0V2移动一段距离,然后求他们的和向量。至于移动多大距离,就是由参数u和v控制的。

    image

    于是,求射线与三角形的交点也就变成了解下面这个方程-其中t,u,v是未知数,其他都是已知的

    image

    \color{red}{注:下面两张图是我补充上来的,主要是为了让初学者了解等式换算过程}

    image.png
    image.png

    移项并整理,将t,u,v提取出来作为未知数,得到下面的线性方程组,此处主要涉及的是矩阵的乘法,

    image

    \color{red}{注:下面这张图是我补充上去的,主要是告诉大家上面矩阵相乘后的数学公式}

    image.png

    现在开始解这个矩阵方程组,这里要用到两个知识点,一是克莱姆法则,二是向量的混合积。

    令E1 = V1 - V0,E2 = V2 - V0,T = O - V0上式可以改写成

    image image.png

    根据克莱姆法则,可得到t,u,v的解分别是

    \color{red}{注:下面两张图是我补充上来的,主要是说明一下克莱姆法则的换算公式,其实细心点的人会发现,}
    \color{red}{根据我提供的换算公式可能根本就不需要上面中间的矩阵公式做中间换算,没办法原作者是这样写的,}
    \color{red}{要尊重原作者,也可能我不了解原作者的高深用意}

    image.png
    image.png image

    将这三个解联合起来写就是

    image

    根据混合积公式

    image

    \color{red}{注:下面这张图是我补充的,向量的混合积参考公式}

    image.png

    上式可以改写成

    image

    image

    得到最终的公式,这便是下面代码中用到的最终公式了,之所以提炼出P和Q是为了避免重复计算

    image

    相关文章

      网友评论

          本文标题:三维模型射线拾取

          本文链接:https://www.haomeiwen.com/subject/uilqqhtx.html