gpt4 book ai didi

c++:在网格上找到离查询点最近的点

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:43:36 28 4
gpt4 key购买 nike

这是我需要的:给定 3d 空间中的一个点 (x,y,z) 和一个由一些顶点 (x,y,z) 组成的网格,计算并返回该网格上的近点坐标。函数大概是这样的:

bool closePointOnMesh(const Point& queryPoint, const Mesh& myMesh, float maxDistance);

我做了一些搜索,可能我会选择八叉树来减少计算。

但是还有很多细节我没看懂:

1:八叉树节点如何被 segmentation ,所以每个节点包含可能包含0~一些三角形?更容易根据顶点进一步 segmentation 单元格并直接存储顶点。

2:八叉树结构如何帮助减少计算,我知道单元格是否为空我会忽略它。但是我是否需要将八叉树单元格中每个三角形面内的所有最近点都获取到查询点,所以我最终得到了所有最近点?那声音依旧沉重。此外,如果我只是遍历所有三角形,从中获取最近的点,会更容易,这意味着不需要八叉树???

3:有没有一种快速的方法可以让最近的点到三角形面内的一个点?

4:maxDistance限制如何帮助减少计算量?

最佳答案

对于 #3,这里有一些关于如何获取 closest point of a triangle 的代码.它将点投影到三角形的平面上,然后将重心坐标固定到 [0,1],并使用这些值计算最近点。

复制如下:

vector3 closesPointOnTriangle( const vector3 *triangle, const vector3 &sourcePosition )
{
vector3 edge0 = triangle[1] - triangle[0];
vector3 edge1 = triangle[2] - triangle[0];
vector3 v0 = triangle[0] - sourcePosition;

float a = edge0.dot( edge0 );
float b = edge0.dot( edge1 );
float c = edge1.dot( edge1 );
float d = edge0.dot( v0 );
float e = edge1.dot( v0 );

float det = a*c - b*b;
float s = b*e - c*d;
float t = b*d - a*e;

if ( s + t < det )
{
if ( s < 0.f )
{
if ( t < 0.f )
{
if ( d < 0.f )
{
s = clamp( -d/a, 0.f, 1.f );
t = 0.f;
}
else
{
s = 0.f;
t = clamp( -e/c, 0.f, 1.f );
}
}
else
{
s = 0.f;
t = clamp( -e/c, 0.f, 1.f );
}
}
else if ( t < 0.f )
{
s = clamp( -d/a, 0.f, 1.f );
t = 0.f;
}
else
{
float invDet = 1.f / det;
s *= invDet;
t *= invDet;
}
}
else
{
if ( s < 0.f )
{
float tmp0 = b+d;
float tmp1 = c+e;
if ( tmp1 > tmp0 )
{
float numer = tmp1 - tmp0;
float denom = a-2*b+c;
s = clamp( numer/denom, 0.f, 1.f );
t = 1-s;
}
else
{
t = clamp( -e/c, 0.f, 1.f );
s = 0.f;
}
}
else if ( t < 0.f )
{
if ( a+d > b+e )
{
float numer = c+e-b-d;
float denom = a-2*b+c;
s = clamp( numer/denom, 0.f, 1.f );
t = 1-s;
}
else
{
s = clamp( -e/c, 0.f, 1.f );
t = 0.f;
}
}
else
{
float numer = c+e-b-d;
float denom = a-2*b+c;
s = clamp( numer/denom, 0.f, 1.f );
t = 1.f - s;
}
}

return triangle[0] + s * edge0 + t * edge1;
}

关于c++:在网格上找到离查询点最近的点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32252735/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com