游戏开发论坛

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

射线与三角行

[复制链接]

31

主题

104

帖子

108

积分

注册会员

Rank: 2

积分
108
发表于 2005-11-2 01:28:00 | 显示全部楼层 |阅读模式
本人在写鼠标射线与地形碰撞时遇到这个问题,请各位指教,已知射线与平面相交点的坐标,怎么算出这个点在不在平面上的一个三角形里面(该三角形为非直角),谢谢!

65

主题

225

帖子

232

积分

中级会员

Rank: 3Rank: 3

积分
232
发表于 2005-11-2 09:43:00 | 显示全部楼层

Re:射线与三角行

BOOL IntersectTriangle( const D3DXVECTOR3& orig,
                                       const D3DXVECTOR3& dir, D3DXVECTOR3& v0,
                                       D3DXVECTOR3& v1, D3DXVECTOR3& v2,
                                       FLOAT* t, FLOAT* u, FLOAT* v ,D3DXVECTOR3 *pOut=NULL)
{
    // Find vectors for two edges sharing vert0
    D3DXVECTOR3 edge1 = v1 - v0;
    D3DXVECTOR3 edge2 = v2 - v0;

    // Begin calculating determinant - also used to calculate U parameter
    D3DXVECTOR3 pvec;
    D3DXVec3Cross( &pvec, &dir, &edge2 );

    // If determinant is near zero, ray lies in plane of triangle
    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;

    // Calculate U parameter and test bounds
    *u = D3DXVec3Dot( &tvec, &pvec );
    if( *u < 0.0f || *u > det )
        return FALSE;

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

    // Calculate V parameter and test bounds
    *v = D3DXVec3Dot( &dir, &qvec );
    if( *v < 0.0f || *u + *v > det )
        return FALSE;

    // Calculate t, scale parameters, ray intersects triangle
    *t = D3DXVec3Dot( &edge2, &qvec );
    FLOAT fInvDet = 1.0f / det;
    *t *= fInvDet;
    *u *= fInvDet;
    *v *= fInvDet;

        // 求交点
        D3DXVECTOR3 t_normal;
        D3DXVec3Cross( &t_normal, &edge1, &edge2 );//求法线

        D3DXVec3Normalize(&t_normal,&t_normal);//正规化

        float t_a=t_normal.x;
        float t_b=t_normal.y;
        float t_c=t_normal.z;
        float t_d=-D3DXVec3Dot(&t_normal,&v1);//求平面方程

        D3DXVECTOR3 t_dir;
        D3DXVec3Normalize(&t_dir,&dir);

        float t_t=(t_d-D3DXVec3Dot(&t_normal,&orig))/D3DXVec3Dot(&t_normal,&t_dir);//p=s+t*v;求t

        D3DXVECTOR3 t_point=orig+t_t*t_dir;
        if(pOut)*pOut=t_point;

        /*char t_char[255];
        sprintf(t_char,"x:%f,y:%f,z:%f\n",t_point.x,t_point.y,t_point.z);
        OutputDebugString(t_char);*/

    return TRUE;
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-22 11:49

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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