在Threejs中找到离另一个点最近的网格点?

3
你好,StackOverflow社区!我的场景中有一个漂浮的点和一个复杂的网格组。我需要找到任何一个网格上离原点最近的点。我认为我可以使用类似于SphereCast的东西来实现这个目标,但是在Threejs文档中没有找到相关内容。
以下是我需要做的2D表示:

enter image description here

基本上,我有P1和其他所有表面都在一个组中,我需要找到P2。
谢谢!

只是为了澄清一下,你是否排除了暴力搜索的可能性? - undefined
不行!完全是一个选择!这个事件只会在用户点击表面时触发,所以用蛮力来做是很便宜的。但是我不清楚怎么做 :( - undefined
还有一件需要考虑的事情,这也是一个澄清的要点,你是在寻找网格的最近“顶点”,还是在寻找网格表面上的纯数学点?区别在于前者会强制遍历网格的顶点,但可能会导致并列或不能完全代表绝对的“最近点”,因为三角形代表了曲面。后者则更难/更昂贵。 - undefined
1个回答

0
实际上,看起来你想要复现射线投射中所实现的内容。但我认为这取决于你在示例中考虑的形状,因为你需要表面的方程才能得到解析解。
我找到了关于基本形状(球体、三角形等)的射线投射的这个示例,但没有通用的解决方案,没有形状的方程。 例如,对于射线与球体的相交,他们给出了以下的C++代码:
{ 
        float t0, t1; // solutions for t if the ray intersects 
#if 0 
        // geometric solution
        Vec3f L = center - orig; 
        float tca = L.dotProduct(dir); 
        // if (tca < 0) return false;
        float d2 = L.dotProduct(L) - tca * tca; 
        if (d2 > radius2) return false; 
        float thc = sqrt(radius2 - d2); 
        t0 = tca - thc; 
        t1 = tca + thc; 
#else 
        // analytic solution
        Vec3f L = orig - center; 
        float a = dir.dotProduct(dir); 
        float b = 2 * dir.dotProduct(L); 
        float c = L.dotProduct(L) - radius2; 
        if (!solveQuadratic(a, b, c, t0, t1)) return false; 
#endif 
        if (t0 > t1) std::swap(t0, t1); 

        if (t0 < 0) { 
            t0 = t1; // if t0 is negative, let's use t1 instead 
            if (t0 < 0) return false; // both t0 and t1 are negative 
        } 

        t = t0; 

        return true; 
}

我认为在Three.js中,由于大多数材质都由小三角形组成,每个射线投射计算都依赖于三角形射线投射。


2
欢迎来到StackOverflow。在发布链接时,请始终引用重要链接的最相关部分,以防目标站点无法访问或永久离线。https://stackoverflow.com/help/how-to-answer - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接