一.神奇的公式
有平面三角形点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当距离来说,得到的肯定是正值。