游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1972|回复: 1

【求助】:关于一篇射线与三角形检测的文章,有些地方

[复制链接]

2

主题

9

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2008-8-9 11:05:00 | 显示全部楼层 |阅读模式
源贴地址:http://blog.163.com/bp_dragon/blog/static/12859469200642146120/

不是很明白,一开始的公式IntersectPoint = V1 + U*(V2-V1) + V*(V3-V1)是如何弄出来的


2..2.2射线三角面相交的数学算法
     使用d3d扩展函数,毕竟有时不能满足具体需求,掌握了该方法,我们才能够获得最大的控制自由度,任意修改算法。   

已知条件: 射线源点orginPoint,三角形三个顶点 v1,v2,v3,射线方向 Dir(均以三维坐标向量形式表示)
算法目的: 判断射线与三角形是否相交,如果相交求出交点的重心坐标(U,V)和射线原点到交点的距离T。


我们可先假设射线与三角形相交则交点(注以下均为向量运算,*数乘,dot(X,Y) X,Y 点乘,cross(X,Y)X,Y叉乘;U,V,T为标量)
则:
IntersectPoint = V1 + U*(V2-V1) + V*(V3-V1) ;
IntersectPoint = originPoint + T*Dir;


所以
orginPoint + T*Dir = V1 + U*(V2-V1) + V*(V3-V1);
整理得:http://img354.photo.163.com/bp_dragon/44248106/1184350068.jpg

这是一个简单的线性方程组,若有解则行列式不为0。
根据T,U,V的含义当T>0, 0<U<1,0<V<1,0<U+V<1时该交点在三角形内部,
解此方程组即可获得我们关心的值,具体解法不再赘述,克莱姆法则就够了(详细见线性代数):射线原点到相交点的距离T,和交点的中心坐标(U,V)。
下面给出Direct 9 SDK示例程序中的实现代码
IntersectTriangle( const D3DXVECTOR3& orig,const D3DXVECTOR3& dir, D3DXVECTOR3& v0,
                   D3DXVECTOR3& v1, D3DXVECTOR3& v2,
                   FLOAT* t, FLOAT* u, FLOAT* v )
{
    // 算出两个边的向量
    D3DXVECTOR3 edge1 = v1 - v0;
    D3DXVECTOR3 edge2 = v2 - v0;
    D3DXVECTOR3 pvec;
    D3DXVec3Cross( &pvec, &dir, &edge2 );

    // 如果det为0,或接近于零则射线与三角面共面或平行,不相交
//此处det就相当于上面的,

    FLOAT det = D3DXVec3Dot( &edge1, &pvec );
    D3DXVECTOR3 tvec;
    if( det > 0 )
    {
        tvec = orig - v0;
    }
    else
    {
        tvec = v0 - orig;
        det = -det;
    }
    if( det < 0.0001f )
        return FALSE;

    // 计算u并测试是否合法(在三角形内)
    *u = D3DXVec3Dot( &tvec, &pvec );
    if( *u < 0.0f || *u > det )
        return FALSE;

    // Prepare to test V parameter
    D3DXVECTOR3 qvec;
    D3DXVec3Cross( &qvec, &tvec, &edge1 );

    //计算u并测试是否合法(在三角形内)
    *v = D3DXVec3Dot( &dir, &qvec );
    if( *v < 0.0f || *u + *v > det )
        return FALSE;

    /*计算t,并把t,u,v放缩为合法值(注意前面的t,v,u不同于算法描述中的相应量,乘了一个系数det),注意:由于该步运算需要使用除法,所以放到最后来进行,避免不必要的运算,提高算法效率*/
    *t = D3DXVec3Dot( &edge2, &qvec );
    FLOAT fInvDet = 1.0f / det;
    *t *= fInvDet;
    *u *= fInvDet;
    *v *= fInvDet;

    return TRUE;
}

2

主题

9

帖子

13

积分

新手上路

Rank: 1

积分
13
 楼主| 发表于 2008-8-9 11:17:00 | 显示全部楼层

Re:【求助】:关于一篇射线与三角形检测的文章,有些地

忽然明白了。谢谢大家。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-21 17:53

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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