1083 lines
66 KiB
HTML
1083 lines
66 KiB
HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||
<head>
|
||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
||
<meta name="generator" content="Doxygen 1.9.1"/>
|
||
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||
<title>ViewDesignEngine: vde::collision 命名空间参考</title>
|
||
<link href="tabs.css" rel="stylesheet" type="text/css"/>
|
||
<script type="text/javascript" src="jquery.js"></script>
|
||
<script type="text/javascript" src="dynsections.js"></script>
|
||
<link href="navtree.css" rel="stylesheet" type="text/css"/>
|
||
<script type="text/javascript" src="resize.js"></script>
|
||
<script type="text/javascript" src="navtreedata.js"></script>
|
||
<script type="text/javascript" src="navtree.js"></script>
|
||
<link href="search/search.css" rel="stylesheet" type="text/css"/>
|
||
<script type="text/javascript" src="search/searchdata.js"></script>
|
||
<script type="text/javascript" src="search/search.js"></script>
|
||
<link href="doxygen.css" rel="stylesheet" type="text/css" />
|
||
</head>
|
||
<body>
|
||
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
||
<div id="titlearea">
|
||
<table cellspacing="0" cellpadding="0">
|
||
<tbody>
|
||
<tr style="height: 56px;">
|
||
<td id="projectalign" style="padding-left: 0.5em;">
|
||
<div id="projectname">ViewDesignEngine
|
||
 <span id="projectnumber">3.1.0</span>
