游戏开发论坛

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

求射线和面的交点

[复制链接]

9

主题

23

帖子

28

积分

注册会员

Rank: 2

积分
28
发表于 2004-6-29 22:04:00 | 显示全部楼层 |阅读模式

1.        射线的表示方法
p(t) = p0 + tu;
其中p0是射线的起始点,u是射线的方向向量(需要单位化),t在[0,+无穷]
2.        面的表示方法
由上图可以知道
n(p-p0) = 0;
设d = -np0
所以有:np+d = 0;为平面方程,其中p为平面上的任意一点,n为平面的单位法向量,
如果空间中一点Px,如果nPx + d = 0,那么Px在(np+d=0)表示的平面上,如果大于0,该点在平面的上面(法线所指的方向),如果小于0,该点在平面的下面。

3.求射线和平面的交点

要求利用上面所介绍的射线和面的交点只要把p(t)代入(np+d=0)这个方程,这样我们就得到
np(t)+d=0;
n(p0+tu)+d=0;
np0+tnu+d=0;
t=(-d-np0)/nu;
如果t大于等于0说明射线和面有交点,根据p(t)=p0+tu;(p0为已知量,t已经求得)。
(详细参考附件)

sf_200462922435.rar

50.76 KB, 下载次数:

2

主题

10

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2004-6-30 14:29:00 | 显示全部楼层

Re:求射线和面的交点

好东东。谢谢了

89

主题

4036

帖子

4132

积分

论坛元老

Rank: 8Rank: 8

积分
4132
发表于 2004-6-30 17:05:00 | 显示全部楼层

Re:求射线和面的交点

        bool InterSection(XRay& ray,XPlan& plan,XPoint& point,float & t)
        {
                t = 0;

                /***

                -D - P0 * N(A,B,C)
                t = --------------------
                d * N(A,B,C)

                其中D 为平面方程中的D,
                P0为射线的起点。而 d 为射线的方向

                **/
                t= -(plan.D  + ray.m_Point.x * plan.A + ray.m_Point.y * plan.B + ray.m_Point.z * plan.C);
                float t2 = (ray.m_Dir.x * plan.A + ray.m_Dir.y * plan.B + ray.m_Dir.z * plan.C) ;

                if(t2 == 0.00)
                        return false;

                t /= t2;


                //求出交点
                point  = ray.m_Point + ray.m_Dir * t;

                if( t < 0)
                        return false;

                return true;
        }

89

主题

4036

帖子

4132

积分

论坛元老

Rank: 8Rank: 8

积分
4132
发表于 2004-6-30 17:08:00 | 显示全部楼层

Re:求射线和面的交点

        bool    InterSection(XRay& ray,XTriangle& tri,XPoint& point,float & t)
        {

                XVector3D v1 = tri.m_points[1] - tri.m_points[0];
                XVector3D v2 = tri.m_points[2] - tri.m_points[0];

                XVector3D n = v1.cp(v2);
                /**********************************************************************
                ray = p0 + D * t
                Tri : p1 - p3

                (P2-P1) X (P3-P1) = N

                N * (P - P1) = 0  ===>
                N * (P0 + D * t - P1)  = 0

                ==>

                N * (P0 - P1) + N * D * t = 0;
                (P1-P0) * N
                t = ----------------------
                D * N
                ******************************************************************/
                t = n.dp(tri.m_points[0] - ray.m_Point);
                t /= (ray.m_Dir.dp(n));
                if( t < 0)
                        return false;

                //求出交点
                point  = ray.m_Point + ray.m_Dir * t;

                //判断点是不是在三角内部
                v1 = point - tri.m_points[0];
                v2 = point - tri.m_points[1];
                XVector3D v3 = point - tri.m_points[2];

                n = v1.cp(v2);
                XVector3D n1 = v2.cp(v3);

                if(n.isZero())
                        return true;
                if(n1.isZero())
                        return true;

                if( n.x * n1.x <= 0 )
                        return false;
                if( n.y * n1.y <= 0 )
                        return false;
                if( n.z * n1.z <= 0 )
                        return false;

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

本版积分规则

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

GMT+8, 2025-7-3 00:15

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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