这是 3D 实体凹面还是凸面的边缘?

Posted

技术标签:

【中文标题】这是 3D 实体凹面还是凸面的边缘?【英文标题】:Is this Edge of a 3D solid Concave or Convex? 【发布时间】:2016-10-13 05:17:35 【问题描述】:

给定一个 3D 实体模型和一条边,我正在测试该边是凹的还是凸的。

最好的方法是什么?我想尽量减少有关输入几何的假设。我在这个问题上的第一次通过取两个相邻面的顶点的平均值来生成中心点,通过该点的面法线偏移其中一个点,并测试偏移点是否更接近或更远到相对的面原本的。这适用于大小大致相同的简单面对。例如,当小脸远离大脸的中心时,它就失败了。

我在 Revit 中执行此操作,但我认为 Rhino、Catia 和任何实体建模器中的问题都是相同的。从边缘我可以提取相邻的面。我知道面的方向正确,因此法线指向外面。我可以将 3D 点投影到面部,计算这些点处面部的法线等。

这是原始版本的代码:

  public static Boolean AreFacesConcave(Face face_0, Face face_1, Document doc)
    
        UV uvMid_0 = VertexAverageUV( face_0 ); //3D average of the vertices
        UV uvMid_1 = VertexAverageUV( face_1 ); // approximates the center of the face

        XYZ pt_0 = face_0.Evaluate(uvMid_0);
        XYZ pt_1 = face_1.Evaluate(uvMid_1);

        // normals at those points
        XYZ normal_0 = face_0.ComputeNormal(uvMid_0);
        XYZ normal_1 = face_1.ComputeNormal(uvMid_1);

        // third point, offset from face 2 by normal
        XYZ pt_2 = pt_1.Add(normal_1.Normalize());


        Double d0 = pt_0.DistanceTo(pt_1);
        Double d1 = pt_0.DistanceTo(pt_2);

        return (d1 < d0);

    

【问题讨论】:

【参考方案1】:

如果您知道法线向量总是向外的,请在两个相邻面内获取两个点 A 和 B(三个非共线顶点的平均值或您的“中心点”)。

然后检查向量 AB 和 nA(垂直于包含点 A 的面)的点(标量)积的符号。

 Result = DotProduct(AB, nA)

负号表示“凸”边,正-“凹”边。

2D 示例:nA 是向外法线,CDF 的 D-edge 是凹的,CDE 的 D-edge 是凸的

【讨论】:

以上是关于这是 3D 实体凹面还是凸面的边缘?的主要内容,如果未能解决你的问题,请参考以下文章

如何在页面模块上使用实体?

如何确定封闭的凹面多边形是否在里面? [关闭]

Qt3D:根据实体和相机之间的距离缩放实体大小

设置实体旋转的原点(Qt 3D)

Xcode UI 不显示我创建的核心数据实体

Unity3d+Gameframework:entity实体代码分析,基于StarForce