|
||
</div>
|
||
<div id="projectbrief">高性能 CAD 计算几何引擎</div>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
<!-- end header part -->
|
||
<!-- 制作者 Doxygen 1.9.1 -->
|
||
<script type="text/javascript">
|
||
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||
var searchBox = new SearchBox("searchBox", "search",false,'搜索','.html');
|
||
/* @license-end */
|
||
</script>
|
||
<script type="text/javascript" src="menudata.js"></script>
|
||
<script type="text/javascript" src="menu.js"></script>
|
||
<script type="text/javascript">
|
||
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||
$(function() {
|
||
initMenu('',true,false,'search.php','搜索');
|
||
$(document).ready(function() { init_search(); });
|
||
});
|
||
/* @license-end */</script>
|
||
<div id="main-nav"></div>
|
||
</div><!-- top -->
|
||
<div id="side-nav" class="ui-resizable side-nav-resizable">
|
||
<div id="nav-tree">
|
||
<div id="nav-tree-contents">
|
||
<div id="nav-sync" class="sync"></div>
|
||
</div>
|
||
</div>
|
||
<div id="splitbar" style="-moz-user-select:none;"
|
||
class="ui-resizable-handle">
|
||
</div>
|
||
</div>
|
||
<script type="text/javascript">
|
||
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
||
$(document).ready(function(){initNavTree('namespacevde_1_1collision.html',''); initResizable(); });
|
||
/* @license-end */
|
||
</script>
|
||
<div id="doc-content">
|
||
<!-- window showing the filter options -->
|
||
<div id="MSearchSelectWindow"
|
||
onmouseover="return searchBox.OnSearchSelectShow()"
|
||
onmouseout="return searchBox.OnSearchSelectHide()"
|
||
onkeydown="return searchBox.OnSearchSelectKey(event)">
|
||
</div>
|
||
|
||
<!-- iframe showing the search results (closed by default) -->
|
||
<div id="MSearchResultsWindow">
|
||
<iframe src="javascript:void(0)" frameborder="0"
|
||
name="MSearchResults" id="MSearchResults">
|
||
</iframe>
|
||
</div>
|
||
|
||
<div class="header">
|
||
<div class="summary">
|
||
<a href="#nested-classes">类</a> |
|
||
<a href="#typedef-members">类型定义</a> |
|
||
<a href="#func-members">函数</a> </div>
|
||
<div class="headertitle">
|
||
<div class="title">vde::collision 命名空间参考</div> </div>
|
||
</div><!--header-->
|
||
<div class="contents">
|
||
<table class="memberdecls">
|
||
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
|
||
类</h2></td></tr>
|
||
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structvde_1_1collision_1_1GJKResult.html">GJKResult</a></td></tr>
|
||
<tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">GJK 完整检测结果 <a href="structvde_1_1collision_1_1GJKResult.html#details">更多...</a><br /></td></tr>
|
||
<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
|
||
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structvde_1_1collision_1_1RayTriResult.html">RayTriResult</a></td></tr>
|
||
<tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">射线-三角形求交结果 <a href="structvde_1_1collision_1_1RayTriResult.html#details">更多...</a><br /></td></tr>
|
||
<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
|
||
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structvde_1_1collision_1_1RaySphereResult.html">RaySphereResult</a></td></tr>
|
||
<tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">射线-球体求交结果 <a href="structvde_1_1collision_1_1RaySphereResult.html#details">更多...</a><br /></td></tr>
|
||
<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
|
||
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structvde_1_1collision_1_1TriTriIntersection.html">TriTriIntersection</a></td></tr>
|
||
<tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">三角形-三角形相交线段 <a href="structvde_1_1collision_1_1TriTriIntersection.html#details">更多...</a><br /></td></tr>
|
||
<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
|
||
</table><table class="memberdecls">
|
||
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
|
||
类型定义</h2></td></tr>
|
||
<tr class="memitem:aab5bef8f2eb03e706f2404b19d109f20"><td class="memItemLeft" align="right" valign="top">using </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1collision.html#aab5bef8f2eb03e706f2404b19d109f20">SupportFunc</a> = std::function< Point3D(const Vector3D &)></td></tr>
|
||
<tr class="memdesc:aab5bef8f2eb03e706f2404b19d109f20"><td class="mdescLeft"> </td><td class="mdescRight">支撑函数类型 <a href="namespacevde_1_1collision.html#aab5bef8f2eb03e706f2404b19d109f20">更多...</a><br /></td></tr>
|
||
<tr class="separator:aab5bef8f2eb03e706f2404b19d109f20"><td class="memSeparator" colspan="2"> </td></tr>
|
||
</table><table class="memberdecls">
|
||
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
|
||
函数</h2></td></tr>
|
||
<tr class="memitem:a9554e414cb05e02a8e04a7eb8c3507ea"><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1collision.html#a9554e414cb05e02a8e04a7eb8c3507ea">gjk_intersect</a> (const <a class="el" href="namespacevde_1_1collision.html#aab5bef8f2eb03e706f2404b19d109f20">SupportFunc</a> &shape_a, const <a class="el" href="namespacevde_1_1collision.html#aab5bef8f2eb03e706f2404b19d109f20">SupportFunc</a> &shape_b)</td></tr>
|
||
<tr class="memdesc:a9554e414cb05e02a8e04a7eb8c3507ea"><td class="mdescLeft"> </td><td class="mdescRight">GJK 相交检测(仅判断是否碰撞) <a href="namespacevde_1_1collision.html#a9554e414cb05e02a8e04a7eb8c3507ea">更多...</a><br /></td></tr>
|
||
<tr class="separator:a9554e414cb05e02a8e04a7eb8c3507ea"><td class="memSeparator" colspan="2"> </td></tr>
|
||
<tr class="memitem:ad090fdef5721a774a5875c45e07450ca"><td class="memItemLeft" align="right" valign="top">double </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1collision.html#ad090fdef5721a774a5875c45e07450ca">gjk_distance</a> (const <a class="el" href="namespacevde_1_1collision.html#aab5bef8f2eb03e706f2404b19d109f20">SupportFunc</a> &shape_a, const <a class="el" href="namespacevde_1_1collision.html#aab5bef8f2eb03e706f2404b19d109f20">SupportFunc</a> &shape_b)</td></tr>
|
||
<tr class="memdesc:ad090fdef5721a774a5875c45e07450ca"><td class="mdescLeft"> </td><td class="mdescRight">GJK 最近距离查询 <a href="namespacevde_1_1collision.html#ad090fdef5721a774a5875c45e07450ca">更多...</a><br /></td></tr>
|
||
<tr class="separator:ad090fdef5721a774a5875c45e07450ca"><td class="memSeparator" colspan="2"> </td></tr>
|
||
<tr class="memitem:a11d806e590e12712a7a183b3244051ca"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structvde_1_1collision_1_1GJKResult.html">GJKResult</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1collision.html#a11d806e590e12712a7a183b3244051ca">gjk_full</a> (const <a class="el" href="namespacevde_1_1collision.html#aab5bef8f2eb03e706f2404b19d109f20">SupportFunc</a> &shape_a, const <a class="el" href="namespacevde_1_1collision.html#aab5bef8f2eb03e706f2404b19d109f20">SupportFunc</a> &shape_b)</td></tr>
|
||
<tr class="memdesc:a11d806e590e12712a7a183b3244051ca"><td class="mdescLeft"> </td><td class="mdescRight">GJK 完整检测:碰撞状态、距离、最近点对 <a href="namespacevde_1_1collision.html#a11d806e590e12712a7a183b3244051ca">更多...</a><br /></td></tr>
|
||
<tr class="separator:a11d806e590e12712a7a183b3244051ca"><td class="memSeparator" colspan="2"> </td></tr>
|
||
<tr class="memitem:ac761ad3914196268cd6f12b700a776df"><td class="memItemLeft" align="right" valign="top">std::optional< <a class="el" href="structvde_1_1collision_1_1RayTriResult.html">RayTriResult</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1collision.html#ac761ad3914196268cd6f12b700a776df">ray_triangle_intersect</a> (const Point3D &origin, const Vector3D &dir, const Triangle3D &tri)</td></tr>
|
||
<tr class="memdesc:ac761ad3914196268cd6f12b700a776df"><td class="mdescLeft"> </td><td class="mdescRight">射线-三角形求交(Möller-Trumbore 算法) <a href="namespacevde_1_1collision.html#ac761ad3914196268cd6f12b700a776df">更多...</a><br /></td></tr>
|
||
<tr class="separator:ac761ad3914196268cd6f12b700a776df"><td class="memSeparator" colspan="2"> </td></tr>
|
||
<tr class="memitem:a5f92a056f5fdc032031e55e0edcc7612"><td class="memItemLeft" align="right" valign="top">std::optional< <a class="el" href="structvde_1_1collision_1_1RayTriResult.html">RayTriResult</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1collision.html#a5f92a056f5fdc032031e55e0edcc7612">ray_triangle_intersect</a> (const Ray3Dd &ray, const Triangle3D &tri)</td></tr>
|
||
<tr class="memdesc:a5f92a056f5fdc032031e55e0edcc7612"><td class="mdescLeft"> </td><td class="mdescRight">射线-三角形求交(Ray3Dd 重载) <a href="namespacevde_1_1collision.html#a5f92a056f5fdc032031e55e0edcc7612">更多...</a><br /></td></tr>
|
||
<tr class="separator:a5f92a056f5fdc032031e55e0edcc7612"><td class="memSeparator" colspan="2"> </td></tr>
|
||
<tr class="memitem:aadf0358f85176f74f8be21e7d74c5aa8"><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1collision.html#aadf0358f85176f74f8be21e7d74c5aa8">ray_aabb_intersect</a> (const Ray3Dd &ray, const AABB3D &box, double &tmin_out, double &tmax_out)</td></tr>
|
||
<tr class="memdesc:aadf0358f85176f74f8be21e7d74c5aa8"><td class="mdescLeft"> </td><td class="mdescRight">射线-AABB 求交(slab 方法) <a href="namespacevde_1_1collision.html#aadf0358f85176f74f8be21e7d74c5aa8">更多...</a><br /></td></tr>
|
||
<tr class="separator:aadf0358f85176f74f8be21e7d74c5aa8"><td class="memSeparator" colspan="2"> </td></tr>
|
||
<tr class="memitem:afb15db2efe7b288e38f3fa95f1d6346f"><td class="memItemLeft" align="right" valign="top">std::optional< <a class="el" href="structvde_1_1collision_1_1RaySphereResult.html">RaySphereResult</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1collision.html#afb15db2efe7b288e38f3fa95f1d6346f">ray_sphere_intersect</a> (const Point3D &origin, const Vector3D &dir, const Point3D &center, double radius)</td></tr>
|
||
<tr class="memdesc:afb15db2efe7b288e38f3fa95f1d6346f"><td class="mdescLeft"> </td><td class="mdescRight">射线-球体求交(解析法) <a href="namespacevde_1_1collision.html#afb15db2efe7b288e38f3fa95f1d6346f">更多...</a><br /></td></tr>
|
||
<tr class="separator:afb15db2efe7b288e38f3fa95f1d6346f"><td class="memSeparator" colspan="2"> </td></tr>
|
||
<tr class="memitem:ab172d7bca6a4b2d82248d48353a645b8"><td class="memItemLeft" align="right" valign="top">std::optional< <a class="el" href="structvde_1_1collision_1_1RaySphereResult.html">RaySphereResult</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1collision.html#ab172d7bca6a4b2d82248d48353a645b8">ray_sphere_intersect</a> (const Ray3Dd &ray, const Point3D &center, double radius)</td></tr>
|
||
<tr class="memdesc:ab172d7bca6a4b2d82248d48353a645b8"><td class="mdescLeft"> </td><td class="mdescRight">射线-球体求交(Ray3Dd 重载) <a href="namespacevde_1_1collision.html#ab172d7bca6a4b2d82248d48353a645b8">更多...</a><br /></td></tr>
|
||
<tr class="separator:ab172d7bca6a4b2d82248d48353a645b8"><td class="memSeparator" colspan="2"> </td></tr>
|
||
<tr class="memitem:aa059e38552bbe3a1cb14745829492823"><td class="memItemLeft" align="right" valign="top">std::optional< double > </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1collision.html#aa059e38552bbe3a1cb14745829492823">ray_plane_intersect</a> (const Point3D &origin, const Vector3D &dir, const Point3D &plane_point, const Vector3D &plane_normal)</td></tr>
|
||
<tr class="memdesc:aa059e38552bbe3a1cb14745829492823"><td class="mdescLeft"> </td><td class="mdescRight">射线-平面求交 <a href="namespacevde_1_1collision.html#aa059e38552bbe3a1cb14745829492823">更多...</a><br /></td></tr>
|
||
<tr class="separator:aa059e38552bbe3a1cb14745829492823"><td class="memSeparator" colspan="2"> </td></tr>
|
||
<tr class="memitem:a3d2f4adb2305bc52bd977baf8ff35355"><td class="memItemLeft" align="right" valign="top">std::optional< double > </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1collision.html#a3d2f4adb2305bc52bd977baf8ff35355">ray_plane_intersect</a> (const Ray3Dd &ray, const Point3D &plane_point, const Vector3D &plane_normal)</td></tr>
|
||
<tr class="memdesc:a3d2f4adb2305bc52bd977baf8ff35355"><td class="mdescLeft"> </td><td class="mdescRight">射线-平面求交(Ray3Dd 重载) <a href="namespacevde_1_1collision.html#a3d2f4adb2305bc52bd977baf8ff35355">更多...</a><br /></td></tr>
|
||
<tr class="separator:a3d2f4adb2305bc52bd977baf8ff35355"><td class="memSeparator" colspan="2"> </td></tr>
|
||
<tr class="memitem:a700a4e58df7b2f6cc8676e64881a5c66"><td class="memItemLeft" align="right" valign="top">std::optional< <a class="el" href="structvde_1_1collision_1_1RayTriResult.html">RayTriResult</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1collision.html#a700a4e58df7b2f6cc8676e64881a5c66">ray_mesh_intersect</a> (const Point3D &origin, const Vector3D &dir, const std::vector< Triangle3D > &triangles)</td></tr>
|
||
<tr class="memdesc:a700a4e58df7b2f6cc8676e64881a5c66"><td class="mdescLeft"> </td><td class="mdescRight">射线-网格求交(暴力遍历) <a href="namespacevde_1_1collision.html#a700a4e58df7b2f6cc8676e64881a5c66">更多...</a><br /></td></tr>
|
||
<tr class="separator:a700a4e58df7b2f6cc8676e64881a5c66"><td class="memSeparator" colspan="2"> </td></tr>
|
||
<tr class="memitem:ad4a8e90b8d55662cdfce2aac395971aa"><td class="memItemLeft" align="right" valign="top">std::optional< <a class="el" href="structvde_1_1collision_1_1RayTriResult.html">RayTriResult</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1collision.html#ad4a8e90b8d55662cdfce2aac395971aa">ray_mesh_intersect</a> (const Ray3Dd &ray, const std::vector< Triangle3D > &triangles)</td></tr>
|
||
<tr class="memdesc:ad4a8e90b8d55662cdfce2aac395971aa"><td class="mdescLeft"> </td><td class="mdescRight">射线-网格求交(Ray3Dd 重载) <a href="namespacevde_1_1collision.html#ad4a8e90b8d55662cdfce2aac395971aa">更多...</a><br /></td></tr>
|
||
<tr class="separator:ad4a8e90b8d55662cdfce2aac395971aa"><td class="memSeparator" colspan="2"> </td></tr>
|
||
<tr class="memitem:a9f6682f6d1174baa3cbb86bf2584d663"><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1collision.html#a9f6682f6d1174baa3cbb86bf2584d663">sat_intersect</a> (const std::vector< Point3D > &verts_a, const std::vector< std::array< int, 3 >> &faces_a, const std::vector< Point3D > &verts_b, const std::vector< std::array< int, 3 >> &faces_b)</td></tr>
|
||
<tr class="memdesc:a9f6682f6d1174baa3cbb86bf2584d663"><td class="mdescLeft"> </td><td class="mdescRight">SAT 凸多面体相交检测 <a href="namespacevde_1_1collision.html#a9f6682f6d1174baa3cbb86bf2584d663">更多...</a><br /></td></tr>
|
||
<tr class="separator:a9f6682f6d1174baa3cbb86bf2584d663"><td class="memSeparator" colspan="2"> </td></tr>
|
||
<tr class="memitem:a2619bea32ceec177a9eadb3a289b81e7"><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1collision.html#a2619bea32ceec177a9eadb3a289b81e7">tri_tri_intersect</a> (const Triangle3D &t1, const Triangle3D &t2)</td></tr>
|
||
<tr class="memdesc:a2619bea32ceec177a9eadb3a289b81e7"><td class="mdescLeft"> </td><td class="mdescRight">三角形-三角形相交检测(布尔测试) <a href="namespacevde_1_1collision.html#a2619bea32ceec177a9eadb3a289b81e7">更多...</a><br /></td></tr>
|
||
<tr class="separator:a2619bea32ceec177a9eadb3a289b81e7"><td class="memSeparator" colspan="2"> </td></tr>
|
||
<tr class="memitem:a32de39cbf1ec266815484d710f25562d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structvde_1_1collision_1_1TriTriIntersection.html">TriTriIntersection</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1collision.html#a32de39cbf1ec266815484d710f25562d">tri_tri_intersect_detailed</a> (const Triangle3D &t1, const Triangle3D &t2)</td></tr>
|
||
<tr class="memdesc:a32de39cbf1ec266815484d710f25562d"><td class="mdescLeft"> </td><td class="mdescRight">三角形-三角形详细相交检测 <a href="namespacevde_1_1collision.html#a32de39cbf1ec266815484d710f25562d">更多...</a><br /></td></tr>
|
||
<tr class="separator:a32de39cbf1ec266815484d710f25562d"><td class="memSeparator" colspan="2"> </td></tr>
|
||
<tr class="memitem:ab98fd10e5a839ea5b50c8abad616ea1e"><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1collision.html#ab98fd10e5a839ea5b50c8abad616ea1e">tri_aabb_overlap</a> (const Triangle3D &tri, const AABB3D &box)</td></tr>
|
||
<tr class="memdesc:ab98fd10e5a839ea5b50c8abad616ea1e"><td class="mdescLeft"> </td><td class="mdescRight">三角形-AABB 快速相交测试 <a href="namespacevde_1_1collision.html#ab98fd10e5a839ea5b50c8abad616ea1e">更多...</a><br /></td></tr>
|
||
<tr class="separator:ab98fd10e5a839ea5b50c8abad616ea1e"><td class="memSeparator" colspan="2"> </td></tr>
|
||
</table>
|
||
<h2 class="groupheader">类型定义说明</h2>
|
||
<a id="aab5bef8f2eb03e706f2404b19d109f20"></a>
|
||
<h2 class="memtitle"><span class="permalink"><a href="#aab5bef8f2eb03e706f2404b19d109f20">◆ </a></span>SupportFunc</h2>
|
||
|
||
<div class="memitem">
|
||
<div class="memproto">
|
||
<table class="memname">
|
||
<tr>
|
||
<td class="memname">using <a class="el" href="namespacevde_1_1collision.html#aab5bef8f2eb03e706f2404b19d109f20">vde::collision::SupportFunc</a> = typedef std::function<Point3D(const Vector3D&)></td>
|
||
</tr>
|
||
</table>
|
||
</div><div class="memdoc">
|
||
|
||
<p>支撑函数类型 </p>
|
||
<p>给定方向向量 d,返回形状在该方向上最远点的坐标: </p><div class="fragment"><div class="line"><a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> support(<span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ab763c018d19e10e91a6c6d6ab2ccc8e0">Vector3D</a>& d) {</div>
|
||
<div class="line"> <span class="keywordflow">return</span> argmax_{v ∈ shape} dot(v, d);</div>
|
||
<div class="line">}</div>
|
||
<div class="ttc" id="anamespacevde_1_1core_html_ab763c018d19e10e91a6c6d6ab2ccc8e0"><div class="ttname"><a href="namespacevde_1_1core.html#ab763c018d19e10e91a6c6d6ab2ccc8e0">vde::core::Vector3D</a></div><div class="ttdeci">foundation::Vector3D Vector3D</div><div class="ttdoc">双精度三维向量(重新导出)</div><div class="ttdef"><b>Definition:</b> <a href="point_8h_source.html#l00049">point.h:49</a></div></div>
|
||
<div class="ttc" id="anamespacevde_1_1core_html_ac6aed70c4b90d13f10217267cd7a1952"><div class="ttname"><a href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">vde::core::Point3D</a></div><div class="ttdeci">foundation::Point3D Point3D</div><div class="ttdoc">双精度三维点(重新导出)</div><div class="ttdef"><b>Definition:</b> <a href="point_8h_source.html#l00031">point.h:31</a></div></div>
|
||
</div><!-- fragment --><p>支撑函数是 GJK / EPA 算法的核心抽象。 只要实现了支撑函数,即可用于任意凸形状的碰撞检测。 </p>
|
||
|
||
<p class="definition">在文件 <a class="el" href="gjk_8h_source.html">gjk.h</a> 第 <a class="el" href="gjk_8h_source.html#l00033">33</a> 行定义.</p>
|
||
|
||
</div>
|
||
</div>
|
||
<h2 class="groupheader">函数说明</h2>
|
||
<a id="ad090fdef5721a774a5875c45e07450ca"></a>
|
||
<h2 class="memtitle"><span class="permalink"><a href="#ad090fdef5721a774a5875c45e07450ca">◆ </a></span>gjk_distance()</h2>
|
||
|
||
<div class="memitem">
|
||
<div class="memproto">
|
||
<table class="memname">
|
||
<tr>
|
||
<td class="memname">double vde::collision::gjk_distance </td>
|
||
<td>(</td>
|
||
<td class="paramtype">const <a class="el" href="namespacevde_1_1collision.html#aab5bef8f2eb03e706f2404b19d109f20">SupportFunc</a> & </td>
|
||
<td class="paramname"><em>shape_a</em>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">const <a class="el" href="namespacevde_1_1collision.html#aab5bef8f2eb03e706f2404b19d109f20">SupportFunc</a> & </td>
|
||
<td class="paramname"><em>shape_b</em> </td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>)</td>
|
||
<td></td><td></td>
|
||
</tr>
|
||
</table>
|
||
</div><div class="memdoc">
|
||
|
||
<p>GJK 最近距离查询 </p>
|
||
<p>在 gjk_intersect 基础上,不相交时额外调用 EPA (Expanding Polytope Algorithm) 计算两形状之间的精确最近距离。</p>
|
||
<dl class="params"><dt>参数</dt><dd>
|
||
<table class="params">
|
||
<tr><td class="paramname">shape_a</td><td>形状 A 的支撑函数 </td></tr>
|
||
<tr><td class="paramname">shape_b</td><td>形状 B 的支撑函数 </td></tr>
|
||
</table>
|
||
</dd>
|
||
</dl>
|
||
<dl class="section return"><dt>返回</dt><dd>最近距离(相交时返回 0),始终 ≥ 0</dd></dl>
|
||
<dl class="section see"><dt>参见</dt><dd><a class="el" href="namespacevde_1_1collision.html#a9554e414cb05e02a8e04a7eb8c3507ea" title="GJK 相交检测(仅判断是否碰撞)">gjk_intersect</a>, <a class="el" href="namespacevde_1_1collision.html#a11d806e590e12712a7a183b3244051ca" title="GJK 完整检测:碰撞状态、距离、最近点对">gjk_full</a> </dd></dl>
|
||
|
||
</div>
|
||
</div>
|
||
<a id="a11d806e590e12712a7a183b3244051ca"></a>
|
||
<h2 class="memtitle"><span class="permalink"><a href="#a11d806e590e12712a7a183b3244051ca">◆ </a></span>gjk_full()</h2>
|
||
|
||
<div class="memitem">
|
||
<div class="memproto">
|
||
<table class="memname">
|
||
<tr>
|
||
<td class="memname"><a class="el" href="structvde_1_1collision_1_1GJKResult.html">GJKResult</a> vde::collision::gjk_full </td>
|
||
<td>(</td>
|
||
<td class="paramtype">const <a class="el" href="namespacevde_1_1collision.html#aab5bef8f2eb03e706f2404b19d109f20">SupportFunc</a> & </td>
|
||
<td class="paramname"><em>shape_a</em>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">const <a class="el" href="namespacevde_1_1collision.html#aab5bef8f2eb03e706f2404b19d109f20">SupportFunc</a> & </td>
|
||
<td class="paramname"><em>shape_b</em> </td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>)</td>
|
||
<td></td><td></td>
|
||
</tr>
|
||
</table>
|
||
</div><div class="memdoc">
|
||
|
||
<p>GJK 完整检测:碰撞状态、距离、最近点对 </p>
|
||
<p>融合 gjk_intersect 和 gjk_distance,一次调用返回 碰撞状态、最近距离及两形状上的最近点。</p>
|
||
<dl class="params"><dt>参数</dt><dd>
|
||
<table class="params">
|
||
<tr><td class="paramname">shape_a</td><td>形状 A 的支撑函数 </td></tr>
|
||
<tr><td class="paramname">shape_b</td><td>形状 B 的支撑函数 </td></tr>
|
||
</table>
|
||
</dd>
|
||
</dl>
|
||
<dl class="section return"><dt>返回</dt><dd><a class="el" href="structvde_1_1collision_1_1GJKResult.html" title="GJK 完整检测结果">GJKResult</a> 包含碰撞状态、距离、最近点对</dd></dl>
|
||
<dl class="section note"><dt>注解</dt><dd>对于连续碰撞检测 (CCD) 或需要分离向量的场景, 使用此函数可同时获取碰撞信息和穿透深度方向。</dd></dl>
|
||
<div class="fragment"><div class="line"><span class="keyword">auto</span> result = <a class="code" href="namespacevde_1_1collision.html#a11d806e590e12712a7a183b3244051ca">gjk_full</a>(a_support, b_support);</div>
|
||
<div class="line"><span class="keywordflow">if</span> (result.intersect) {</div>
|
||
<div class="line"> <span class="comment">// 穿透,分离方向 = (point_b - point_a).normalized()</span></div>
|
||
<div class="line">} <span class="keywordflow">else</span> {</div>
|
||
<div class="line"> <span class="keywordtype">double</span> gap = result.distance; <span class="comment">// 间隙</span></div>
|
||
<div class="line">}</div>
|
||
<div class="ttc" id="anamespacevde_1_1collision_html_a11d806e590e12712a7a183b3244051ca"><div class="ttname"><a href="namespacevde_1_1collision.html#a11d806e590e12712a7a183b3244051ca">vde::collision::gjk_full</a></div><div class="ttdeci">GJKResult gjk_full(const SupportFunc &shape_a, const SupportFunc &shape_b)</div><div class="ttdoc">GJK 完整检测:碰撞状态、距离、最近点对</div></div>
|
||
</div><!-- fragment --><dl class="section see"><dt>参见</dt><dd><a class="el" href="namespacevde_1_1collision.html#a9554e414cb05e02a8e04a7eb8c3507ea" title="GJK 相交检测(仅判断是否碰撞)">gjk_intersect</a>, <a class="el" href="namespacevde_1_1collision.html#ad090fdef5721a774a5875c45e07450ca" title="GJK 最近距离查询">gjk_distance</a> </dd></dl>
|
||
|
||
</div>
|
||
</div>
|
||
<a id="a9554e414cb05e02a8e04a7eb8c3507ea"></a>
|
||
<h2 class="memtitle"><span class="permalink"><a href="#a9554e414cb05e02a8e04a7eb8c3507ea">◆ </a></span>gjk_intersect()</h2>
|
||
|
||
<div class="memitem">
|
||
<div class="memproto">
|
||
<table class="memname">
|
||
<tr>
|
||
<td class="memname">bool vde::collision::gjk_intersect </td>
|
||
<td>(</td>
|
||
<td class="paramtype">const <a class="el" href="namespacevde_1_1collision.html#aab5bef8f2eb03e706f2404b19d109f20">SupportFunc</a> & </td>
|
||
<td class="paramname"><em>shape_a</em>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">const <a class="el" href="namespacevde_1_1collision.html#aab5bef8f2eb03e706f2404b19d109f20">SupportFunc</a> & </td>
|
||
<td class="paramname"><em>shape_b</em> </td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>)</td>
|
||
<td></td><td></td>
|
||
</tr>
|
||
</table>
|
||
</div><div class="memdoc">
|
||
|
||
<p>GJK 相交检测(仅判断是否碰撞) </p>
|
||
<p>构造 Minkowski 差 A − B,在原点附近迭代构建单纯形。 若原点在 Minkowski 差内 → 碰撞。</p>
|
||
<p>算法流程:</p><ol type="1">
|
||
<li>取初始方向(如 a.center − b.center)</li>
|
||
<li>计算支撑点并加入单纯形</li>
|
||
<li>判断单纯形是否包含原点</li>
|
||
<li>若不包含,更新搜索方向并迭代</li>
|
||
<li>若方向无法收敛 → 不相交</li>
|
||
</ol>
|
||
<p>时间复杂度 O(n),其中 n 为迭代次数(通常 < 20 对于紧凑形状)。</p>
|
||
<dl class="params"><dt>参数</dt><dd>
|
||
<table class="params">
|
||
<tr><td class="paramname">shape_a</td><td>形状 A 的支撑函数 </td></tr>
|
||
<tr><td class="paramname">shape_b</td><td>形状 B 的支撑函数 </td></tr>
|
||
</table>
|
||
</dd>
|
||
</dl>
|
||
<dl class="section return"><dt>返回</dt><dd>相交返回 true</dd></dl>
|
||
<div class="fragment"><div class="line"><span class="keyword">auto</span> sphere_support = [&](<span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ab763c018d19e10e91a6c6d6ab2ccc8e0">Vector3D</a>& d) {</div>
|
||
<div class="line"> <span class="keywordflow">return</span> center + radius * d.normalized();</div>
|
||
<div class="line">};</div>
|
||
<div class="line"><span class="keyword">auto</span> box_support = [&](<span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ab763c018d19e10e91a6c6d6ab2ccc8e0">Vector3D</a>& d) {</div>
|
||
<div class="line"> <span class="keywordflow">return</span> center + <a class="code" href="namespacevde_1_1core.html#ab763c018d19e10e91a6c6d6ab2ccc8e0">Vector3D</a>{</div>
|
||
<div class="line"> half_extent.x * (d.x > 0 ? 1 : -1),</div>
|
||
<div class="line"> half_extent.y * (d.y > 0 ? 1 : -1),</div>
|
||
<div class="line"> half_extent.z * (d.z > 0 ? 1 : -1)</div>
|
||
<div class="line"> };</div>
|
||
<div class="line">};</div>
|
||
<div class="line"><span class="keywordflow">if</span> (<a class="code" href="namespacevde_1_1collision.html#a9554e414cb05e02a8e04a7eb8c3507ea">gjk_intersect</a>(sphere_support, box_support)) { ... }</div>
|
||
<div class="ttc" id="anamespacevde_1_1collision_html_a9554e414cb05e02a8e04a7eb8c3507ea"><div class="ttname"><a href="namespacevde_1_1collision.html#a9554e414cb05e02a8e04a7eb8c3507ea">vde::collision::gjk_intersect</a></div><div class="ttdeci">bool gjk_intersect(const SupportFunc &shape_a, const SupportFunc &shape_b)</div><div class="ttdoc">GJK 相交检测(仅判断是否碰撞)</div></div>
|
||
</div><!-- fragment --><dl class="section see"><dt>参见</dt><dd><a class="el" href="namespacevde_1_1collision.html#ad090fdef5721a774a5875c45e07450ca" title="GJK 最近距离查询">gjk_distance</a>, <a class="el" href="namespacevde_1_1collision.html#a11d806e590e12712a7a183b3244051ca" title="GJK 完整检测:碰撞状态、距离、最近点对">gjk_full</a>, <a class="el" href="namespacevde_1_1collision.html#aab5bef8f2eb03e706f2404b19d109f20" title="支撑函数类型">SupportFunc</a> </dd></dl>
|
||
|
||
</div>
|
||
</div>
|
||
<a id="aadf0358f85176f74f8be21e7d74c5aa8"></a>
|
||
<h2 class="memtitle"><span class="permalink"><a href="#aadf0358f85176f74f8be21e7d74c5aa8">◆ </a></span>ray_aabb_intersect()</h2>
|
||
|
||
<div class="memitem">
|
||
<div class="memproto">
|
||
<table class="memname">
|
||
<tr>
|
||
<td class="memname">bool vde::collision::ray_aabb_intersect </td>
|
||
<td>(</td>
|
||
<td class="paramtype">const Ray3Dd & </td>
|
||
<td class="paramname"><em>ray</em>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">const AABB3D & </td>
|
||
<td class="paramname"><em>box</em>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">double & </td>
|
||
<td class="paramname"><em>tmin_out</em>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">double & </td>
|
||
<td class="paramname"><em>tmax_out</em> </td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>)</td>
|
||
<td></td><td></td>
|
||
</tr>
|
||
</table>
|
||
</div><div class="memdoc">
|
||
|
||
<p>射线-AABB 求交(slab 方法) </p>
|
||
<p>分别检测射线与三个坐标轴方向 slab(平板块)的交点, 取最大 t_min 和最小 t_max。若 t_min ≤ t_max 且 t_max ≥ 0,则命中。</p>
|
||
<p>复杂度 O(1)。</p>
|
||
<dl class="params"><dt>参数</dt><dd>
|
||
<table class="params">
|
||
<tr><td class="paramname">ray</td><td>射线 </td></tr>
|
||
<tr><td class="paramname">box</td><td>轴对齐包围盒 </td></tr>
|
||
<tr><td class="paramname">tmin_out</td><td>[输出] 进入包围盒的参数 t </td></tr>
|
||
<tr><td class="paramname">tmax_out</td><td>[输出] 离开包围盒的参数 t </td></tr>
|
||
</table>
|
||
</dd>
|
||
</dl>
|
||
<dl class="section return"><dt>返回</dt><dd>命中返回 true</dd></dl>
|
||
<dl class="section note"><dt>注解</dt><dd>常用于 BVH 遍历节点的快速 rejection test</dd></dl>
|
||
<dl class="section see"><dt>参见</dt><dd><a class="el" href="namespacevde_1_1collision.html#ac761ad3914196268cd6f12b700a776df" title="射线-三角形求交(Möller-Trumbore 算法)">ray_triangle_intersect</a> </dd></dl>
|
||
|
||
</div>
|
||
</div>
|
||
<a id="a700a4e58df7b2f6cc8676e64881a5c66"></a>
|
||
<h2 class="memtitle"><span class="permalink"><a href="#a700a4e58df7b2f6cc8676e64881a5c66">◆ </a></span>ray_mesh_intersect() <span class="overload">[1/2]</span></h2>
|
||
|
||
<div class="memitem">
|
||
<div class="memproto">
|
||
<table class="memname">
|
||
<tr>
|
||
<td class="memname">std::optional<<a class="el" href="structvde_1_1collision_1_1RayTriResult.html">RayTriResult</a>> vde::collision::ray_mesh_intersect </td>
|
||
<td>(</td>
|
||
<td class="paramtype">const Point3D & </td>
|
||
<td class="paramname"><em>origin</em>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">const Vector3D & </td>
|
||
<td class="paramname"><em>dir</em>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">const std::vector< Triangle3D > & </td>
|
||
<td class="paramname"><em>triangles</em> </td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>)</td>
|
||
<td></td><td></td>
|
||
</tr>
|
||
</table>
|
||
</div><div class="memdoc">
|
||
|
||
<p>射线-网格求交(暴力遍历) </p>
|
||
<p>遍历所有三角形,对每个三角形调用 ray_triangle_intersect, 跟踪最小 t 值返回最近命中。</p>
|
||
<p>复杂度 O(n),n 为三角形数量。</p>
|
||
<dl class="params"><dt>参数</dt><dd>
|
||
<table class="params">
|
||
<tr><td class="paramname">origin</td><td>射线起点 </td></tr>
|
||
<tr><td class="paramname">dir</td><td>射线方向 </td></tr>
|
||
<tr><td class="paramname">triangles</td><td>三角形列表 </td></tr>
|
||
</table>
|
||
</dd>
|
||
</dl>
|
||
<dl class="section return"><dt>返回</dt><dd>最近命中结果;无命中返回空</dd></dl>
|
||
<dl class="section note"><dt>注解</dt><dd>对于大型网格建议配合 BVH 使用: <div class="fragment"><div class="line">BVH bvh;</div>
|
||
<div class="line">bvh.build(triangles);</div>
|
||
<div class="line"><span class="keyword">auto</span> hit = bvh.query_ray_nearest(ray); <span class="comment">// O(log n)</span></div>
|
||
</div><!-- fragment --></dd></dl>
|
||
<dl class="section see"><dt>参见</dt><dd>ray_tri_intersect.h, query_ray_nearest (BVH) </dd></dl>
|
||
|
||
<p class="reference">被这些函数引用 <a class="el" href="ray__intersect_8h_source.html#l00210">ray_mesh_intersect()</a>.</p>
|
||
|
||
</div>
|
||
</div>
|
||
<a id="ad4a8e90b8d55662cdfce2aac395971aa"></a>
|
||
<h2 class="memtitle"><span class="permalink"><a href="#ad4a8e90b8d55662cdfce2aac395971aa">◆ </a></span>ray_mesh_intersect() <span class="overload">[2/2]</span></h2>
|
||
|
||
<div class="memitem">
|
||
<div class="memproto">
|
||
<table class="mlabels">
|
||
<tr>
|
||
<td class="mlabels-left">
|
||
<table class="memname">
|
||
<tr>
|
||
<td class="memname">std::optional<<a class="el" href="structvde_1_1collision_1_1RayTriResult.html">RayTriResult</a>> vde::collision::ray_mesh_intersect </td>
|
||
<td>(</td>
|
||
<td class="paramtype">const Ray3Dd & </td>
|
||
<td class="paramname"><em>ray</em>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">const std::vector< Triangle3D > & </td>
|
||
<td class="paramname"><em>triangles</em> </td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>)</td>
|
||
<td></td><td></td>
|
||
</tr>
|
||
</table>
|
||
</td>
|
||
<td class="mlabels-right">
|
||
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
|
||
</tr>
|
||
</table>
|
||
</div><div class="memdoc">
|
||
|
||
<p>射线-网格求交(Ray3Dd 重载) </p>
|
||
<dl class="params"><dt>参数</dt><dd>
|
||
<table class="params">
|
||
<tr><td class="paramname">ray</td><td>射线 </td></tr>
|
||
<tr><td class="paramname">triangles</td><td>三角形列表 </td></tr>
|
||
</table>
|
||
</dd>
|
||
</dl>
|
||
<dl class="section return"><dt>返回</dt><dd>最近命中结果;无命中返回空 </dd></dl>
|
||
|
||
<p class="definition">在文件 <a class="el" href="ray__intersect_8h_source.html">ray_intersect.h</a> 第 <a class="el" href="ray__intersect_8h_source.html#l00210">210</a> 行定义.</p>
|
||
|
||
<p class="reference">引用了 <a class="el" href="namespacevde_1_1collision.html#a700a4e58df7b2f6cc8676e64881a5c66">ray_mesh_intersect()</a>.</p>
|
||
|
||
</div>
|
||
</div>
|
||
<a id="aa059e38552bbe3a1cb14745829492823"></a>
|
||
<h2 class="memtitle"><span class="permalink"><a href="#aa059e38552bbe3a1cb14745829492823">◆ </a></span>ray_plane_intersect() <span class="overload">[1/2]</span></h2>
|
||
|
||
<div class="memitem">
|
||
<div class="memproto">
|
||
<table class="memname">
|
||
<tr>
|
||
<td class="memname">std::optional<double> vde::collision::ray_plane_intersect </td>
|
||
<td>(</td>
|
||
<td class="paramtype">const Point3D & </td>
|
||
<td class="paramname"><em>origin</em>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">const Vector3D & </td>
|
||
<td class="paramname"><em>dir</em>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">const Point3D & </td>
|
||
<td class="paramname"><em>plane_point</em>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">const Vector3D & </td>
|
||
<td class="paramname"><em>plane_normal</em> </td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>)</td>
|
||
<td></td><td></td>
|
||
</tr>
|
||
</table>
|
||
</div><div class="memdoc">
|
||
|
||
<p>射线-平面求交 </p>
|
||
<p>解 t = dot(plane_point − origin, plane_normal) / dot(dir, plane_normal)。 若分母 ≈ 0(射线平行于平面)→ 无交点。</p>
|
||
<dl class="params"><dt>参数</dt><dd>
|
||
<table class="params">
|
||
<tr><td class="paramname">origin</td><td>射线起点 </td></tr>
|
||
<tr><td class="paramname">dir</td><td>射线方向 </td></tr>
|
||
<tr><td class="paramname">plane_point</td><td>平面上一点 </td></tr>
|
||
<tr><td class="paramname">plane_normal</td><td>平面法线(需归一化以获得正确 t) </td></tr>
|
||
</table>
|
||
</dd>
|
||
</dl>
|
||
<dl class="section return"><dt>返回</dt><dd>命中返回参数 t;未命中(平行或反向)返回空 </dd></dl>
|
||
|
||
<p class="reference">被这些函数引用 <a class="el" href="ray__intersect_8h_source.html#l00170">ray_plane_intersect()</a>.</p>
|
||
|
||
</div>
|
||
</div>
|
||
<a id="a3d2f4adb2305bc52bd977baf8ff35355"></a>
|
||
<h2 class="memtitle"><span class="permalink"><a href="#a3d2f4adb2305bc52bd977baf8ff35355">◆ </a></span>ray_plane_intersect() <span class="overload">[2/2]</span></h2>
|
||
|
||
<div class="memitem">
|
||
<div class="memproto">
|
||
<table class="mlabels">
|
||
<tr>
|
||
<td class="mlabels-left">
|
||
<table class="memname">
|
||
<tr>
|
||
<td class="memname">std::optional<double> vde::collision::ray_plane_intersect </td>
|
||
<td>(</td>
|
||
<td class="paramtype">const Ray3Dd & </td>
|
||
<td class="paramname"><em>ray</em>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">const Point3D & </td>
|
||
<td class="paramname"><em>plane_point</em>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">const Vector3D & </td>
|
||
<td class="paramname"><em>plane_normal</em> </td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>)</td>
|
||
<td></td><td></td>
|
||
</tr>
|
||
</table>
|
||
</td>
|
||
<td class="mlabels-right">
|
||
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
|
||
</tr>
|
||
</table>
|
||
</div><div class="memdoc">
|
||
|
||
<p>射线-平面求交(Ray3Dd 重载) </p>
|
||
<dl class="params"><dt>参数</dt><dd>
|
||
<table class="params">
|
||
<tr><td class="paramname">ray</td><td>射线 </td></tr>
|
||
<tr><td class="paramname">plane_point</td><td>平面上一点 </td></tr>
|
||
<tr><td class="paramname">plane_normal</td><td>平面法线 </td></tr>
|
||
</table>
|
||
</dd>
|
||
</dl>
|
||
<dl class="section return"><dt>返回</dt><dd>命中返回参数 t;未命中返回空 </dd></dl>
|
||
|
||
<p class="definition">在文件 <a class="el" href="ray__intersect_8h_source.html">ray_intersect.h</a> 第 <a class="el" href="ray__intersect_8h_source.html#l00170">170</a> 行定义.</p>
|
||
|
||
<p class="reference">引用了 <a class="el" href="namespacevde_1_1collision.html#aa059e38552bbe3a1cb14745829492823">ray_plane_intersect()</a>.</p>
|
||
|
||
</div>
|
||
</div>
|
||
<a id="afb15db2efe7b288e38f3fa95f1d6346f"></a>
|
||
<h2 class="memtitle"><span class="permalink"><a href="#afb15db2efe7b288e38f3fa95f1d6346f">◆ </a></span>ray_sphere_intersect() <span class="overload">[1/2]</span></h2>
|
||
|
||
<div class="memitem">
|
||
<div class="memproto">
|
||
<table class="memname">
|
||
<tr>
|
||
<td class="memname">std::optional<<a class="el" href="structvde_1_1collision_1_1RaySphereResult.html">RaySphereResult</a>> vde::collision::ray_sphere_intersect </td>
|
||
<td>(</td>
|
||
<td class="paramtype">const Point3D & </td>
|
||
<td class="paramname"><em>origin</em>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">const Vector3D & </td>
|
||
<td class="paramname"><em>dir</em>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">const Point3D & </td>
|
||
<td class="paramname"><em>center</em>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">double </td>
|
||
<td class="paramname"><em>radius</em> </td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>)</td>
|
||
<td></td><td></td>
|
||
</tr>
|
||
</table>
|
||
</div><div class="memdoc">
|
||
|
||
<p>射线-球体求交(解析法) </p>
|
||
<p>解二次方程 |origin + t*dir − center|² = r²。 通过判别式 Δ = b² − 4ac 判断:</p><ul>
|
||
<li>Δ < 0 → 无交点</li>
|
||
<li>Δ = 0 → 切点(一个交点)</li>
|
||
<li>Δ > 0 → 两个交点(返回较近的)</li>
|
||
</ul>
|
||
<p>复杂度 O(1)。</p>
|
||
<dl class="params"><dt>参数</dt><dd>
|
||
<table class="params">
|
||
<tr><td class="paramname">origin</td><td>射线起点 </td></tr>
|
||
<tr><td class="paramname">dir</td><td>射线方向 </td></tr>
|
||
<tr><td class="paramname">center</td><td>球心 </td></tr>
|
||
<tr><td class="paramname">radius</td><td>球半径 </td></tr>
|
||
</table>
|
||
</dd>
|
||
</dl>
|
||
<dl class="section return"><dt>返回</dt><dd>命中返回 RaySphereResult(最近交点);未命中返回空</dd></dl>
|
||
<dl class="section see"><dt>参见</dt><dd>ray_sphere_intersect(ray, center, radius) </dd></dl>
|
||
|
||
<p class="reference">被这些函数引用 <a class="el" href="ray__intersect_8h_source.html#l00141">ray_sphere_intersect()</a>.</p>
|
||
|
||
</div>
|
||
</div>
|
||
<a id="ab172d7bca6a4b2d82248d48353a645b8"></a>
|
||
<h2 class="memtitle"><span class="permalink"><a href="#ab172d7bca6a4b2d82248d48353a645b8">◆ </a></span>ray_sphere_intersect() <span class="overload">[2/2]</span></h2>
|
||
|
||
<div class="memitem">
|
||
<div class="memproto">
|
||
<table class="mlabels">
|
||
<tr>
|
||
<td class="mlabels-left">
|
||
<table class="memname">
|
||
<tr>
|
||
<td class="memname">std::optional<<a class="el" href="structvde_1_1collision_1_1RaySphereResult.html">RaySphereResult</a>> vde::collision::ray_sphere_intersect </td>
|
||
<td>(</td>
|
||
<td class="paramtype">const Ray3Dd & </td>
|
||
<td class="paramname"><em>ray</em>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">const Point3D & </td>
|
||
<td class="paramname"><em>center</em>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">double </td>
|
||
<td class="paramname"><em>radius</em> </td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>)</td>
|
||
<td></td><td></td>
|
||
</tr>
|
||
</table>
|
||
</td>
|
||
<td class="mlabels-right">
|
||
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
|
||
</tr>
|
||
</table>
|
||
</div><div class="memdoc">
|
||
|
||
<p>射线-球体求交(Ray3Dd 重载) </p>
|
||
<dl class="params"><dt>参数</dt><dd>
|
||
<table class="params">
|
||
<tr><td class="paramname">ray</td><td>射线 </td></tr>
|
||
<tr><td class="paramname">center</td><td>球心 </td></tr>
|
||
<tr><td class="paramname">radius</td><td>球半径 </td></tr>
|
||
</table>
|
||
</dd>
|
||
</dl>
|
||
<dl class="section return"><dt>返回</dt><dd>命中返回 RaySphereResult;未命中返回空 </dd></dl>
|
||
|
||
<p class="definition">在文件 <a class="el" href="ray__intersect_8h_source.html">ray_intersect.h</a> 第 <a class="el" href="ray__intersect_8h_source.html#l00141">141</a> 行定义.</p>
|
||
|
||
<p class="reference">引用了 <a class="el" href="namespacevde_1_1collision.html#afb15db2efe7b288e38f3fa95f1d6346f">ray_sphere_intersect()</a>.</p>
|
||
|
||
</div>
|
||
</div>
|
||
<a id="ac761ad3914196268cd6f12b700a776df"></a>
|
||
<h2 class="memtitle"><span class="permalink"><a href="#ac761ad3914196268cd6f12b700a776df">◆ </a></span>ray_triangle_intersect() <span class="overload">[1/2]</span></h2>
|
||
|
||
<div class="memitem">
|
||
<div class="memproto">
|
||
<table class="memname">
|
||
<tr>
|
||
<td class="memname">std::optional<<a class="el" href="structvde_1_1collision_1_1RayTriResult.html">RayTriResult</a>> vde::collision::ray_triangle_intersect </td>
|
||
<td>(</td>
|
||
<td class="paramtype">const Point3D & </td>
|
||
<td class="paramname"><em>origin</em>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">const Vector3D & </td>
|
||
<td class="paramname"><em>dir</em>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">const Triangle3D & </td>
|
||
<td class="paramname"><em>tri</em> </td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>)</td>
|
||
<td></td><td></td>
|
||
</tr>
|
||
</table>
|
||
</div><div class="memdoc">
|
||
|
||
<p>射线-三角形求交(Möller-Trumbore 算法) </p>
|
||
<p>标准 MT 算法,直接计算重心坐标 u, v 和参数 t。 不预先计算平面方程,一步到位检测。</p>
|
||
<p>算法:</p><ol type="1">
|
||
<li>计算两个边向量 e1 = v1−v0, e2 = v2−v0</li>
|
||
<li>计算 pvec = dir × e2, det = dot(e1, pvec)</li>
|
||
<li>若 |det| < ε → 射线平行于三角形(无命中)</li>
|
||
<li>计算 tvec = origin−v0, u, v, t</li>
|
||
<li>验证 u≥0, v≥0, u+v≤1, t>0 → 命中</li>
|
||
</ol>
|
||
<p>复杂度 O(1)。</p>
|
||
<dl class="params"><dt>参数</dt><dd>
|
||
<table class="params">
|
||
<tr><td class="paramname">origin</td><td>射线起点 </td></tr>
|
||
<tr><td class="paramname">dir</td><td>射线方向(需归一化以获得正确 t 值) </td></tr>
|
||
<tr><td class="paramname">tri</td><td>三角形 </td></tr>
|
||
</table>
|
||
</dd>
|
||
</dl>
|
||
<dl class="section return"><dt>返回</dt><dd>命中返回 RayTriResult;未命中返回空</dd></dl>
|
||
<div class="fragment"><div class="line"><span class="keywordflow">if</span> (<span class="keyword">auto</span> hit = <a class="code" href="namespacevde_1_1collision.html#ac761ad3914196268cd6f12b700a776df">ray_triangle_intersect</a>(origin, dir, tri)) {</div>
|
||
<div class="line"> std::cout << <span class="stringliteral">"Hit at t="</span> << hit->t</div>
|
||
<div class="line"> << <span class="stringliteral">" barycentric=("</span> << hit->u << <span class="stringliteral">","</span> << hit->v << <span class="stringliteral">")\n"</span>;</div>
|
||
<div class="line">}</div>
|
||
<div class="ttc" id="anamespacevde_1_1collision_html_ac761ad3914196268cd6f12b700a776df"><div class="ttname"><a href="namespacevde_1_1collision.html#ac761ad3914196268cd6f12b700a776df">vde::collision::ray_triangle_intersect</a></div><div class="ttdeci">std::optional< RayTriResult > ray_triangle_intersect(const Point3D &origin, const Vector3D &dir, const Triangle3D &tri)</div><div class="ttdoc">射线-三角形求交(Möller-Trumbore 算法)</div></div>
|
||
</div><!-- fragment --><dl class="section see"><dt>参见</dt><dd><a class="el" href="namespacevde_1_1collision.html#a700a4e58df7b2f6cc8676e64881a5c66" title="射线-网格求交(暴力遍历)">ray_mesh_intersect</a> </dd></dl>
|
||
|
||
<p class="reference">被这些函数引用 <a class="el" href="ray__intersect_8h_source.html#l00076">ray_triangle_intersect()</a>.</p>
|
||
|
||
</div>
|
||
</div>
|
||
<a id="a5f92a056f5fdc032031e55e0edcc7612"></a>
|
||
<h2 class="memtitle"><span class="permalink"><a href="#a5f92a056f5fdc032031e55e0edcc7612">◆ </a></span>ray_triangle_intersect() <span class="overload">[2/2]</span></h2>
|
||
|
||
<div class="memitem">
|
||
<div class="memproto">
|
||
<table class="mlabels">
|
||
<tr>
|
||
<td class="mlabels-left">
|
||
<table class="memname">
|
||
<tr>
|
||
<td class="memname">std::optional<<a class="el" href="structvde_1_1collision_1_1RayTriResult.html">RayTriResult</a>> vde::collision::ray_triangle_intersect </td>
|
||
<td>(</td>
|
||
<td class="paramtype">const Ray3Dd & </td>
|
||
<td class="paramname"><em>ray</em>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">const Triangle3D & </td>
|
||
<td class="paramname"><em>tri</em> </td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>)</td>
|
||
<td></td><td></td>
|
||
</tr>
|
||
</table>
|
||
</td>
|
||
<td class="mlabels-right">
|
||
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
|
||
</tr>
|
||
</table>
|
||
</div><div class="memdoc">
|
||
|
||
<p>射线-三角形求交(Ray3Dd 重载) </p>
|
||
<dl class="params"><dt>参数</dt><dd>
|
||
<table class="params">
|
||
<tr><td class="paramname">ray</td><td>射线 </td></tr>
|
||
<tr><td class="paramname">tri</td><td>三角形 </td></tr>
|
||
</table>
|
||
</dd>
|
||
</dl>
|
||
<dl class="section return"><dt>返回</dt><dd>命中返回 RayTriResult;未命中返回空</dd></dl>
|
||
<dl class="section see"><dt>参见</dt><dd>ray_triangle_intersect(origin, dir, tri) </dd></dl>
|
||
|
||
<p class="definition">在文件 <a class="el" href="ray__intersect_8h_source.html">ray_intersect.h</a> 第 <a class="el" href="ray__intersect_8h_source.html#l00076">76</a> 行定义.</p>
|
||
|
||
<p class="reference">引用了 <a class="el" href="namespacevde_1_1collision.html#ac761ad3914196268cd6f12b700a776df">ray_triangle_intersect()</a>.</p>
|
||
|
||
</div>
|
||
</div>
|
||
<a id="a9f6682f6d1174baa3cbb86bf2584d663"></a>
|
||
<h2 class="memtitle"><span class="permalink"><a href="#a9f6682f6d1174baa3cbb86bf2584d663">◆ </a></span>sat_intersect()</h2>
|
||
|
||
<div class="memitem">
|
||
<div class="memproto">
|
||
<table class="memname">
|
||
<tr>
|
||
<td class="memname">bool vde::collision::sat_intersect </td>
|
||
<td>(</td>
|
||
<td class="paramtype">const std::vector< Point3D > & </td>
|
||
<td class="paramname"><em>verts_a</em>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">const std::vector< std::array< int, 3 >> & </td>
|
||
<td class="paramname"><em>faces_a</em>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">const std::vector< Point3D > & </td>
|
||
<td class="paramname"><em>verts_b</em>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">const std::vector< std::array< int, 3 >> & </td>
|
||
<td class="paramname"><em>faces_b</em> </td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>)</td>
|
||
<td></td><td></td>
|
||
</tr>
|
||
</table>
|
||
</div><div class="memdoc">
|
||
|
||
<p>SAT 凸多面体相交检测 </p>
|
||
<p>分离轴定理:两个凸多面体不相交,当且仅当存在一条分离轴, 使得二者在该轴上的投影区间不重叠。</p>
|
||
<p>待检测的分离轴集合:</p><ul>
|
||
<li>A 的每个面法线</li>
|
||
<li>B 的每个面法线</li>
|
||
<li>A 的每条边与 B 的每条边的叉积</li>
|
||
</ul>
|
||
<p>对每条候选轴,计算两个多面体投影区间的最小/最大值。 若某轴上投影区间无重叠 → 不相交(早停)。 所有轴都重叠 → 相交。</p>
|
||
<p>最坏时间复杂度 O(n_a · n_b),其中 n_a, n_b 为面数。 对于凸多面体通常在遍历部分轴后即早停。</p>
|
||
<dl class="params"><dt>参数</dt><dd>
|
||
<table class="params">
|
||
<tr><td class="paramname">verts_a</td><td>多面体 A 的顶点数组 </td></tr>
|
||
<tr><td class="paramname">faces_a</td><td>多面体 A 的面索引数组(每个面为 {v0, v1, v2}) </td></tr>
|
||
<tr><td class="paramname">verts_b</td><td>多面体 B 的顶点数组 </td></tr>
|
||
<tr><td class="paramname">faces_b</td><td>多面体 B 的面索引数组 </td></tr>
|
||
</table>
|
||
</dd>
|
||
</dl>
|
||
<dl class="section return"><dt>返回</dt><dd>相交返回 true</dd></dl>
|
||
<dl class="section note"><dt>注解</dt><dd>适用于任意凸多面体。对于胶囊/球等光滑形状,GJK 更合适。</dd></dl>
|
||
<div class="fragment"><div class="line"><span class="comment">// 两个凸四面体相交检测</span></div>
|
||
<div class="line">std::vector<Point3D> va = {{0,0,0}, {1,0,0}, {0,1,0}, {0,0,1}};</div>
|
||
<div class="line">std::vector<std::array<int,3>> fa = {{0,2,1}, {0,1,3}, {0,3,2}, {1,2,3}};</div>
|
||
<div class="line">std::vector<Point3D> vb = {{0.5,0.5,0.5}, {1.5,0.5,0.5}, ...};</div>
|
||
<div class="line">std::vector<std::array<int,3>> fb = { ... };</div>
|
||
<div class="line"><span class="keywordtype">bool</span> hit = <a class="code" href="namespacevde_1_1collision.html#a9f6682f6d1174baa3cbb86bf2584d663">sat_intersect</a>(va, fa, vb, fb);</div>
|
||
<div class="ttc" id="anamespacevde_1_1collision_html_a9f6682f6d1174baa3cbb86bf2584d663"><div class="ttname"><a href="namespacevde_1_1collision.html#a9f6682f6d1174baa3cbb86bf2584d663">vde::collision::sat_intersect</a></div><div class="ttdeci">bool sat_intersect(const std::vector< Point3D > &verts_a, const std::vector< std::array< int, 3 >> &faces_a, const std::vector< Point3D > &verts_b, const std::vector< std::array< int, 3 >> &faces_b)</div><div class="ttdoc">SAT 凸多面体相交检测</div></div>
|
||
</div><!-- fragment --><dl class="section see"><dt>参见</dt><dd><a class="el" href="namespacevde_1_1collision.html#a9554e414cb05e02a8e04a7eb8c3507ea" title="GJK 相交检测(仅判断是否碰撞)">gjk_intersect</a>, <a class="el" href="namespacevde_1_1collision.html#a2619bea32ceec177a9eadb3a289b81e7" title="三角形-三角形相交检测(布尔测试)">tri_tri_intersect</a> </dd></dl>
|
||
|
||
</div>
|
||
</div>
|
||
<a id="ab98fd10e5a839ea5b50c8abad616ea1e"></a>
|
||
<h2 class="memtitle"><span class="permalink"><a href="#ab98fd10e5a839ea5b50c8abad616ea1e">◆ </a></span>tri_aabb_overlap()</h2>
|
||
|
||
<div class="memitem">
|
||
<div class="memproto">
|
||
<table class="memname">
|
||
<tr>
|
||
<td class="memname">bool vde::collision::tri_aabb_overlap </td>
|
||
<td>(</td>
|
||
<td class="paramtype">const Triangle3D & </td>
|
||
<td class="paramname"><em>tri</em>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">const AABB3D & </td>
|
||
<td class="paramname"><em>box</em> </td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>)</td>
|
||
<td></td><td></td>
|
||
</tr>
|
||
</table>
|
||
</div><div class="memdoc">
|
||
|
||
<p>三角形-AABB 快速相交测试 </p>
|
||
<p>使用分离轴定理在三角形和轴对齐包围盒之间检测。 候选分离轴包括(共 13 轴):</p><ul>
|
||
<li>3 条 AABB 面法线</li>
|
||
<li>1 条三角形面法线</li>
|
||
<li>9 条边×边叉积(3 条 AABB 边 × 3 条三角形边)</li>
|
||
</ul>
|
||
<p>复杂度 O(1)。</p>
|
||
<dl class="params"><dt>参数</dt><dd>
|
||
<table class="params">
|
||
<tr><td class="paramname">tri</td><td>三角形 </td></tr>
|
||
<tr><td class="paramname">box</td><td>轴对齐包围盒 </td></tr>
|
||
</table>
|
||
</dd>
|
||
</dl>
|
||
<dl class="section return"><dt>返回</dt><dd>相交返回 true</dd></dl>
|
||
<dl class="section note"><dt>注解</dt><dd>AABB 碰撞比三角剖分后的三角-三角检测更高效, 常用于空间划分结构中的 rejection test。</dd></dl>
|
||
<div class="fragment"><div class="line"><span class="keywordflow">if</span> (<a class="code" href="namespacevde_1_1collision.html#ab98fd10e5a839ea5b50c8abad616ea1e">tri_aabb_overlap</a>(tri, node_bounds)) {</div>
|
||
<div class="line"> <span class="comment">// 需要进一步检测节点内的三角形</span></div>
|
||
<div class="line">}</div>
|
||
<div class="ttc" id="anamespacevde_1_1collision_html_ab98fd10e5a839ea5b50c8abad616ea1e"><div class="ttname"><a href="namespacevde_1_1collision.html#ab98fd10e5a839ea5b50c8abad616ea1e">vde::collision::tri_aabb_overlap</a></div><div class="ttdeci">bool tri_aabb_overlap(const Triangle3D &tri, const AABB3D &box)</div><div class="ttdoc">三角形-AABB 快速相交测试</div></div>
|
||
</div><!-- fragment --><dl class="section see"><dt>参见</dt><dd><a class="el" href="namespacevde_1_1collision.html#a2619bea32ceec177a9eadb3a289b81e7" title="三角形-三角形相交检测(布尔测试)">tri_tri_intersect</a>, <a class="el" href="namespacevde_1_1collision.html#aadf0358f85176f74f8be21e7d74c5aa8" title="射线-AABB 求交(slab 方法)">ray_aabb_intersect</a> </dd></dl>
|
||
|
||
</div>
|
||
</div>
|
||
<a id="a2619bea32ceec177a9eadb3a289b81e7"></a>
|
||
<h2 class="memtitle"><span class="permalink"><a href="#a2619bea32ceec177a9eadb3a289b81e7">◆ </a></span>tri_tri_intersect()</h2>
|
||
|
||
<div class="memitem">
|
||
<div class="memproto">
|
||
<table class="memname">
|
||
<tr>
|
||
<td class="memname">bool vde::collision::tri_tri_intersect </td>
|
||
<td>(</td>
|
||
<td class="paramtype">const Triangle3D & </td>
|
||
<td class="paramname"><em>t1</em>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">const Triangle3D & </td>
|
||
<td class="paramname"><em>t2</em> </td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>)</td>
|
||
<td></td><td></td>
|
||
</tr>
|
||
</table>
|
||
</div><div class="memdoc">
|
||
|
||
<p>三角形-三角形相交检测(布尔测试) </p>
|
||
<p>使用分离轴定理在两组三角形之间检测相交。 候选分离轴包括:</p><ul>
|
||
<li>每个三角形的面法线(2 轴)</li>
|
||
<li>每对边的叉积(3×3 = 9 轴)</li>
|
||
<li>共 11 轴(三角形退化为共面时可能有更多)</li>
|
||
</ul>
|
||
<p>若存在一条轴使得两三角形投影区间不重叠 → 不相交。</p>
|
||
<p>复杂度 O(1)(固定 11+ 轴检测)。</p>
|
||
<dl class="params"><dt>参数</dt><dd>
|
||
<table class="params">
|
||
<tr><td class="paramname">t1</td><td>三角形 1 </td></tr>
|
||
<tr><td class="paramname">t2</td><td>三角形 2 </td></tr>
|
||
</table>
|
||
</dd>
|
||
</dl>
|
||
<dl class="section return"><dt>返回</dt><dd>相交返回 true</dd></dl>
|
||
<div class="fragment"><div class="line"><a class="code" href="namespacevde_1_1core.html#a2d5a2fbdd5b868a1f767d069322d0acd">Triangle3D</a> t1 = {p0, p1, p2};</div>
|
||
<div class="line"><a class="code" href="namespacevde_1_1core.html#a2d5a2fbdd5b868a1f767d069322d0acd">Triangle3D</a> t2 = {q0, q1, q2};</div>
|
||
<div class="line"><span class="keywordflow">if</span> (<a class="code" href="namespacevde_1_1collision.html#a2619bea32ceec177a9eadb3a289b81e7">tri_tri_intersect</a>(t1, t2)) {</div>
|
||
<div class="line"> <span class="comment">// 处理碰撞</span></div>
|
||
<div class="line">}</div>
|
||
<div class="ttc" id="anamespacevde_1_1collision_html_a2619bea32ceec177a9eadb3a289b81e7"><div class="ttname"><a href="namespacevde_1_1collision.html#a2619bea32ceec177a9eadb3a289b81e7">vde::collision::tri_tri_intersect</a></div><div class="ttdeci">bool tri_tri_intersect(const Triangle3D &t1, const Triangle3D &t2)</div><div class="ttdoc">三角形-三角形相交检测(布尔测试)</div></div>
|
||
<div class="ttc" id="anamespacevde_1_1core_html_a2d5a2fbdd5b868a1f767d069322d0acd"><div class="ttname"><a href="namespacevde_1_1core.html#a2d5a2fbdd5b868a1f767d069322d0acd">vde::core::Triangle3D</a></div><div class="ttdeci">Triangle< double > Triangle3D</div><div class="ttdoc">双精度三维三角形</div><div class="ttdef"><b>Definition:</b> <a href="triangle_8h_source.html#l00105">triangle.h:105</a></div></div>
|
||
</div><!-- fragment --><dl class="section see"><dt>参见</dt><dd><a class="el" href="namespacevde_1_1collision.html#a32de39cbf1ec266815484d710f25562d" title="三角形-三角形详细相交检测">tri_tri_intersect_detailed</a>, <a class="el" href="namespacevde_1_1collision.html#a9f6682f6d1174baa3cbb86bf2584d663" title="SAT 凸多面体相交检测">sat_intersect</a> </dd></dl>
|
||
|
||
</div>
|
||
</div>
|
||
<a id="a32de39cbf1ec266815484d710f25562d"></a>
|
||
<h2 class="memtitle"><span class="permalink"><a href="#a32de39cbf1ec266815484d710f25562d">◆ </a></span>tri_tri_intersect_detailed()</h2>
|
||
|
||
<div class="memitem">
|
||
<div class="memproto">
|
||
<table class="memname">
|
||
<tr>
|
||
<td class="memname"><a class="el" href="structvde_1_1collision_1_1TriTriIntersection.html">TriTriIntersection</a> vde::collision::tri_tri_intersect_detailed </td>
|
||
<td>(</td>
|
||
<td class="paramtype">const Triangle3D & </td>
|
||
<td class="paramname"><em>t1</em>, </td>
|
||
</tr>
|
||
<tr>
|
||
<td class="paramkey"></td>
|
||
<td></td>
|
||
<td class="paramtype">const Triangle3D & </td>
|
||
<td class="paramname"><em>t2</em> </td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>)</td>
|
||
<td></td><td></td>
|
||
</tr>
|
||
</table>
|
||
</div><div class="memdoc">
|
||
|
||
<p>三角形-三角形详细相交检测 </p>
|
||
<p>返回两三角形相交的交点线段(两个端点)。 适用于需要精确接触几何的场景,如:</p><ul>
|
||
<li>物理引擎的接触流形生成</li>
|
||
<li>CSG 构造体几何的精确分割线</li>
|
||
<li>网格自交修复</li>
|
||
</ul>
|
||
<p>算法:</p><ol type="1">
|
||
<li>用平面方程计算各顶点到对方平面的有符号距离</li>
|
||
<li>找到边-平面交点形成交集段</li>
|
||
<li>限制交集段到两个三角形内部</li>
|
||
</ol>
|
||
<dl class="params"><dt>参数</dt><dd>
|
||
<table class="params">
|
||
<tr><td class="paramname">t1</td><td>三角形 1 </td></tr>
|
||
<tr><td class="paramname">t2</td><td>三角形 2 </td></tr>
|
||
</table>
|
||
</dd>
|
||
</dl>
|
||
<dl class="section return"><dt>返回</dt><dd>TriTriIntersection:相交标志 + 交点段端点</dd></dl>
|
||
<dl class="section note"><dt>注解</dt><dd>共面情况交集段可能退化为单点(p0 == p1)</dd></dl>
|
||
<div class="fragment"><div class="line"><span class="keyword">auto</span> sect = <a class="code" href="namespacevde_1_1collision.html#a32de39cbf1ec266815484d710f25562d">tri_tri_intersect_detailed</a>(t1, t2);</div>
|
||
<div class="line"><span class="keywordflow">if</span> (sect.intersects) {</div>
|
||
<div class="line"> <a class="code" href="namespacevde_1_1core.html#ab763c018d19e10e91a6c6d6ab2ccc8e0">Vector3D</a> contact_normal = (t1.normal() + t2.normal()).normalized();</div>
|
||
<div class="line"> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> midpoint = (sect.p0 + sect.p1) * 0.5;</div>
|
||
<div class="line">}</div>
|
||
<div class="ttc" id="anamespacevde_1_1collision_html_a32de39cbf1ec266815484d710f25562d"><div class="ttname"><a href="namespacevde_1_1collision.html#a32de39cbf1ec266815484d710f25562d">vde::collision::tri_tri_intersect_detailed</a></div><div class="ttdeci">TriTriIntersection tri_tri_intersect_detailed(const Triangle3D &t1, const Triangle3D &t2)</div><div class="ttdoc">三角形-三角形详细相交检测</div></div>
|
||
</div><!-- fragment --><dl class="section see"><dt>参见</dt><dd><a class="el" href="namespacevde_1_1collision.html#a2619bea32ceec177a9eadb3a289b81e7" title="三角形-三角形相交检测(布尔测试)">tri_tri_intersect</a> </dd></dl>
|
||
|
||
</div>
|
||
</div>
|
||
</div><!-- contents -->
|
||
</div><!-- doc-content -->
|
||
<!-- start footer part -->
|
||
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
|
||
<ul>
|
||
<li class="navelem"><a class="el" href="namespacevde.html">vde</a></li><li class="navelem"><a class="el" href="namespacevde_1_1collision.html">collision</a></li>
|
||
<li class="footer">生成于 2026年 七月 24日 星期五 11:21:23 , 为 ViewDesignEngine使用 <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </li>
|
||
</ul>
|
||
</div>
|
||
</body>
|
||
</html>
|