游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2392|回复: 3

InterSection 三角形和线的交点.

[复制链接]

89

主题

4036

帖子

4132

积分

论坛元老

Rank: 8Rank: 8

积分
4132
发表于 2004-6-27 14:43:00 | 显示全部楼层 |阅读模式
InterSection 三角形和线的交点. 能按两种方式给出参数其实u,v方式可以用来求纹理坐标
InterSection 三角形和线的交点.
这个算法来自微软DirectX SDK.兰幽草推荐的.
基本算法都想明白了。就是那个t 为什么没有负号.我还没有想明白.不知道为什么
不过结果基本已经正确了。应该比较好用的。

能按两种方式给出参数
其实u,v方式可以用来求纹理坐标

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;
}

50

主题

992

帖子

1012

积分

金牌会员

Rank: 6Rank: 6

积分
1012
发表于 2004-6-27 19:33:00 | 显示全部楼层

Re:InterSection 三角形和线的交点.

Great

50

主题

992

帖子

1012

积分

金牌会员

Rank: 6Rank: 6

积分
1012
发表于 2004-6-27 19:34:00 | 显示全部楼层

Re:InterSection 三角形和线的交点.

不过感觉有点麻烦不知道效率怎么样

3

主题

140

帖子

140

积分

注册会员

Rank: 2

积分
140
发表于 2004-6-29 15:21:00 | 显示全部楼层

Re:InterSection 三角形和线的交点.

good
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-7-17 07:10

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表