这个算法来自微软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;
}
分享到:
相关推荐
flex算两线交点 ExampleApplication1=new ExampleApplication(); // ExampleApplication1.showMessage( ); graphics.lineStyle(1, Math.random( ) * 0xffffff, 1); graphics.moveTo(Math.random( ) * 400, ...
射线和三角形的相交检测(ray triangle intersection test)
find_intersection 函数接收两个不同数据集的 x 和 y 坐标。 它使用线性插值来增加每组数据点的数量。 然后,它在用户定义的置信度(例如:1或2%)内找到交点。 该函数返回交点的 x 和 y 坐标以及一个表示交点...
求空间两直线交点-MATLAB代码+原理说明 原理.pdf —— 说明性文档 main_demo.m —— demo主程序,也就是一个示例 Intersection_of_TwoLines.m —— 求交点的函数
Intersection程序说明 该程序是应聘同豪土木工程咨询公司时出的一个小题目。 该程序使用Fortran编制,用于判断由空间四点表示的两直线是否相交,若相交则求出交点. 输入说明: 输入文件名为input.txt; 其中数据...
title: Python 集合的交集--intersection函数description: 本节课主要学习了:intersection函数交集的使用方法集合
该程序用matlab实现求两直线的交点,显示直线和交点坐标。
Pure numpy中两条曲线的交点从灵感matlab实现,写的如何检测两条曲线相交这个Python实现。示例用法 from intersect import intersectiona , b = 1 , 2phi = np . linspace ( 3 , 10 , 100 )x1 = a * phi - b * np . ...
求解一条直线和一个余弦的第一个交点,返回值为交点的横坐标
git@github.com:chrisk314/tet-plane-intersection.git cd tet-plane-intersect pip install . 计算交点 函数tet_plane_inter_tris_batch可用于tet_plane_inter_tris_batch计算四面体集合与平面之间的交集。 四面体...
曲线交点 贝塞尔曲线相交算法和实用程序。 提取自裁剪实现。 安装 npm install --save curve-intersection 用法 如果你的平台还不支持 es6,你可以require('curve-intersection/es3') 。 import { ...
请首先查看右侧的示例选项卡(.mlx 文件)以获取完整说明。 下载后,在 Matlab 控制台中键入“helplines_intersection”或“doclines_intersection”以获得支持。
求空间直线与平面的交点 已知直线L过点m(m1,m2,m3),且方向向量为VL(v1,v2,v3), 平面P过点n(n1,n2,n3),且法线方向向量为VP(vp1,vp2,vp3),求得直线与平面的交点O的坐标(x,y,z)
自己编写的利用利用二分法求两函数的交点的matlab代码,希望对大家有用
[x,y] = line_intersection([m1,b1],[m2,b2])返回交点 以斜线截距形式给出的两条线中的一条: [m1,b1]以斜率截距形式指定第一行: [m2,b2]指定斜线截距形式的第二行: [x,y] = line_intersection([x1,y1,m1...
Intersection surface drawing.
intersection.cpp
需要的函数和操作 所需要的函数有以下几项: random.sample(随机获取一个片段) string.ascii_letters(字母)与 string.digits(数字) set.intersection(关于集合的操作) with Python3 File 函数或操作的基本...
快捷路口Swift中的可扩展记录/交集类型。 struct S1 { var value1: Int}struct S2 { var value2: Bool}let intersection = Intersection ( S1 ( 1 ), S2 ( true ))/... value1 , 1 )XCTAssertEqual (intersection. valu
路径相交 计算两条SVG路径之间的交点。例子 执行npm run dev并导航到以查看更多示例。用法var intersect = require ( 'path-intersection' ) ;var path0 = 'M30,100L270,20' ;var path1 = 'M150,150m0,-18a18,18,0,1...