{"id":4866,"date":"2020-12-08T15:39:06","date_gmt":"2020-12-08T07:39:06","guid":{"rendered":"https:\/\/damogame.cn\/wordpress\/?p=4866"},"modified":"2020-12-08T15:39:06","modified_gmt":"2020-12-08T07:39:06","slug":"recast%e6%ba%90%e7%a0%81%e8%a7%a3%e6%9e%90%ef%bc%88%e4%b8%80%ef%bc%89%ef%bc%9a%e5%b0%84%e7%ba%bf%e5%ae%9e%e7%8e%b0%e5%8e%9f%e7%90%86","status":"publish","type":"post","link":"https:\/\/i007.cc\/wordpress\/archives\/4866","title":{"rendered":"Recast\u6e90\u7801\u89e3\u6790\uff08\u4e00\uff09\uff1a\u5c04\u7ebf\u5b9e\u73b0\u539f\u7406"},"content":{"rendered":"<div class=\"article-header-box\">\n<div class=\"article-header\">\n<div class=\"article-title-box\"><\/div>\n<div class=\"article-info-box\">\n<div class=\"operating\"><a href=\"https:\/\/blog.csdn.net\/needmorecode\/article\/details\/81416553\">\u539f\u6587\u5730\u5740<\/a><\/div>\n<div><\/div>\n<\/div>\n<\/div>\n<\/div>\n<article class=\"baidu_pl\">\n<div id=\"article_content\" class=\"article_content clearfix\">\n<div id=\"content_views\" class=\"markdown_views\">\n<p>\u6700\u8fd1\u516c\u53f8\u7684\u9879\u76ee\u7528\u5230\u4e86recast\u505a\u670d\u52a1\u7aef\u5bfb\u8def\uff0c\u81ea\u5df1\u5728\u4f7f\u7528\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u5176\u5982\u4f55\u5b9e\u73b0\u7f51\u683c\u5bfb\u8def\u5f88\u611f\u5174\u8da3\uff0c\u6839\u636e\u9700\u8981\u7814\u8bfb\u8fc7\u90e8\u5206\u5b9e\u73b0\u4ee3\u7801\uff0c\u540c\u65f6\u4e5f\u53d1\u73b0\u7f51\u4e0a\u5173\u4e8e\u6e90\u7801\u5206\u6790\u65b9\u9762\u7684\u8d44\u6599\u8f83\u5c11\uff0c\u56e0\u6b64\u8fd9\u91cc\u6253\u7b97\u5199\u6210\u4e00\u7ec4\u7cfb\u5217\u505a\u4e2a\u603b\u7ed3\u3002\u672c\u6587\u662f\u9488\u5bf9recast\u4e2d\u7684\u4e00\u4e2a\u5c04\u7ebf\u65b9\u6cd5\uff08InputGeom::raycastMesh\uff09\uff0c\u7ed3\u5408\u4ee3\u7801\u63a2\u8ba8\u5176\u5b9e\u73b0\u539f\u7406\uff0c\u5e76\u5728\u6b64\u8fc7\u7a0b\u4e2d\u7a7f\u63d2\u76f8\u5e94\u6570\u5b66\u89e3\u91ca\u3002<\/p>\n<h2 id=\"recast\u7b80\u4ecb\"><a name=\"t0\"><\/a><a name=\"t0\"><\/a>recast\u7b80\u4ecb<\/h2>\n<p>\u8bf4\u5230\u5bfb\u8def\uff0c\u4e3b\u6d41\u7684\u5730\u5f62\u5efa\u6a21\u65b9\u6cd5\u6709\u4e09\u79cd\uff1a<strong>grid\uff08\u65b9\u683c\uff09\u3001waypoint\uff08\u8def\u70b9\uff09\u548cnavmesh\uff08\u5bfc\u822a\u7f51\u683c\uff09<\/strong>\uff08\u53c2\u89c1\u300a\u6e38\u620f\u4eba\u5de5\u667a\u80fd\uff1a\u5bfb\u627e\u4e00\u4e2a\u7a7a\u95f4\u5bfb\u8def\u8868\u5f81\u300b\uff09\u3002\u800crecast\u5c31\u662f\u4f7f\u7528navmesh\u4f5c\u4e3a\u6a21\u578b\u7684\u4e00\u4e2a\u5e94\u7528\u5e7f\u6cdb\u3001\u529f\u80fd\u5f3a\u5927\u7684\u5f00\u6e90\u9879\u76ee\uff08<a href=\"https:\/\/github.com\/recastnavigation\/recastnavigation\">\u9879\u76ee\u5730\u5740<\/a>\uff09\uff0c\u5b83\u652f\u6301\u5efa\u7f51\u683c\u3001\u5bfb\u8def\u3001\u6dfb\u52a0\u52a8\u6001\u969c\u788d\u3001\u7fa4\u4f53\u5bfb\u8def\u7b49\u8bf8\u591a\u7279\u6027\uff0c\u5e76\u5728unity\u548cunreal\u7b49\u8457\u540d\u5f15\u64ce\u4e0a\u90fd\u6709\u5e94\u7528\u3002<\/p>\n<h2 id=\"\u6838\u5fc3\u95ee\u9898\u5c04\u7ebf\u4e0e\u7f51\u683c\u6c42\u4ea4\u70b9\"><a name=\"t1\"><\/a><a name=\"t1\"><\/a>\u6838\u5fc3\u95ee\u9898\uff1a\u5c04\u7ebf\u4e0e\u7f51\u683c\u6c42\u4ea4\u70b9<\/h2>\n<p>recast\u4e3b\u8981\u5206\u4e3a\u4e24\u90e8\u5206\uff1arecast\uff08\u5efa\u7f51\u683c\uff09\u548cdetour\uff08\u5bfb\u8def\uff09\u3002\u867d\u7136\u5728\u8fc7\u7a0b\u4e2d\u6d89\u53ca\u5230\u590d\u6742\u7684\u6570\u636e\u7ed3\u6784\u548c\u6570\u5b66\u539f\u7406\uff0c\u4f46\u662f\u8fd9\u91cc\u53ea\u9488\u5bf9\u5176\u4e2d\u4e00\u4e2a\u7279\u6027\uff1a\u5c04\u7ebf\u4e0enavmesh\u6c42\u4ea4\u70b9\uff0c\u63a2\u8ba8\u5176\u5b9e\u73b0\u539f\u7406\u3002\u5177\u4f53\u7684\u5e94\u7528\u573a\u666f\u6709\uff1a<\/p>\n<ol>\n<li><strong>\u5728recast\u5b98\u65b9\u7684demo\u4e2d\uff0c\u6839\u636e\u5c4f\u5e55\u70b9\u51fb\u4f4d\u7f6e\u786e\u5b9a\u5bfb\u8def\u7684\u8d77\u70b9\u548c\u7ec8\u70b9\u5750\u6807<\/strong><br \/>\n<img decoding=\"async\" title=\"\" src=\"https:\/\/img-blog.csdn.net\/20180805222500786?watermark\/2\/text\/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25lZWRtb3JlY29kZQ==\/font\/5a6L5L2T\/fontsize\/400\/fill\/I0JBQkFCMA==\/dissolve\/70\" alt=\"\u8fd9\u91cc\u5199\u56fe\u7247\u63cf\u8ff0\" \/><br \/>\n\u5f3a\u70c8\u63a8\u8350\u4e00\u4e0b\u8fd9\u4e2ademo\uff0c\u5b83\u7684\u529f\u80fd\u975e\u5e38\u5f3a\u5927\uff0c\u4ee5\u53ef\u89c6\u5316\u7684\u65b9\u6cd5\u5c55\u793a\u4e86recast\u63d0\u4f9b\u7684\u51e0\u4e4e\u6240\u6709\u529f\u80fd\u3002\u5728\u5bfb\u8def\u7684\u8fc7\u7a0b\u4e2d\uff0c\u901a\u8fc7\u9f20\u6807\u70b9\u51fb\u5373\u53ef\u8bbe\u7f6e\u8d77\u6b62\u70b9\uff0c\u8fd9\u8fc7\u7a0b\u4e2d\u5c31\u662f\u7528\u5230\u5c04\u7ebf\u6765\u6c42\u53d6\u771f\u5b9e\u4e16\u754c\u91cc\u7684\u5750\u6807\u3002<\/li>\n<li><strong>\u5728\u670d\u52a1\u5668\u5bfb\u8def\u4e2d\uff0c\u6839\u636ex\u548cz\u5750\u6807\u6c42\u53d6y\u5750\u6807\uff08\u5730\u8868\u9ad8\u5ea6\uff09<\/strong><br \/>\n\u8fd9\u662f\u5728\u9879\u76ee\u4e2d\u9047\u5230\u7684\u5b9e\u9645\u9700\u6c42\uff1arecast\u7684\u5bfb\u8def\u51fd\u6570\u9700\u8981\u4f20\u8d77\u6b62\u70b9\u7684xyz\u5750\u6807\uff0cx\u548cz\u5750\u6807\u53ef\u4ee5\u5728\u670d\u52a1\u7aef\u4fdd\u5b58\uff0c\u800cy\u5750\u6807\u6211\u4eec\u4e0d\u5e0c\u671b\u4ece\u5ba2\u6237\u7aef\u53d6\uff08\u6d89\u53ca\u5230\u79bb\u7ebf\u548c\u53cd\u5916\u6302\u7684\u95ee\u9898\uff09\uff0c\u800c\u662f\u901a\u8fc7\u670d\u52a1\u7aef\u7684\u5730\u5f62\u6570\u636e\u5b9e\u65f6\u7b97\u51fa\u3002<br \/>\n\u4e0b\u9762\u6211\u4eec\u5c31\u5e94\u7528\u573a\u666f1\u7684\u9700\u6c42\uff0c\u7ed3\u5408\u6e90\u7801\u6765\u505a\u4e00\u4e0b\u5b9e\u73b0\u7ec6\u8282\u4e0a\u7684\u5206\u6790\u3002<\/li>\n<\/ol>\n<h2 id=\"\u6e90\u7801\u89e3\u6790\"><a name=\"t2\"><\/a><a name=\"t2\"><\/a>\u6e90\u7801\u89e3\u6790<\/h2>\n<p>\u9996\u5148\uff0c\u5c06\u5c04\u7ebf\u7684\u8d77\u70b9\u53d6\u6210\u5c4f\u5e55\u70b9\u51fb\u70b9\uff0c\u7ec8\u70b9\u53d6\u6210\u8d77\u70b9\u7684\u6df1\u5ea6\uff08z\u5750\u6807\uff09\u52a01\uff0c\u8fd9\u6837\u5c04\u7ebf\u4e0enavmesh\u7684\u4ea4\u70b9\u5c31\u8ba4\u4e3a\u662f\u8981\u8bbe\u7f6e\u7684\u8d77\u70b9\u6216\u7ec8\u70b9\u3002\u7136\u540e\uff0c\u5728main.cpp\u4e2d\u901a\u8fc7opengl\u7684\u65b9\u6cd5\u5c06\u9f20\u6807\u70b9\u51fb\u7684\u5c4f\u5e55\u5750\u6807\u8f6c\u6210\u4e16\u754c\u5750\u6807\uff1a<\/p>\n<pre class=\"prettyprint\"><code class=\"hljs cpp has-numbering\">        <span class=\"hljs-comment\">\/\/ Get hit ray position and direction.<\/span>\r\n        GLdouble x, y, z;\r\n        gluUnProject(mousePos[<span class=\"hljs-number\">0<\/span>], mousePos[<span class=\"hljs-number\">1<\/span>], <span class=\"hljs-number\">0.0f<\/span>, modelviewMatrix, projectionMatrix, viewport, &amp;x, &amp;y, &amp;z);\r\n        rayStart[<span class=\"hljs-number\">0<\/span>] = (<span class=\"hljs-keyword\">float<\/span>)x;\r\n        rayStart[<span class=\"hljs-number\">1<\/span>] = (<span class=\"hljs-keyword\">float<\/span>)y;\r\n        rayStart[<span class=\"hljs-number\">2<\/span>] = (<span class=\"hljs-keyword\">float<\/span>)z;\r\n        gluUnProject(mousePos[<span class=\"hljs-number\">0<\/span>], mousePos[<span class=\"hljs-number\">1<\/span>], <span class=\"hljs-number\">1.0f<\/span>, modelviewMatrix, projectionMatrix, viewport, &amp;x, &amp;y, &amp;z);\r\n        rayEnd[<span class=\"hljs-number\">0<\/span>] = (<span class=\"hljs-keyword\">float<\/span>)x;\r\n        rayEnd[<span class=\"hljs-number\">1<\/span>] = (<span class=\"hljs-keyword\">float<\/span>)y;\r\n        rayEnd[<span class=\"hljs-number\">2<\/span>] = (<span class=\"hljs-keyword\">float<\/span>)z;<\/code><\/pre>\n<p>\u63a5\u4e0b\u6765\u5c06\u8d77\u70b9\u3001\u7ec8\u70b9\u5750\u6807rayStart\u548crayEnd\u4f20\u5165\u5982\u4e0b\u51fd\u6570\uff1a<\/p>\n<pre class=\"prettyprint\"><code class=\"hljs perl has-numbering\">bool InputGeom::raycastMesh(float* src, float* dst, float&amp; tmin)\r\n{\r\n    float dir[<span class=\"hljs-number\">3<\/span>];\r\n    rcVsub(dir, dst, src);\r\n\r\n    <span class=\"hljs-regexp\">\/\/<\/span> Prune hit ray.\r\n    float btmin, btmax;\r\n    <span class=\"hljs-keyword\">if<\/span> (!isectSegAABB(src, dst, m_meshBMin, m_meshBMax, btmin, btmax))\r\n        <span class=\"hljs-keyword\">return<\/span> false;\r\n    float p[<span class=\"hljs-number\">2<\/span>], <span class=\"hljs-string\">q[2]<\/span>;\r\n    p[<span class=\"hljs-number\">0<\/span>] = src[<span class=\"hljs-number\">0<\/span>] + (dst[<span class=\"hljs-number\">0<\/span>]-src[<span class=\"hljs-number\">0<\/span>])<span class=\"hljs-variable\">*btmin<\/span>;\r\n    p[<span class=\"hljs-number\">1<\/span>] = src[<span class=\"hljs-number\">2<\/span>] + (dst[<span class=\"hljs-number\">2<\/span>]-src[<span class=\"hljs-number\">2<\/span>])<span class=\"hljs-variable\">*btmin<\/span>;\r\n    <span class=\"hljs-string\">q[0]<\/span> = src[<span class=\"hljs-number\">0<\/span>] + (dst[<span class=\"hljs-number\">0<\/span>]-src[<span class=\"hljs-number\">0<\/span>])<span class=\"hljs-variable\">*btmax<\/span>;\r\n    <span class=\"hljs-string\">q[1]<\/span> = src[<span class=\"hljs-number\">2<\/span>] + (dst[<span class=\"hljs-number\">2<\/span>]-src[<span class=\"hljs-number\">2<\/span>])<span class=\"hljs-variable\">*btmax<\/span>;\r\n\r\n    <span class=\"hljs-keyword\">int<\/span> cid[<span class=\"hljs-number\">512<\/span>];\r\n    const <span class=\"hljs-keyword\">int<\/span> ncid = rcGetChunksOverlappingSegment(m_chunkyMesh, p, <span class=\"hljs-keyword\">q<\/span>, cid, <span class=\"hljs-number\">512<\/span>);\r\n    <span class=\"hljs-keyword\">if<\/span> (!ncid)\r\n        <span class=\"hljs-keyword\">return<\/span> false;\r\n\r\n    tmin = <span class=\"hljs-number\">1.0<\/span>f;\r\n    bool hit = false;\r\n    const float* verts = m_mesh-&gt;getVerts();\r\n\r\n    <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">int<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; ncid; ++i)\r\n    {\r\n        const rcChunkyTriMeshNode&amp; node = m_chunkyMesh-&gt;nodes[cid[i]];\r\n        const <span class=\"hljs-keyword\">int<\/span>* tris = &amp;m_chunkyMesh-&gt;tris[node.i<span class=\"hljs-variable\">*3<\/span>];\r\n        const <span class=\"hljs-keyword\">int<\/span> ntris = node.n;\r\n\r\n        <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">int<\/span> j = <span class=\"hljs-number\">0<\/span>; j &lt; ntris<span class=\"hljs-variable\">*3<\/span>; j += <span class=\"hljs-number\">3<\/span>)\r\n        {\r\n            float t = <span class=\"hljs-number\">1<\/span>;\r\n            <span class=\"hljs-keyword\">if<\/span> (intersectSegmentTriangle(src, dst,\r\n                                         &amp;verts[tris[j]<span class=\"hljs-variable\">*3<\/span>],\r\n                                         &amp;verts[tris[j+<span class=\"hljs-number\">1<\/span>]<span class=\"hljs-variable\">*3<\/span>],\r\n                                         &amp;verts[tris[j+<span class=\"hljs-number\">2<\/span>]<span class=\"hljs-variable\">*3<\/span>], t))\r\n            {\r\n                <span class=\"hljs-keyword\">if<\/span> (t &lt; tmin)\r\n                    tmin = t;\r\n                hit = true;\r\n            }\r\n        }\r\n    }\r\n\r\n    <span class=\"hljs-keyword\">return<\/span> hit;\r\n}<\/code><\/pre>\n<p>isectSegAABB\u51fd\u6570\u7684\u4f5c\u7528\u662f<strong>\u4fee\u526a\u5c04\u7ebf<\/strong>\uff1a\u5b83\u5c06\u6574\u4e2anavmesh\u770b\u6210\u662f\u4e00\u4e2a<strong>AABB\u5305\u56f4\u76d2<\/strong>\uff0c\u5224\u65ad\u5c04\u7ebf\u548c\u5305\u56f4\u76d2\u662f\u5426\u6709\u4ea4\u96c6\uff1b\u82e5\u6ca1\u6709\u5219\u76f4\u63a5return\uff1b\u5426\u5219\u5c06\u5c04\u7ebf\u4e0d\u5728\u76d2\u5185\u7684\u90e8\u5206\u4fee\u526a\u6389\u3002<br \/>\n\u5c06\u4e0b\u6765\u901a\u8fc7rcGetChunksOverlappingSegment\u51fd\u6570<strong>\u6c42\u53d6\u4e8c\u7ef4\u5e73\u9762\u4e0b\u4e0e\u5c04\u7ebf\u6709\u4ea4\u96c6\u7684\u6240\u6709trimesh node\uff08\u4e09\u89d2\u7f51\u683c\u8282\u70b9\uff09<\/strong>\uff08\u53ea\u8003\u8651x\u3001z\u5750\u6807\uff09\u3002\u8fd9\u4e00\u6b65\u7b97\u662f\u7c97\u7b5b\uff0c\u56e0\u4e3a\u4e0d\u6d89\u53ca\u70b9\u4e58\u5dee\u4e58\u7b49\u8017\u65f6\u8fd0\u7b97\uff0c\u6267\u884c\u6548\u7387\u8f83\u9ad8\u3002\u76f8\u5173\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre class=\"prettyprint\"><code class=\"hljs cs has-numbering\"><span class=\"hljs-keyword\">int<\/span> rcGetChunksOverlappingSegment(<span class=\"hljs-keyword\">const<\/span> rcChunkyTriMesh* cm,\r\n                                  <span class=\"hljs-keyword\">float<\/span> p[<span class=\"hljs-number\">2<\/span>], <span class=\"hljs-keyword\">float<\/span> q[<span class=\"hljs-number\">2<\/span>],\r\n                                  <span class=\"hljs-keyword\">int<\/span>* ids, <span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">int<\/span> maxIds)\r\n{\r\n    <span class=\"hljs-comment\">\/\/ Traverse tree<\/span>\r\n    <span class=\"hljs-keyword\">int<\/span> i = <span class=\"hljs-number\">0<\/span>;\r\n    <span class=\"hljs-keyword\">int<\/span> n = <span class=\"hljs-number\">0<\/span>;\r\n    <span class=\"hljs-keyword\">while<\/span> (i &lt; cm-&gt;nnodes)\r\n    {\r\n        <span class=\"hljs-keyword\">const<\/span> rcChunkyTriMeshNode* node = &amp;cm-&gt;nodes[i];\r\n        <span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">bool<\/span> overlap = checkOverlapSegment(p, q, node-&gt;bmin, node-&gt;bmax);\r\n        <span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">bool<\/span> isLeafNode = node-&gt;i &gt;= <span class=\"hljs-number\">0<\/span>;\r\n\r\n        <span class=\"hljs-keyword\">if<\/span> (isLeafNode &amp;&amp; overlap)\r\n        {\r\n            <span class=\"hljs-keyword\">if<\/span> (n &lt; maxIds)\r\n            {\r\n                ids[n] = i;\r\n                n++;\r\n            }\r\n        }\r\n\r\n        <span class=\"hljs-keyword\">if<\/span> (overlap || isLeafNode)\r\n            i++;\r\n        <span class=\"hljs-keyword\">else<\/span>\r\n        {\r\n            <span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">int<\/span> escapeIndex = -node-&gt;i;\r\n            i += escapeIndex;\r\n        }\r\n    }\r\n\r\n    <span class=\"hljs-keyword\">return<\/span> n;\r\n}<\/code><\/pre>\n<p>\u68c0\u67e5\u65b9\u6cd5checkOverlapSegment\u662f\u5c06node\u770b\u6210AABB\u5305\u56f4\u76d2\uff0c\u901a\u8fc7\u6bd4\u8f83\u5c04\u7ebf\u8d77\u6b62\u70b9p\u3001q\u4e0e\u5305\u56f4\u76d2\u7684x\u3001z\u5750\u6807\u7684\u76f8\u5bf9\u4f4d\u7f6e\u3002\u82e5\u5b58\u5728overlap\uff0c\u5219\u8fd8\u8981\u5224\u65adnode\u662f\u5426\u4e3a<strong>\u53f6\u5b50\u8282\u70b9<\/strong>\u3002\u8fd9\u91ccrecast\u4e3atrimesh node\u5efa\u7acb\u7684\u6a21\u578b\u662f\u4e00\u4e2a<strong>\u6811\u72b6\u7ed3\u6784<\/strong>\uff0c\u4ece\u6839\u8282\u70b9\u51fa\u53d1\u7ba1\u7406\u5230\u5927\u7684\u533a\u5757\uff0c\u518d\u5230\u5c0f\u7684\u533a\u5757\uff0c\u76f4\u81f3\u4e00\u4e2a\u57fa\u7840node\u4f5c\u4e3a\u53f6\u5b50\u8282\u70b9\u3002\u53f6\u5b50\u8282\u70b9\u662f\u901a\u8fc7node\u7684\u5c5e\u6027i\u6765\u5224\u65ad\uff0c\u82e5i\u5c0f\u4e8e0\u4ee3\u8868\u53f6\u5b50\u8282\u70b9\uff0c\u53ef\u4ee5\u5c06\u8fd9\u4e2anode\u52a0\u5165\u8fd4\u56de\u6570\u7ec4\u4e2d\uff1b\u5426\u5219\u5224\u65ad\u4e0b\u4e00\u4e2a\u3002\u6ce8\u610f\u8fd9\u91cc\u9009\u53d6\u4e0b\u4e00\u4e2a\u7684\u65f6\u5019\u6709\u4e2a\u5206\u652f\u4f18\u5316\uff1a\u82e5\u65e2\u6ca1\u6709overlap\uff0c\u53c8\u4e0d\u662f\u53f6\u8282\u70b9\uff0c\u5219\u653e\u5f03\u5f53\u524d\u8282\u70b9\u4e0b\u9762\u7684\u6240\u6709\u5b50\u5b59\u8282\u70b9\uff0c\u76f4\u63a5\u8df3\u8f6c\u5230\u901a\u8fc7\u5c5e\u6027i\u8ba1\u7b97\u51fa\u7684\u4e0b\u4e00\u4e2a\u8282\u70b9\u7d22\u5f15\u5904\u3002<br \/>\n\u901a\u8fc7\u4e0a\u9762\u8fd9\u4e00\u6b65\u53ef\u4ee5\u6392\u9664\u6389\u7edd\u5927\u591a\u6570\u8282\u70b9\u3002\u4e0b\u9762\u53ea\u9700\u8981\u5bf9\u5269\u4f59\u7684\u82e5\u5e72\u4e2atrimesh node\u505a\u7cbe\u9009\uff0c\u5224\u65ad\u5c04\u7ebf\u662f\u5426\u4e0e\u5b83\u4eec\u5b58\u5728\u4ea4\u70b9\u3002\u8fd9\u5b9e\u9645\u662f\u5206\u4e24\u6b65\uff1a<strong>\u4e00\u662f\u6c42\u5c04\u7ebf\u4e0e\u4e09\u89d2\u5f62\u6240\u5728\u5e73\u9762\u7684\u4ea4\u70b9\uff0c\u4e8c\u662f\u5224\u65ad\u4ea4\u70b9\u662f\u5426\u5728\u4e09\u89d2\u5f62\u5185\u90e8<\/strong>\u3002\u8fd9\u662f\u5728\u5982\u4e0b\u51fd\u6570\u4e2d\u5904\u7406\u7684\uff1a<\/p>\n<pre class=\"prettyprint\"><code class=\"hljs cpp has-numbering\"><span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">bool<\/span> intersectSegmentTriangle(<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">float<\/span>* sp, <span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">float<\/span>* sq,\r\n                                     <span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">float<\/span>* a, <span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">float<\/span>* b, <span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">float<\/span>* c,\r\n                                     <span class=\"hljs-keyword\">float<\/span> &amp;t)\r\n{\r\n    <span class=\"hljs-keyword\">float<\/span> v, w;\r\n    <span class=\"hljs-keyword\">float<\/span> ab[<span class=\"hljs-number\">3<\/span>], ac[<span class=\"hljs-number\">3<\/span>], qp[<span class=\"hljs-number\">3<\/span>], ap[<span class=\"hljs-number\">3<\/span>], norm[<span class=\"hljs-number\">3<\/span>], e[<span class=\"hljs-number\">3<\/span>];\r\n    rcVsub(ab, b, a);\r\n    rcVsub(ac, c, a);\r\n    rcVsub(qp, sp, sq);\r\n\r\n    <span class=\"hljs-comment\">\/\/ Compute triangle normal. Can be precalculated or cached if<\/span>\r\n    <span class=\"hljs-comment\">\/\/ intersecting multiple segments against the same triangle<\/span>\r\n    rcVcross(norm, ab, ac);\r\n\r\n    <span class=\"hljs-comment\">\/\/ Compute denominator d. If d &lt;= 0, segment is parallel to or points<\/span>\r\n    <span class=\"hljs-comment\">\/\/ away from triangle, so exit early<\/span>\r\n    <span class=\"hljs-keyword\">float<\/span> d = rcVdot(qp, norm);\r\n    <span class=\"hljs-keyword\">if<\/span> (d &lt;= <span class=\"hljs-number\">0.0f<\/span>) <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">false<\/span>;\r\n\r\n    <span class=\"hljs-comment\">\/\/ Compute intersection t value of pq with plane of triangle. A ray<\/span>\r\n    <span class=\"hljs-comment\">\/\/ intersects iff 0 &lt;= t. Segment intersects iff 0 &lt;= t &lt;= 1. Delay<\/span>\r\n    <span class=\"hljs-comment\">\/\/ dividing by d until intersection has been found to pierce triangle<\/span>\r\n    rcVsub(ap, sp, a);\r\n    t = rcVdot(ap, norm);\r\n    <span class=\"hljs-keyword\">if<\/span> (t &lt; <span class=\"hljs-number\">0.0f<\/span>) <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">false<\/span>;\r\n    <span class=\"hljs-keyword\">if<\/span> (t &gt; d) <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">false<\/span>; <span class=\"hljs-comment\">\/\/ For segment; exclude this code line for a ray test<\/span>\r\n\r\n    <span class=\"hljs-comment\">\/\/ Compute barycentric coordinate components and test if within bounds<\/span>\r\n    rcVcross(e, qp, ap);\r\n    v = rcVdot(ac, e);\r\n    <span class=\"hljs-keyword\">if<\/span> (v &lt; <span class=\"hljs-number\">0.0f<\/span> || v &gt; d) <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">false<\/span>;\r\n    w = -rcVdot(ab, e);\r\n    <span class=\"hljs-keyword\">if<\/span> (w &lt; <span class=\"hljs-number\">0.0f<\/span> || v + w &gt; d) <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">false<\/span>;\r\n\r\n    <span class=\"hljs-comment\">\/\/ Segment\/ray intersects triangle. Perform delayed division<\/span>\r\n    t \/= d;\r\n\r\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">true<\/span>;\r\n}<\/code><\/pre>\n<p>\u8fd9\u662f\u4e00\u4e2a\u7eaf\u7cb9\u7684\u6570\u5b66\u95ee\u9898\uff1a\u8bbeP\u3001Q\u4e3a\u5c04\u7ebf\u7684\u8d77\u6b62\u70b9\uff0c\u4e09\u89d2\u5f62\u7684\u4e09\u4e2a\u9876\u70b9\u5206\u522b\u4e3aA\u3001B\u3001C\uff0c\u6211\u4eec\u5f97\u5230\u5982\u4e0b\u7684\u51e0\u4f55\u6a21\u578b\uff1a<\/p>\n<p><img decoding=\"async\" title=\"\" src=\"https:\/\/img-blog.csdn.net\/2018080521071516?watermark\/2\/text\/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25lZWRtb3JlY29kZQ==\/font\/5a6L5L2T\/fontsize\/400\/fill\/I0JBQkFCMA==\/dissolve\/70\" alt=\"\" \/><br \/>\n\u7a0b\u5e8f\u5148\u6c42\u4e09\u89d2\u5f62\u6240\u5728\u5e73\u9762\u7684\u6cd5\u5411\u91cf<span id=\"MathJax-Element-29-Frame\" class=\"MathJax\" style=\"box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; font-weight: normal; display: inline; font-style: normal; line-height: normal; font-size: 16px; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; word-spacing: normal; overflow-wrap: break-word; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; position: relative;\" tabindex=\"0\" role=\"presentation\" data-mathml=\"&lt;math xmlns=&quot;http:\/\/www.w3.org\/1998\/Math\/MathML&quot;&gt;&lt;mover&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;\/mi&gt;&lt;mi&gt;o&lt;\/mi&gt;&lt;mi&gt;r&lt;\/mi&gt;&lt;mi&gt;m&lt;\/mi&gt;&lt;\/mrow&gt;&lt;mo&gt;&amp;#x2192;&lt;\/mo&gt;&lt;\/mover&gt;&lt;\/math&gt;\"><span id=\"MathJax-Span-1\" class=\"math\"><span id=\"MathJax-Span-2\" class=\"mrow\"><span id=\"MathJax-Span-3\" class=\"munderover\"><span id=\"MathJax-Span-4\" class=\"mrow\"><span id=\"MathJax-Span-5\" class=\"mi\">n<\/span><span id=\"MathJax-Span-6\" class=\"mi\">o<\/span><span id=\"MathJax-Span-7\" class=\"mi\">r<\/span><span id=\"MathJax-Span-8\" class=\"mi\">m<\/span><\/span><span id=\"MathJax-Span-9\" class=\"mo\">\u2212\u2192\u2212\u2212<\/span><\/span><\/span><\/span><span class=\"MJX_Assistive_MathML\" role=\"presentation\">norm\u2192<\/span><\/span>\uff0c\u518d\u7528\u53c9\u4e58\u5c06<span id=\"MathJax-Element-30-Frame\" class=\"MathJax\" style=\"box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; font-weight: normal; display: inline; font-style: normal; line-height: normal; font-size: 16px; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; word-spacing: normal; overflow-wrap: break-word; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; position: relative;\" tabindex=\"0\" role=\"presentation\" data-mathml=\"&lt;math xmlns=&quot;http:\/\/www.w3.org\/1998\/Math\/MathML&quot;&gt;&lt;mover&gt;&lt;mrow&gt;&lt;mi&gt;A&lt;\/mi&gt;&lt;mi&gt;P&lt;\/mi&gt;&lt;\/mrow&gt;&lt;mo&gt;&amp;#x2192;&lt;\/mo&gt;&lt;\/mover&gt;&lt;\/math&gt;\"><span id=\"MathJax-Span-10\" class=\"math\"><span id=\"MathJax-Span-11\" class=\"mrow\"><span id=\"MathJax-Span-12\" class=\"munderover\"><span id=\"MathJax-Span-13\" class=\"mrow\"><span id=\"MathJax-Span-14\" class=\"mi\">A<\/span><span id=\"MathJax-Span-15\" class=\"mi\">P<\/span><\/span><span id=\"MathJax-Span-16\" class=\"mo\">\u2212\u2192\u2212<\/span><\/span><\/span><\/span><span class=\"MJX_Assistive_MathML\" role=\"presentation\">AP\u2192<\/span><\/span>\u3001<span id=\"MathJax-Element-31-Frame\" class=\"MathJax\" style=\"box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; font-weight: normal; display: inline; font-style: normal; line-height: normal; font-size: 16px; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; word-spacing: normal; overflow-wrap: break-word; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; position: relative;\" tabindex=\"0\" role=\"presentation\" data-mathml=\"&lt;math xmlns=&quot;http:\/\/www.w3.org\/1998\/Math\/MathML&quot;&gt;&lt;mover&gt;&lt;mrow&gt;&lt;mi&gt;Q&lt;\/mi&gt;&lt;mi&gt;P&lt;\/mi&gt;&lt;\/mrow&gt;&lt;mo&gt;&amp;#x2192;&lt;\/mo&gt;&lt;\/mover&gt;&lt;\/math&gt;\"><span id=\"MathJax-Span-17\" class=\"math\"><span id=\"MathJax-Span-18\" class=\"mrow\"><span id=\"MathJax-Span-19\" class=\"munderover\"><span id=\"MathJax-Span-20\" class=\"mrow\"><span id=\"MathJax-Span-21\" class=\"mi\">Q<\/span><span id=\"MathJax-Span-22\" class=\"mi\">P<\/span><\/span><span id=\"MathJax-Span-23\" class=\"mo\">\u2212\u2192\u2212<\/span><\/span><\/span><\/span><span class=\"MJX_Assistive_MathML\" role=\"presentation\">QP\u2192<\/span><\/span>\u5206\u522b\u6620\u5c04\u5230<span id=\"MathJax-Element-32-Frame\" class=\"MathJax\" style=\"box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; font-weight: normal; display: inline; font-style: normal; line-height: normal; font-size: 16px; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; word-spacing: normal; overflow-wrap: break-word; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; position: relative;\" tabindex=\"0\" role=\"presentation\" data-mathml=\"&lt;math xmlns=&quot;http:\/\/www.w3.org\/1998\/Math\/MathML&quot;&gt;&lt;mover&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;\/mi&gt;&lt;mi&gt;o&lt;\/mi&gt;&lt;mi&gt;r&lt;\/mi&gt;&lt;mi&gt;m&lt;\/mi&gt;&lt;\/mrow&gt;&lt;mo&gt;&amp;#x2192;&lt;\/mo&gt;&lt;\/mover&gt;&lt;\/math&gt;\"><span id=\"MathJax-Span-24\" class=\"math\"><span id=\"MathJax-Span-25\" class=\"mrow\"><span id=\"MathJax-Span-26\" class=\"munderover\"><span id=\"MathJax-Span-27\" class=\"mrow\"><span id=\"MathJax-Span-28\" class=\"mi\">n<\/span><span id=\"MathJax-Span-29\" class=\"mi\">o<\/span><span id=\"MathJax-Span-30\" class=\"mi\">r<\/span><span id=\"MathJax-Span-31\" class=\"mi\">m<\/span><\/span><span id=\"MathJax-Span-32\" class=\"mo\">\u2212\u2192\u2212\u2212<\/span><\/span><\/span><\/span><span class=\"MJX_Assistive_MathML\" role=\"presentation\">norm\u2192<\/span><\/span>\u6240\u5728\u65b9\u5411\uff0c\u5206\u522b\u5f97\u5230\u9ad8\u5ea6t\u548cd\uff0c\u82e5t&gt;d\uff0c\u5219\u5c04\u7ebfPQ\u80af\u5b9a\u4e0e\u5e73\u9762\u6ca1\u6709\u4ea4\u70b9\uff0c\u76f4\u63a5return\u3002<br \/>\n\u63a5\u4e0b\u6765\u518d\u5224\u65ad\u4ea4\u70b9\u662f\u5426\u5728\u4e09\u89d2\u5f62\u5185\u90e8\u3002\u8fd9\u91cc\u8981\u7528\u5230\u7684\u4e00\u4e2a\u6982\u5ff5\u53eb\u505a<strong>\u8d28\u5fc3\u5750\u6807\u7cfb<\/strong>\uff08\u4e0d\u660e\u767d\u7684\u53ef\u4ee5\u767e\u5ea6\uff09\u3002\u5927\u6982\u610f\u601d\u5c31\u662f\u4e09\u89d2\u5f62ABC\u6240\u5728\u5e73\u9762\u7684\u70b9\u53ef\u4ee5\u8868\u793a\u6210\uff1a<br \/>\n<span id=\"MathJax-Element-33-Frame\" class=\"MathJax\" style=\"box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; font-weight: normal; display: inline; font-style: normal; line-height: normal; font-size: 16px; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; word-spacing: normal; overflow-wrap: break-word; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; position: relative;\" tabindex=\"0\" role=\"presentation\" data-mathml=\"&lt;math xmlns=&quot;http:\/\/www.w3.org\/1998\/Math\/MathML&quot;&gt;&lt;mi&gt;M&lt;\/mi&gt;&lt;mo&gt;=&lt;\/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;\/mo&gt;&lt;mn&gt;1&lt;\/mn&gt;&lt;mo&gt;&amp;#x2212;&lt;\/mo&gt;&lt;mrow class=&quot;MJX-TeXAtom-ORD&quot;&gt;&lt;msub&gt;&lt;mi&gt;&amp;#x03BB;&lt;\/mi&gt;&lt;mn&gt;1&lt;\/mn&gt;&lt;\/msub&gt;&lt;\/mrow&gt;&lt;mo&gt;&amp;#x2212;&lt;\/mo&gt;&lt;mrow class=&quot;MJX-TeXAtom-ORD&quot;&gt;&lt;msub&gt;&lt;mi&gt;&amp;#x03BB;&lt;\/mi&gt;&lt;mn&gt;2&lt;\/mn&gt;&lt;\/msub&gt;&lt;\/mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;\/mo&gt;&lt;mover&gt;&lt;mi&gt;a&lt;\/mi&gt;&lt;mo&gt;&amp;#x2192;&lt;\/mo&gt;&lt;\/mover&gt;&lt;mo&gt;+&lt;\/mo&gt;&lt;mrow class=&quot;MJX-TeXAtom-ORD&quot;&gt;&lt;msub&gt;&lt;mi&gt;&amp;#x03BB;&lt;\/mi&gt;&lt;mn&gt;1&lt;\/mn&gt;&lt;\/msub&gt;&lt;\/mrow&gt;&lt;mover&gt;&lt;mi&gt;b&lt;\/mi&gt;&lt;mo&gt;&amp;#x2192;&lt;\/mo&gt;&lt;\/mover&gt;&lt;mo&gt;+&lt;\/mo&gt;&lt;mrow class=&quot;MJX-TeXAtom-ORD&quot;&gt;&lt;msub&gt;&lt;mi&gt;&amp;#x03BB;&lt;\/mi&gt;&lt;mn&gt;2&lt;\/mn&gt;&lt;\/msub&gt;&lt;\/mrow&gt;&lt;mover&gt;&lt;mi&gt;c&lt;\/mi&gt;&lt;mo&gt;&amp;#x2192;&lt;\/mo&gt;&lt;\/mover&gt;&lt;\/math&gt;\"><span id=\"MathJax-Span-33\" class=\"math\"><span id=\"MathJax-Span-34\" class=\"mrow\"><span id=\"MathJax-Span-35\" class=\"mi\">M<\/span><span id=\"MathJax-Span-36\" class=\"mo\">=<\/span><span id=\"MathJax-Span-37\" class=\"mo\">(<\/span><span id=\"MathJax-Span-38\" class=\"mn\">1<\/span><span id=\"MathJax-Span-39\" class=\"mo\">\u2212<\/span><span id=\"MathJax-Span-40\" class=\"texatom\"><span id=\"MathJax-Span-41\" class=\"mrow\"><span id=\"MathJax-Span-42\" class=\"msubsup\"><span id=\"MathJax-Span-43\" class=\"mi\">\u03bb<\/span><span id=\"MathJax-Span-44\" class=\"mn\">1<\/span><\/span><\/span><\/span><span id=\"MathJax-Span-45\" class=\"mo\">\u2212<\/span><span id=\"MathJax-Span-46\" class=\"texatom\"><span id=\"MathJax-Span-47\" class=\"mrow\"><span id=\"MathJax-Span-48\" class=\"msubsup\"><span id=\"MathJax-Span-49\" class=\"mi\">\u03bb<\/span><span id=\"MathJax-Span-50\" class=\"mn\">2<\/span><\/span><\/span><\/span><span id=\"MathJax-Span-51\" class=\"mo\">)<\/span><span id=\"MathJax-Span-52\" class=\"munderover\"><span id=\"MathJax-Span-53\" class=\"mi\">a<\/span><span id=\"MathJax-Span-54\" class=\"mo\">\u2192<\/span><\/span><span id=\"MathJax-Span-55\" class=\"mo\">+<\/span><span id=\"MathJax-Span-56\" class=\"texatom\"><span id=\"MathJax-Span-57\" class=\"mrow\"><span id=\"MathJax-Span-58\" class=\"msubsup\"><span id=\"MathJax-Span-59\" class=\"mi\">\u03bb<\/span><span id=\"MathJax-Span-60\" class=\"mn\">1<\/span><\/span><\/span><\/span><span id=\"MathJax-Span-61\" class=\"munderover\"><span id=\"MathJax-Span-62\" class=\"mi\">b<\/span><span id=\"MathJax-Span-63\" class=\"mo\">\u2192<\/span><\/span><span id=\"MathJax-Span-64\" class=\"mo\">+<\/span><span id=\"MathJax-Span-65\" class=\"texatom\"><span id=\"MathJax-Span-66\" class=\"mrow\"><span id=\"MathJax-Span-67\" class=\"msubsup\"><span id=\"MathJax-Span-68\" class=\"mi\">\u03bb<\/span><span id=\"MathJax-Span-69\" class=\"mn\">2<\/span><\/span><\/span><\/span><span id=\"MathJax-Span-70\" class=\"munderover\"><span id=\"MathJax-Span-71\" class=\"mi\">c<\/span><span id=\"MathJax-Span-72\" class=\"mo\">\u2192<\/span><\/span><\/span><\/span><span class=\"MJX_Assistive_MathML\" role=\"presentation\">M=(1\u2212\u03bb1\u2212\u03bb2)a\u2192+\u03bb1b\u2192+\u03bb2c\u2192<\/span><\/span><br \/>\n\u800c\u4e09\u89d2\u5f62\u5185\u90e8\u7684\u70b9\u5fc5\u5b9a\u6ee1\u8db3\uff1a<span id=\"MathJax-Element-34-Frame\" class=\"MathJax\" style=\"box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; font-weight: normal; display: inline; font-style: normal; line-height: normal; font-size: 16px; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; word-spacing: normal; overflow-wrap: break-word; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; position: relative;\" tabindex=\"0\" role=\"presentation\" data-mathml=\"&lt;math xmlns=&quot;http:\/\/www.w3.org\/1998\/Math\/MathML&quot;&gt;&lt;mrow class=&quot;MJX-TeXAtom-ORD&quot;&gt;&lt;msub&gt;&lt;mi&gt;&amp;#x03BB;&lt;\/mi&gt;&lt;mn&gt;1&lt;\/mn&gt;&lt;\/msub&gt;&lt;\/mrow&gt;&lt;\/math&gt;\"><span id=\"MathJax-Span-73\" class=\"math\"><span id=\"MathJax-Span-74\" class=\"mrow\"><span id=\"MathJax-Span-75\" class=\"texatom\"><span id=\"MathJax-Span-76\" class=\"mrow\"><span id=\"MathJax-Span-77\" class=\"msubsup\"><span id=\"MathJax-Span-78\" class=\"mi\">\u03bb<\/span><span id=\"MathJax-Span-79\" class=\"mn\">1<\/span><\/span><\/span><\/span><\/span><\/span><span class=\"MJX_Assistive_MathML\" role=\"presentation\">\u03bb1<\/span><\/span>\u548c<span id=\"MathJax-Element-35-Frame\" class=\"MathJax\" style=\"box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; font-weight: normal; display: inline; font-style: normal; line-height: normal; font-size: 16px; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; word-spacing: normal; overflow-wrap: break-word; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; position: relative;\" tabindex=\"0\" role=\"presentation\" data-mathml=\"&lt;math xmlns=&quot;http:\/\/www.w3.org\/1998\/Math\/MathML&quot;&gt;&lt;mrow class=&quot;MJX-TeXAtom-ORD&quot;&gt;&lt;msub&gt;&lt;mi&gt;&amp;#x03BB;&lt;\/mi&gt;&lt;mn&gt;2&lt;\/mn&gt;&lt;\/msub&gt;&lt;\/mrow&gt;&lt;\/math&gt;\"><span id=\"MathJax-Span-80\" class=\"math\"><span id=\"MathJax-Span-81\" class=\"mrow\"><span id=\"MathJax-Span-82\" class=\"texatom\"><span id=\"MathJax-Span-83\" class=\"mrow\"><span id=\"MathJax-Span-84\" class=\"msubsup\"><span id=\"MathJax-Span-85\" class=\"mi\">\u03bb<\/span><span id=\"MathJax-Span-86\" class=\"mn\">2<\/span><\/span><\/span><\/span><\/span><\/span><span class=\"MJX_Assistive_MathML\" role=\"presentation\">\u03bb2<\/span><\/span>\u90fd\u5728(0,1)\u8303\u56f4\u5185\u3002<br \/>\n\u901a\u8fc7\u8fd9\u4e2a\u6027\u8d28\uff0c\u518d\u52a0\u4e00\u7cfb\u5217\u7684\u65b9\u7a0b\u8ba1\u7b97\u548c\u77e9\u9635\u53d8\u6362\u53ef\u4ee5\u5224\u65ad\u51fa\u4ea4\u70b9\u662f\u5426\u5728\u4e09\u89d2\u5f62\u5185\u90e8\uff08\u6f14\u7b97\u8fc7\u7a0b\u8fd9\u91cc\u7565\u8fc7\uff0c\u5177\u4f53\u53ef\u770b<a href=\"https:\/\/blog.csdn.net\/u012138730\/article\/details\/80235813\">\u300a\u7a7a\u95f4\u4e2d\u76f4\u7ebf\u6bb5\u548c\u4e09\u89d2\u5f62\u7684\u76f8\u4ea4\u7b97\u6cd5\u300b<\/a>\uff0c\u8bf4\u5f97\u5f88\u8be6\u7ec6\u4e86\uff09\u3002\u82e5\u4e0d\u5728\u5219\u76f4\u63a5return\uff0c\u5426\u5219\u5c06t\/d\u4f5c\u4e3a\u8fd4\u56de\u503c\u4f20\u51fa\uff0c\u540e\u9762\u4f1a\u7528\u6765\u6c42\u53d6\u6700\u7ec8\u7684\u4ea4\u70b9\u5750\u6807\u3002<br \/>\n\u63a5\u4e0b\u6765\u91cd\u65b0\u56de\u5230InputGeom::raycastMesh\u51fd\u6570\u4e2d\uff0c\u53ef\u4ee5\u770b\u5230\u82e5\u5c04\u7ebf\u4e0e\u591a\u4e2atrimesh node\u76f8\u4ea4\uff0c\u4f1a\u9009\u62e9\u6700\u5148\u9047\u5230\u7684\u4ea4\u70b9\uff1a<\/p>\n<pre class=\"prettyprint\"><code class=\"hljs perl has-numbering\">\r\n        <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">int<\/span> j = <span class=\"hljs-number\">0<\/span>; j &lt; ntris<span class=\"hljs-variable\">*3<\/span>; j += <span class=\"hljs-number\">3<\/span>)\r\n        {\r\n            float t = <span class=\"hljs-number\">1<\/span>;\r\n            <span class=\"hljs-keyword\">if<\/span> (intersectSegmentTriangle(src, dst,\r\n                                         &amp;verts[tris[j]<span class=\"hljs-variable\">*3<\/span>],\r\n                                         &amp;verts[tris[j+<span class=\"hljs-number\">1<\/span>]<span class=\"hljs-variable\">*3<\/span>],\r\n                                         &amp;verts[tris[j+<span class=\"hljs-number\">2<\/span>]<span class=\"hljs-variable\">*3<\/span>], t))\r\n            {\r\n                <span class=\"hljs-keyword\">if<\/span> (t &lt; tmin)\r\n                    tmin = t;\r\n                hit = true;\r\n            }\r\n        }<\/code><\/pre>\n<p>\u6700\u540e\u56de\u5230main.cpp\u4e2d\uff0c\u6839\u636e\u4e0a\u9762return\u7684t\u4e0ed\u7684\u6bd4\u4f8b\u5173\u7cfb\uff0c\u6c42\u53d6\u6700\u7ec8\u7684\u4ea4\u70b9\u5750\u6807\uff1a<\/p>\n<pre class=\"prettyprint\"><code class=\"hljs perl has-numbering\">                    float <span class=\"hljs-keyword\">pos<\/span>[<span class=\"hljs-number\">3<\/span>];\r\n                    <span class=\"hljs-keyword\">pos<\/span>[<span class=\"hljs-number\">0<\/span>] = rayStart[<span class=\"hljs-number\">0<\/span>] + (rayEnd[<span class=\"hljs-number\">0<\/span>] - rayStart[<span class=\"hljs-number\">0<\/span>]) * hitTime;\r\n                    <span class=\"hljs-keyword\">pos<\/span>[<span class=\"hljs-number\">1<\/span>] = rayStart[<span class=\"hljs-number\">1<\/span>] + (rayEnd[<span class=\"hljs-number\">1<\/span>] - rayStart[<span class=\"hljs-number\">1<\/span>]) * hitTime;\r\n                    <span class=\"hljs-keyword\">pos<\/span>[<span class=\"hljs-number\">2<\/span>] = rayStart[<span class=\"hljs-number\">2<\/span>] + (rayEnd[<span class=\"hljs-number\">2<\/span>] - rayStart[<span class=\"hljs-number\">2<\/span>]) * hitTime;<\/code><\/pre>\n<p>\u81f3\u6b64\u5927\u529f\u544a\u6210\u3002<\/p>\n<h2 id=\"\u9047\u5230\u7684\u4e00\u4e9b\u5751\"><a name=\"t3\"><\/a><a name=\"t3\"><\/a>\u9047\u5230\u7684\u4e00\u4e9b\u5751<\/h2>\n<p>\u672c\u4eba\u56e0\u9879\u76ee\u9700\u8981\uff0c\u4f7f\u7528\u7684\u662frecast\u7684Java\u7248\u672c\uff08<a href=\"https:\/\/github.com\/ppiastucki\/recast4j\">\u9879\u76ee\u5730\u5740<\/a>\uff09\u3002\u5b83\u7684\u5927\u90e8\u5206api\u548c\u5b9e\u73b0\u4e0e\u539f\u7248(C++)\u4e00\u81f4\uff0c\u4e0d\u8fc7\u4e5f\u5b58\u5728\u5c11\u6570\u7ec6\u8282\u5dee\u5f02\uff0c\u5bfc\u81f4\u4f7f\u7528\u8fc7\u7a0b\u4e2d\u9047\u5230\u4e86\u4e00\u4e9b\u5751\u3002\u5982Java\u7248\u7684SimpleInputGeomProvider.meshes()\u65b9\u6cd5\u662f\u8c03\u7528\u65f6\u624d\u6839\u636e\u5730\u5f62\u6570\u636e\u5b9e\u65f6\u751f\u6210\u6240\u6709\u7684trimesh node\uff0c\u8fd9\u4e00\u70b9\u975e\u5e38\u8017\u65f6\uff1b\u800c\u539f\u7248\u662f\u52a0\u8f7d\u5730\u5f62\u6570\u636e\u65f6\u5c31\u751f\u6210\u4e86\uff0c\u540e\u9762\u76f4\u63a5\u7528\u7f13\u5b58\u3002\u56e0\u6b64\u5728\u9879\u76ee\u4e2d\u53c2\u7167\u539f\u7248\u5bf9\u8fd9\u70b9\u505a\u4e86\u4f18\u5316\u3002<\/p>\n<h2 id=\"\u5c0f\u7ed3\"><a name=\"t4\"><\/a><a name=\"t4\"><\/a>\u5c0f\u7ed3<\/h2>\n<p>\u8fd9\u91cc\u8ba8\u8bba\u7684\u53ea\u662frecast\u7684\u4e00\u4e2a\u975e\u5e38\u5c0f\u7684\u529f\u80fd\uff1a<strong>\u5c04\u7ebf\u4e0emesh\u6c42\u4ea4\u70b9<\/strong>\uff1b\u5b83\u672c\u8d28\u4e0a\u7b49\u4ef7\u4e3a\u4e00\u4e2a\u6570\u5b66\u95ee\u9898\uff1a<strong>\u7ebf\u6bb5\u4e0e\u4e09\u89d2\u5f62\u6c42\u4ea4\u70b9<\/strong>\uff0c\u901a\u8fc7\u9605\u8bfb\u6e90\u7801\u548c\u5206\u6790\uff0c\u6211\u4eec\u770b\u5230\u4e0d\u5c11\u7a7a\u95f4\u51e0\u4f55\u6570\u5b66\u77e5\u8bc6\u7684\u8fd0\u7528\u3002\u540c\u65f6\u4e3a\u4e86\u6027\u80fd\u8003\u8651\uff0crecast\u901a\u8fc7\u5f88\u591a\u72ec\u5177\u5320\u5fc3\u7684\u5c0f\u7ec6\u8282\u52a0\u901f\u4e86\u6c42\u89e3\u8fc7\u7a0b\u3002\u5e0c\u671b\u672c\u6587\u80fd\u7ed9recast\u7684\u4f7f\u7528\u8005\u4e00\u4e9b\u53c2\u8003\u3002<\/p>\n<\/div>\n<\/div>\n<\/article>\n","protected":false},"excerpt":{"rendered":"<p>\u539f\u6587\u5730\u5740 \u6700\u8fd1\u516c\u53f8\u7684\u9879\u76ee\u7528\u5230\u4e86recas<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"colormag_page_container_layout":"default_layout","colormag_page_sidebar_layout":"default_layout","footnotes":""},"categories":[],"tags":[118],"class_list":["post-4866","post","type-post","status-publish","format-standard","hentry","tag-02-"],"_links":{"self":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/4866","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/comments?post=4866"}],"version-history":[{"count":0,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/4866\/revisions"}],"wp:attachment":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/media?parent=4866"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/categories?post=4866"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/tags?post=4866"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}