三角形与射线相交

    xiaoxiao2021-03-25  138

    一.神奇的公式

    有平面三角形点v0,v1,v2。p为该平面上的点则有

    其中u为三角形一边的比例,v为三角形另一边的比例,

    v0 + (v1 - v0) * u + (v2 - v0) * v  =  p

    根据方程解u v。之前有一个疑问,为什么一条公式可以解两个未知数?

    其实这是两条方程,平面向量有x y两个方向,这就可以解。

    方程的解有三类,有多解 无解 唯一解。

    当三角形为一条线,p在线上,则有无数解,p在线外则无解 否则有唯一解。

    如果p在三角形内则有解出来的u>=0 v>=0 (u+v)<=1

    二.公式延伸

    想到上面的计算,我想空间上也一样可以运用此公式

    如果在三维空间上的三角形点v0,v1,v2,与射线R(R为单位向量),O为射线起点有

    t为射线到三角形交点的距离

    v0 + (v1 - v0) * u + (v2 - v0) * v = R * t + O

    (v0 - O) + (v1 - v0) * u + (v2 - v0) * v = R * t

    简化名称  令 P = v0 - O

    有 P + (v1 - v0) * u + (v2 - v0) * v = R * t

    解方程,就可以得到 u v t 但在空间上 方程也未必一定有解

    1判断是否存在v0 v1 v2是一条线的情况

    是的话,情况变得复杂,这里不去细化

    2.判断三角形是不是跟射线的方向平行

    如果平行则无解 重叠则有无数解

    三.解方程

    P.x + M.x * u + N.x * v = R.x * t

    P.y + M.y * u + N.y * v = R.y * t

    P.z + M.z * u + N.z * v = R.z * t

    ①②消去t得到④

    P.x*R.y + M.x*u*R.y + N.x*v*R.y = P.y*R.x + M.y*u*R.x + N.y*v*R.x

    ①③消去t得到⑤

    P.x*R.z + M.x*u*R.z + N.x*v*R.z = P.z*R.x + M.z*u*R.x + N.z*v*R.x

    解④⑤ 可得u v

    //--------------------------------

    //分割线

    //--------------------------------

    //代码 //-------------------------------- //方程运算的初步结果1     float A = R.x * P.y - P.x * R.y;     float B = R.x * P.z - P.x * R.z;     float C = M.x * R.y - R.x * M.y;     float D = M.x * R.z - R.x * M.z;     float E = R.x * N.y - N.x * R.y;     float F = R.x * N.z - N.x * R.z;     //初步结果2, temp为分母     float temp = C * F - D * E;     vec3 facenormal = normalize(cross(M.xyz, N.xyz));     float parallel = dot(facenormal,R);//射线与三角形平行 则parallel=0     if(abs(parallel)>0.00001)     {//分母不为零      //计算出uv值      float u = (A * F - B * E) / temp;      float v = (A * D - B * C) / temp;     }

    补充很重要的一点,在计算出来点的坐标的时候,求t的时候,不要把t当成是距离。

    因为当射线与三角形相交的地方是射线的负方向时,如果把t当距离来说,得到的肯定是正值。

    转载请注明原文地址: https://ju.6miu.com/read-8214.html

    最新回复(0)