Files
ViewDesignEngine/docs/api/namespacevde_1_1collision.html
T
茂之钳 2f111edcd5
CI / Build & Test (push) Failing after 33s
CI / Release Build (push) Failing after 31s
Build & Test / build-and-test (push) Has been cancelled
Build & Test / python-bindings (push) Has been cancelled
docs: generated API documentation (483 pages)
2026-07-24 11:55:47 +00:00

1083 lines
66 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!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
&#160;<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&amp;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&amp;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&amp;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> &#124;
<a href="#typedef-members">类型定义</a> &#124;
<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 &#160;</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">&#160;</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">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</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">&#160;</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">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</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">&#160;</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">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</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">&#160;</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">&#160;</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&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1collision.html#aab5bef8f2eb03e706f2404b19d109f20">SupportFunc</a> = std::function&lt; Point3D(const Vector3D &amp;)&gt;</td></tr>
<tr class="memdesc:aab5bef8f2eb03e706f2404b19d109f20"><td class="mdescLeft">&#160;</td><td class="mdescRight">支撑函数类型 <a href="namespacevde_1_1collision.html#aab5bef8f2eb03e706f2404b19d109f20">更多...</a><br /></td></tr>
<tr class="separator:aab5bef8f2eb03e706f2404b19d109f20"><td class="memSeparator" colspan="2">&#160;</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&#160;</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> &amp;shape_a, const <a class="el" href="namespacevde_1_1collision.html#aab5bef8f2eb03e706f2404b19d109f20">SupportFunc</a> &amp;shape_b)</td></tr>
<tr class="memdesc:a9554e414cb05e02a8e04a7eb8c3507ea"><td class="mdescLeft">&#160;</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">&#160;</td></tr>
<tr class="memitem:ad090fdef5721a774a5875c45e07450ca"><td class="memItemLeft" align="right" valign="top">double&#160;</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> &amp;shape_a, const <a class="el" href="namespacevde_1_1collision.html#aab5bef8f2eb03e706f2404b19d109f20">SupportFunc</a> &amp;shape_b)</td></tr>
<tr class="memdesc:ad090fdef5721a774a5875c45e07450ca"><td class="mdescLeft">&#160;</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">&#160;</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>&#160;</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> &amp;shape_a, const <a class="el" href="namespacevde_1_1collision.html#aab5bef8f2eb03e706f2404b19d109f20">SupportFunc</a> &amp;shape_b)</td></tr>
<tr class="memdesc:a11d806e590e12712a7a183b3244051ca"><td class="mdescLeft">&#160;</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">&#160;</td></tr>
<tr class="memitem:ac761ad3914196268cd6f12b700a776df"><td class="memItemLeft" align="right" valign="top">std::optional&lt; <a class="el" href="structvde_1_1collision_1_1RayTriResult.html">RayTriResult</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1collision.html#ac761ad3914196268cd6f12b700a776df">ray_triangle_intersect</a> (const Point3D &amp;origin, const Vector3D &amp;dir, const Triangle3D &amp;tri)</td></tr>
<tr class="memdesc:ac761ad3914196268cd6f12b700a776df"><td class="mdescLeft">&#160;</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">&#160;</td></tr>
<tr class="memitem:a5f92a056f5fdc032031e55e0edcc7612"><td class="memItemLeft" align="right" valign="top">std::optional&lt; <a class="el" href="structvde_1_1collision_1_1RayTriResult.html">RayTriResult</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1collision.html#a5f92a056f5fdc032031e55e0edcc7612">ray_triangle_intersect</a> (const Ray3Dd &amp;ray, const Triangle3D &amp;tri)</td></tr>
<tr class="memdesc:a5f92a056f5fdc032031e55e0edcc7612"><td class="mdescLeft">&#160;</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">&#160;</td></tr>
<tr class="memitem:aadf0358f85176f74f8be21e7d74c5aa8"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1collision.html#aadf0358f85176f74f8be21e7d74c5aa8">ray_aabb_intersect</a> (const Ray3Dd &amp;ray, const AABB3D &amp;box, double &amp;tmin_out, double &amp;tmax_out)</td></tr>
<tr class="memdesc:aadf0358f85176f74f8be21e7d74c5aa8"><td class="mdescLeft">&#160;</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">&#160;</td></tr>
<tr class="memitem:afb15db2efe7b288e38f3fa95f1d6346f"><td class="memItemLeft" align="right" valign="top">std::optional&lt; <a class="el" href="structvde_1_1collision_1_1RaySphereResult.html">RaySphereResult</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1collision.html#afb15db2efe7b288e38f3fa95f1d6346f">ray_sphere_intersect</a> (const Point3D &amp;origin, const Vector3D &amp;dir, const Point3D &amp;center, double radius)</td></tr>
<tr class="memdesc:afb15db2efe7b288e38f3fa95f1d6346f"><td class="mdescLeft">&#160;</td><td class="mdescRight">射线-球体求交(解析法) <a href="namespacevde_1_1collision.html#afb15db2efe7b288e38f3fa95f1d6346f">更多...</a><br /></td></tr>
<tr class="separator:afb15db2efe7b288e38f3fa95f1d6346f"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab172d7bca6a4b2d82248d48353a645b8"><td class="memItemLeft" align="right" valign="top">std::optional&lt; <a class="el" href="structvde_1_1collision_1_1RaySphereResult.html">RaySphereResult</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1collision.html#ab172d7bca6a4b2d82248d48353a645b8">ray_sphere_intersect</a> (const Ray3Dd &amp;ray, const Point3D &amp;center, double radius)</td></tr>
<tr class="memdesc:ab172d7bca6a4b2d82248d48353a645b8"><td class="mdescLeft">&#160;</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">&#160;</td></tr>
<tr class="memitem:aa059e38552bbe3a1cb14745829492823"><td class="memItemLeft" align="right" valign="top">std::optional&lt; double &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1collision.html#aa059e38552bbe3a1cb14745829492823">ray_plane_intersect</a> (const Point3D &amp;origin, const Vector3D &amp;dir, const Point3D &amp;plane_point, const Vector3D &amp;plane_normal)</td></tr>
<tr class="memdesc:aa059e38552bbe3a1cb14745829492823"><td class="mdescLeft">&#160;</td><td class="mdescRight">射线-平面求交 <a href="namespacevde_1_1collision.html#aa059e38552bbe3a1cb14745829492823">更多...</a><br /></td></tr>
<tr class="separator:aa059e38552bbe3a1cb14745829492823"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a3d2f4adb2305bc52bd977baf8ff35355"><td class="memItemLeft" align="right" valign="top">std::optional&lt; double &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1collision.html#a3d2f4adb2305bc52bd977baf8ff35355">ray_plane_intersect</a> (const Ray3Dd &amp;ray, const Point3D &amp;plane_point, const Vector3D &amp;plane_normal)</td></tr>
<tr class="memdesc:a3d2f4adb2305bc52bd977baf8ff35355"><td class="mdescLeft">&#160;</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">&#160;</td></tr>
<tr class="memitem:a700a4e58df7b2f6cc8676e64881a5c66"><td class="memItemLeft" align="right" valign="top">std::optional&lt; <a class="el" href="structvde_1_1collision_1_1RayTriResult.html">RayTriResult</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1collision.html#a700a4e58df7b2f6cc8676e64881a5c66">ray_mesh_intersect</a> (const Point3D &amp;origin, const Vector3D &amp;dir, const std::vector&lt; Triangle3D &gt; &amp;triangles)</td></tr>
<tr class="memdesc:a700a4e58df7b2f6cc8676e64881a5c66"><td class="mdescLeft">&#160;</td><td class="mdescRight">射线-网格求交(暴力遍历) <a href="namespacevde_1_1collision.html#a700a4e58df7b2f6cc8676e64881a5c66">更多...</a><br /></td></tr>
<tr class="separator:a700a4e58df7b2f6cc8676e64881a5c66"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ad4a8e90b8d55662cdfce2aac395971aa"><td class="memItemLeft" align="right" valign="top">std::optional&lt; <a class="el" href="structvde_1_1collision_1_1RayTriResult.html">RayTriResult</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1collision.html#ad4a8e90b8d55662cdfce2aac395971aa">ray_mesh_intersect</a> (const Ray3Dd &amp;ray, const std::vector&lt; Triangle3D &gt; &amp;triangles)</td></tr>
<tr class="memdesc:ad4a8e90b8d55662cdfce2aac395971aa"><td class="mdescLeft">&#160;</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">&#160;</td></tr>
<tr class="memitem:a9f6682f6d1174baa3cbb86bf2584d663"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1collision.html#a9f6682f6d1174baa3cbb86bf2584d663">sat_intersect</a> (const std::vector&lt; Point3D &gt; &amp;verts_a, const std::vector&lt; std::array&lt; int, 3 &gt;&gt; &amp;faces_a, const std::vector&lt; Point3D &gt; &amp;verts_b, const std::vector&lt; std::array&lt; int, 3 &gt;&gt; &amp;faces_b)</td></tr>
<tr class="memdesc:a9f6682f6d1174baa3cbb86bf2584d663"><td class="mdescLeft">&#160;</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">&#160;</td></tr>
<tr class="memitem:a2619bea32ceec177a9eadb3a289b81e7"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1collision.html#a2619bea32ceec177a9eadb3a289b81e7">tri_tri_intersect</a> (const Triangle3D &amp;t1, const Triangle3D &amp;t2)</td></tr>
<tr class="memdesc:a2619bea32ceec177a9eadb3a289b81e7"><td class="mdescLeft">&#160;</td><td class="mdescRight">三角形-三角形相交检测(布尔测试) <a href="namespacevde_1_1collision.html#a2619bea32ceec177a9eadb3a289b81e7">更多...</a><br /></td></tr>
<tr class="separator:a2619bea32ceec177a9eadb3a289b81e7"><td class="memSeparator" colspan="2">&#160;</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>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1collision.html#a32de39cbf1ec266815484d710f25562d">tri_tri_intersect_detailed</a> (const Triangle3D &amp;t1, const Triangle3D &amp;t2)</td></tr>
<tr class="memdesc:a32de39cbf1ec266815484d710f25562d"><td class="mdescLeft">&#160;</td><td class="mdescRight">三角形-三角形详细相交检测 <a href="namespacevde_1_1collision.html#a32de39cbf1ec266815484d710f25562d">更多...</a><br /></td></tr>
<tr class="separator:a32de39cbf1ec266815484d710f25562d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab98fd10e5a839ea5b50c8abad616ea1e"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1collision.html#ab98fd10e5a839ea5b50c8abad616ea1e">tri_aabb_overlap</a> (const Triangle3D &amp;tri, const AABB3D &amp;box)</td></tr>
<tr class="memdesc:ab98fd10e5a839ea5b50c8abad616ea1e"><td class="mdescLeft">&#160;</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">&#160;</td></tr>
</table>
<h2 class="groupheader">类型定义说明</h2>
<a id="aab5bef8f2eb03e706f2404b19d109f20"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aab5bef8f2eb03e706f2404b19d109f20">&#9670;&nbsp;</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&lt;Point3D(const Vector3D&amp;)&gt;</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>&amp; 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">&#9670;&nbsp;</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> &amp;&#160;</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> &amp;&#160;</td>
<td class="paramname"><em>shape_b</em>&#160;</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">&#9670;&nbsp;</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> &amp;&#160;</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> &amp;&#160;</td>
<td class="paramname"><em>shape_b</em>&#160;</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 &amp;shape_a, const SupportFunc &amp;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">&#9670;&nbsp;</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> &amp;&#160;</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> &amp;&#160;</td>
<td class="paramname"><em>shape_b</em>&#160;</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 为迭代次数(通常 &lt; 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 = [&amp;](<span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ab763c018d19e10e91a6c6d6ab2ccc8e0">Vector3D</a>&amp; 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 = [&amp;](<span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ab763c018d19e10e91a6c6d6ab2ccc8e0">Vector3D</a>&amp; 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 &gt; 0 ? 1 : -1),</div>
<div class="line"> half_extent.y * (d.y &gt; 0 ? 1 : -1),</div>
<div class="line"> half_extent.z * (d.z &gt; 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 &amp;shape_a, const SupportFunc &amp;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">&#9670;&nbsp;</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 &amp;&#160;</td>
<td class="paramname"><em>ray</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const AABB3D &amp;&#160;</td>
<td class="paramname"><em>box</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">double &amp;&#160;</td>
<td class="paramname"><em>tmin_out</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">double &amp;&#160;</td>
<td class="paramname"><em>tmax_out</em>&#160;</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">&#9670;&nbsp;</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&lt;<a class="el" href="structvde_1_1collision_1_1RayTriResult.html">RayTriResult</a>&gt; vde::collision::ray_mesh_intersect </td>
<td>(</td>
<td class="paramtype">const Point3D &amp;&#160;</td>
<td class="paramname"><em>origin</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const Vector3D &amp;&#160;</td>
<td class="paramname"><em>dir</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const std::vector&lt; Triangle3D &gt; &amp;&#160;</td>
<td class="paramname"><em>triangles</em>&#160;</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">&#9670;&nbsp;</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&lt;<a class="el" href="structvde_1_1collision_1_1RayTriResult.html">RayTriResult</a>&gt; vde::collision::ray_mesh_intersect </td>
<td>(</td>
<td class="paramtype">const Ray3Dd &amp;&#160;</td>
<td class="paramname"><em>ray</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const std::vector&lt; Triangle3D &gt; &amp;&#160;</td>
<td class="paramname"><em>triangles</em>&#160;</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">&#9670;&nbsp;</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&lt;double&gt; vde::collision::ray_plane_intersect </td>
<td>(</td>
<td class="paramtype">const Point3D &amp;&#160;</td>
<td class="paramname"><em>origin</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const Vector3D &amp;&#160;</td>
<td class="paramname"><em>dir</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const Point3D &amp;&#160;</td>
<td class="paramname"><em>plane_point</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const Vector3D &amp;&#160;</td>
<td class="paramname"><em>plane_normal</em>&#160;</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">&#9670;&nbsp;</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&lt;double&gt; vde::collision::ray_plane_intersect </td>
<td>(</td>
<td class="paramtype">const Ray3Dd &amp;&#160;</td>
<td class="paramname"><em>ray</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const Point3D &amp;&#160;</td>
<td class="paramname"><em>plane_point</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const Vector3D &amp;&#160;</td>
<td class="paramname"><em>plane_normal</em>&#160;</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">&#9670;&nbsp;</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&lt;<a class="el" href="structvde_1_1collision_1_1RaySphereResult.html">RaySphereResult</a>&gt; vde::collision::ray_sphere_intersect </td>
<td>(</td>
<td class="paramtype">const Point3D &amp;&#160;</td>
<td class="paramname"><em>origin</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const Vector3D &amp;&#160;</td>
<td class="paramname"><em>dir</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const Point3D &amp;&#160;</td>
<td class="paramname"><em>center</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">double&#160;</td>
<td class="paramname"><em>radius</em>&#160;</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>Δ &lt; 0 → 无交点</li>
<li>Δ = 0 → 切点(一个交点)</li>
<li>Δ &gt; 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">&#9670;&nbsp;</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&lt;<a class="el" href="structvde_1_1collision_1_1RaySphereResult.html">RaySphereResult</a>&gt; vde::collision::ray_sphere_intersect </td>
<td>(</td>
<td class="paramtype">const Ray3Dd &amp;&#160;</td>
<td class="paramname"><em>ray</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const Point3D &amp;&#160;</td>
<td class="paramname"><em>center</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">double&#160;</td>
<td class="paramname"><em>radius</em>&#160;</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">&#9670;&nbsp;</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&lt;<a class="el" href="structvde_1_1collision_1_1RayTriResult.html">RayTriResult</a>&gt; vde::collision::ray_triangle_intersect </td>
<td>(</td>
<td class="paramtype">const Point3D &amp;&#160;</td>
<td class="paramname"><em>origin</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const Vector3D &amp;&#160;</td>
<td class="paramname"><em>dir</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const Triangle3D &amp;&#160;</td>
<td class="paramname"><em>tri</em>&#160;</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 = v1v0, e2 = v2v0</li>
<li>计算 pvec = dir × e2, det = dot(e1, pvec)</li>
<li>若 |det| &lt; ε → 射线平行于三角形(无命中)</li>
<li>计算 tvec = originv0, u, v, t</li>
<li>验证 u≥0, v≥0, u+v≤1, t&gt;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 &lt;&lt; <span class="stringliteral">&quot;Hit at t=&quot;</span> &lt;&lt; hit-&gt;t</div>
<div class="line"> &lt;&lt; <span class="stringliteral">&quot; barycentric=(&quot;</span> &lt;&lt; hit-&gt;u &lt;&lt; <span class="stringliteral">&quot;,&quot;</span> &lt;&lt; hit-&gt;v &lt;&lt; <span class="stringliteral">&quot;)\n&quot;</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&lt; RayTriResult &gt; ray_triangle_intersect(const Point3D &amp;origin, const Vector3D &amp;dir, const Triangle3D &amp;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">&#9670;&nbsp;</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&lt;<a class="el" href="structvde_1_1collision_1_1RayTriResult.html">RayTriResult</a>&gt; vde::collision::ray_triangle_intersect </td>
<td>(</td>
<td class="paramtype">const Ray3Dd &amp;&#160;</td>
<td class="paramname"><em>ray</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const Triangle3D &amp;&#160;</td>
<td class="paramname"><em>tri</em>&#160;</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">&#9670;&nbsp;</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&lt; Point3D &gt; &amp;&#160;</td>
<td class="paramname"><em>verts_a</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const std::vector&lt; std::array&lt; int, 3 &gt;&gt; &amp;&#160;</td>
<td class="paramname"><em>faces_a</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const std::vector&lt; Point3D &gt; &amp;&#160;</td>
<td class="paramname"><em>verts_b</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const std::vector&lt; std::array&lt; int, 3 &gt;&gt; &amp;&#160;</td>
<td class="paramname"><em>faces_b</em>&#160;</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&lt;Point3D&gt; va = {{0,0,0}, {1,0,0}, {0,1,0}, {0,0,1}};</div>
<div class="line">std::vector&lt;std::array&lt;int,3&gt;&gt; fa = {{0,2,1}, {0,1,3}, {0,3,2}, {1,2,3}};</div>
<div class="line">std::vector&lt;Point3D&gt; vb = {{0.5,0.5,0.5}, {1.5,0.5,0.5}, ...};</div>
<div class="line">std::vector&lt;std::array&lt;int,3&gt;&gt; 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&lt; Point3D &gt; &amp;verts_a, const std::vector&lt; std::array&lt; int, 3 &gt;&gt; &amp;faces_a, const std::vector&lt; Point3D &gt; &amp;verts_b, const std::vector&lt; std::array&lt; int, 3 &gt;&gt; &amp;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">&#9670;&nbsp;</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 &amp;&#160;</td>
<td class="paramname"><em>tri</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const AABB3D &amp;&#160;</td>
<td class="paramname"><em>box</em>&#160;</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 &amp;tri, const AABB3D &amp;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">&#9670;&nbsp;</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 &amp;&#160;</td>
<td class="paramname"><em>t1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const Triangle3D &amp;&#160;</td>
<td class="paramname"><em>t2</em>&#160;</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 &amp;t1, const Triangle3D &amp;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&lt; double &gt; 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">&#9670;&nbsp;</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 &amp;&#160;</td>
<td class="paramname"><em>t1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const Triangle3D &amp;&#160;</td>
<td class="paramname"><em>t2</em>&#160;</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 &amp;t1, const Triangle3D &amp;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>