Project
https://graphics.cs.utah.edu/research/projects/shortest-path-to-boundary/
Build and Debug
Fork:(在Win10上)
https://github.com/chunleili/Shortest-Path-to-Boundary-for-Self-Intersecting-Meshes
commit hash
d3160168d2b6a58188d12e6cd959da0ac9b56e95
./vscode/launch.json
{
“version”: “0.2.0”,
“configurations”: [
{
“name”: “(msvc) Launch”,
“type”: “cppvsdbg”,
“request”: “launch”,
// Resolved by CMake Tools:
“program”: “
w
o
r
k
s
p
a
c
e
F
o
l
d
e
r
/
b
u
i
l
d
/
D
e
b
u
g
/
S
h
o
r
t
e
s
t
−
P
a
t
h
−
T
e
s
t
.
e
x
e
"
,
"
a
r
g
s
"
:
[
"
T
e
s
t
D
a
t
a
/
P
a
r
a
m
e
t
e
r
s
.
j
s
o
n
"
,
"
T
e
s
t
D
a
t
a
/
I
n
t
e
r
s
e
c
t
i
n
g
S
h
a
p
e
.
t
"
]
,
"
s
t
o
p
A
t
E
n
t
r
y
"
:
t
r
u
e
,
"
c
w
d
"
:
"
{workspaceFolder}/build/Debug/Shortest-Path-Test.exe", "args": ["TestData/Parameters.json", "TestData/IntersectingShape.t"], "stopAtEntry": true, "cwd": "
workspaceFolder/build/Debug/Shortest−Path−Test.exe","args":["TestData/Parameters.json","TestData/IntersectingShape.t"],"stopAtEntry":true,"cwd":"{workspaceFolder}”,
“environment”: [
{
// add the directory where our target was built to the PATHs
// it gets resolved by CMake Tools:
“name”: “PATH”,
“value”: “
e
n
v
:
P
A
T
H
:
{env:PATH}:
env:PATH:{command:cmake.getLaunchTargetDirectory}”
},
],
“console”: “internalConsole”,
}
]
}
Code Explain
Test.cpp中是入口main函数
40行之前是初始化(mesh和param)
在这个for loop当中查找每个Vert的最近点。
关键的函数
dcd.vertexCollisionDetection(iV, meshId, &colDecResult);
用BVH做碰撞检测。(Broad Phase)
dcd.closestPointQuery(&colDecResult, &queryResult);
用碰撞检测后的结果查找最近点。(Narrow Phase)
Broad Phase:vertexCollisionDetection
核心就rtcPointQuery,调用的是intel embree的API
D:\Dev\Shortest-Path-to-Boundary-for-Self-Intersecting-Meshes\ShortestPath\CollisionDetector\DiscreteCollisionDetector.cpp
L598
Narrow Phase: closestPointQuery
其中较为关键的是idTetIntersected,表示相交的四面体的id。intersectedTets则是所有相交四面的的array。
执行查询最近点:
rtcPointQuery(surfaceMeshScenes[idTMIntersected], &query, &context, nullptr, (void*)pClosestPtResult); 仍然是用API来查询点。目的是针对某个表面网格(surfaceMeshScenes[idTMIntersected]),找到距离查询点最近的表面点,并把结果存储在 pClosestPtResult 中。
接下来是存储找到的最近点的信息:其face id, 坐标, barycentric coord.
另外,rtc是根据注册机制自动调用一些hook函数的例如比较关键的是
其中checkTetTraverse这个flag表示检查四面体的遍历,正是文中提到的连接性检测(valid path)