如何求三角形和线的交点.InterSection函数

这个算法来自微软DirectX SDK.兰幽草推荐的.
基本算法都想明白了。就是那个t 为什么没有负号.我还没有想明白.不知道为什么
不过结果基本已经正确了。应该比较好用的。

 bool InterSection(XRay& ray,XTriangle& tri,XPoint& point,float& t, float& u, float& v )
 {
  // Find vectors for two edges sharing vert0
  /***

  三角形为 v1,v2,v3
  两条边为  e1 = v2-v1   e2 = v3 - v1
  射线为    ray = p0 + d * t
  三角形内部的一点 p = v1 + u * e1 + v * e2  (  u+v<1)

  所以:
  v1 + u * e1 + v * e2 = p0 + d * t              ===>
  u * e1 + v * e2 - t * d = p0 - v1              ===>
  - t * d  + v * e2 +  u * e1  = p0 - v1         ===>

                |  d.x   d.y    d.z    |
  [-t,v,u]  |  e2.x  e2.y   e2.z |   = p0 - p1  ===>
                |  e1.x  e1.y   e1.z |


  [-t,v,u] * M  = p0 - p1 ;


  [-t,v,u] = (p0 - p1) * Inv(M);


  t  = (p0 - p1) * e1 X e2 / Det(M) =  (p0 - p1) X e1 * e2 / Det(M)

  v  = (p0 - p1) * e1 X d  / Det(M) =  (p0 - p1) X e1 * d  / Det(M)

  u  = (p0 - p1) * d X e2  / Det(M)

  **/
  XVector3D e1  = tri.m_points[1] - tri.m_points[0];
  XVector3D e2  = tri.m_points[2] - tri.m_points[0];


  //求出矩阵 M 的 det(M)。并记录 d x e2;
  XVector3D vCP_dir_e2;
  ray.m_Dir.cp(e2,vCP_dir_e2);

  //得到矩阵的行列式的值
  float det = e1.dp(vCP_dir_e2);

  //保存 (p0 - p1)
  XVector3D v_p0_p1;

  //为了判断方便。det = abs(det)
  if( det > 0 )
  {
   v_p0_p1 = ray.m_Point - tri.m_points[0];
  }
  else
  {
   v_p0_p1 = tri.m_points[0] - ray.m_Point  ;
   det = -det;
  }

  if( det < 0.0000001f )
   return false;

  // u  = (p0 - p1) * d X e2  / Det(M)  Det(M)以后再除
  u  = v_p0_p1.dp(vCP_dir_e2);
  if( u < 0.0f || u > det )
   return false;


  // 保存 (p0 - p1) X e1
  XVector3D vCP_p0p1_e1;
  v_p0_p1.cp(e1,vCP_p0p1_e1);

  // v  = (p0 - p1) * e1 X d  / Det(M) =  (p0 - p1) X e1 * d  / Det(M)
  // Det(M)以后再除

  v = ray.m_Dir.dp(vCP_p0p1_e1);
  if( v < 0.0f || u + v > det )
   return false;

  // Calculate t, scale parameters, ray intersects triangle
  t =  e2.dp(vCP_p0p1_e1);
  float fInvDet = 1.0f / det;
  t *= fInvDet;
  u *= fInvDet;
  v *= fInvDet;

  point = ray.m_Point + ray.m_Dir*t;

  return true;
 }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
HTML主要用于网页的结构和内容的呈现,无法直接进行线段和面的交点计算。需要结合JavaScript等编程语言来实现。 一种计算线段和面交点的方法是:首先判断线段是否与面相交,如果相交再计算交点。具体实现步骤如下: 1. 计算面的法向量。 2. 计算线段的方向向量。 3. 判断线段是否与面相交,如果不相交则直接结束。 4. 如果线段与面相交,则计算线段与面的交点。 下面是一个简单的JavaScript函数,用于计算线段和面的交点: ```javascript function getIntersection(lineStart, lineEnd, plane) { // 计算面的法向量 var normal = new Vector3(plane[0], plane[1], plane[2]); // 计算线段的方向向量 var direction = new Vector3( lineEnd[0] - lineStart[0], lineEnd[1] - lineStart[1], lineEnd[2] - lineStart[2] ); // 计算线段的起点到面的距离 var startDistance = normal.dot(lineStart) - plane[3]; // 计算线段的终点到面的距离 var endDistance = normal.dot(lineEnd) - plane[3]; // 如果线段的起点和终点都在面的同侧,则无交点 if (startDistance * endDistance > 0) { return null; } // 计算线段与面的交点 var t = startDistance / (startDistance - endDistance); var intersection = new Vector3( lineStart[0] + t * direction.x, lineStart[1] + t * direction.y, lineStart[2] + t * direction.z ); return intersection; } ``` 其中,lineStart和lineEnd分别为线段的起点和终点,plane为面的方程,包含4个参数:ax + by + cz + d = 0,分别表示面法向量的x、y、z分量和d值。函数返回线段和面的交点,如果无交点则返回null。 需要注意的是,该函数只能计算线段和平面的交点,如果要计算线段和三角形面的交点,需要先将三角形面拆分成三个平面,再分别计算交点
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值