在 Petrel 中从三角形网格绘制 FractureNetwork 时出现问题

发布于 2024-11-26 18:31:02 字数 407 浏览 4 评论 0原文

我在从 Petrel 中的 TriangleMesh 创建 FractureNetwork 时遇到问题。当它被绘制时,你可以看到所有单独的三角形 - 我希望它是实心的。有些三角形似乎确实是相连的,但并非全部都是相连的。我是否遗漏了什么,或者有什么技巧可以让 FractureNetwork 显得坚固?

TriangleMesh 是实心的,当我在 3D 窗口中打开线框时,它看起来也正确。链接显示 FractureNetwork 旁边带有 TriangleMesh 的图像。

http://www.flickr.com/photos/65551984@N07/5981436871/

I am having issues creating a FractureNetwork from a TriangleMesh in Petrel. When it is drawn, you can seen all the individual triangles - I would expect that it would be solid. Some of the triangles do seem to be connected, just not all of them. Am I missing something, or is there a trick to making the FractureNetwork appear solid?

The TriangleMesh is solid, and when I turn on Wireframe in the 3D window it also looks correct. Link shows image with TriangleMesh next to FractureNetwork.

http://www.flickr.com/photos/65551984@N07/5981436871/

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

_畞蕅 2024-12-03 18:31:02

问题似乎在于用于生成三角形的索引的顺序。

当使用以下代码生成断裂网络时,三角形呈阴影。

    public static void Test()
    {
        Point3[] vertices = new Point3[9];
        IndexedTriangle[] triangles = new IndexedTriangle[8];

        vertices[0] = new Point3(0, 100, 0);
        vertices[1] = new Point3(50, 100, 5);
        vertices[2] = new Point3(100, 100, 10);
        vertices[3] = new Point3(0, 50, 15);
        vertices[4] = new Point3(50, 50, 20);
        vertices[5] = new Point3(100, 50, 25);
        vertices[6] = new Point3(0, 0, 30);
        vertices[7] = new Point3(50, 0, 35);
        vertices[8] = new Point3(100, 0, 40);

        triangles[0] = new IndexedTriangle(0, 1, 3);
        triangles[1] = new IndexedTriangle(1, 3, 4);
        triangles[2] = new IndexedTriangle(1, 2, 4);
        triangles[3] = new IndexedTriangle(2, 4, 5);
        triangles[4] = new IndexedTriangle(3, 4, 6);
        triangles[5] = new IndexedTriangle(4, 6, 7);
        triangles[6] = new IndexedTriangle(4, 5, 7);
        triangles[7] = new IndexedTriangle(5, 7, 8);

        IndexedTriangleMesh triangleMesh = new IndexedTriangleMesh(triangles, vertices, null);

        TriangleMesh triMesh = null;
        using (ITransaction trans = Slb.Ocean.Core.DataManager.NewTransaction())
        {
            Project proj = PetrelProject.PrimaryProject;
            trans.Lock(proj);
            string colName = "TringleMeshes";
            Collection collection = Collection.NullObject;
            collection = proj.CreateCollection(colName);

            trans.Lock(collection);

            DomainObjectExtensionRoot root = DomainObjectExtensionRoot.GetInstance();
            trans.Lock(root);

            triMesh = root.CreateTriangleMesh("TestMesh", Domain.ELEVATION_DEPTH, collection, "Test", "");
            trans.Lock(triMesh);
            triMesh.IndexedTriangleMeshes = new IndexedTriangleMesh[] { triangleMesh };
            triMesh.Color = Color.Blue;
            trans.Commit();
        }

        Project project = PetrelProject.PrimaryProject;


        FractureNetwork fractureNetwork;                  

        using (ITransaction trans = Slb.Ocean.Core.DataManager.NewTransaction())
        {
            trans.Lock(project);

            fractureNetwork = project.CreateFractureNetwork("FractureNetwork", Domain.ELEVATION_DEPTH);

            fractureNetwork.CreateFracturePatches(triMesh.IndexedTriangleMeshes);

            trans.Commit();
        }

    }

然而,如果修改指标的顺序,则裂缝网络是牢固的。

    public static void Test()
    {
        Point3[] vertices = new Point3[9];
        IndexedTriangle[] triangles = new IndexedTriangle[8];

        vertices[0] = new Point3(0, 100, 0);
        vertices[1] = new Point3(50, 100, 5);
        vertices[2] = new Point3(100, 100, 10);
        vertices[3] = new Point3(0, 50, 15);
        vertices[4] = new Point3(50, 50, 20);
        vertices[5] = new Point3(100, 50, 25);
        vertices[6] = new Point3(0, 0, 30);
        vertices[7] = new Point3(50, 0, 35);
        vertices[8] = new Point3(100, 0, 40);

        triangles[0] = new IndexedTriangle(0, 1, 3);
        triangles[1] = new IndexedTriangle(1, 4, 3); // switched order of last two values
        triangles[2] = new IndexedTriangle(1, 2, 4);
        triangles[3] = new IndexedTriangle(2, 5, 4); // switched order of last two values
        triangles[4] = new IndexedTriangle(3, 4, 6);
        triangles[5] = new IndexedTriangle(4, 7, 6); // switched order of last two values
        triangles[6] = new IndexedTriangle(4, 5, 7);
        triangles[7] = new IndexedTriangle(5, 8, 7); // switched order of last two values

        IndexedTriangleMesh triangleMesh = new IndexedTriangleMesh(triangles, vertices, null);

        TriangleMesh triMesh = null;
        using (ITransaction trans = Slb.Ocean.Core.DataManager.NewTransaction())
        {
            Project proj = PetrelProject.PrimaryProject;
            trans.Lock(proj);
            string colName = "TringleMeshes";
            Collection collection = Collection.NullObject;
            collection = proj.CreateCollection(colName);

            trans.Lock(collection);

            DomainObjectExtensionRoot root = DomainObjectExtensionRoot.GetInstance();
            trans.Lock(root);

            triMesh = root.CreateTriangleMesh("TestMesh", Domain.ELEVATION_DEPTH, collection, "Test", "");
            trans.Lock(triMesh);
            triMesh.IndexedTriangleMeshes = new IndexedTriangleMesh[] { triangleMesh };
            triMesh.Color = Color.Blue;
            trans.Commit();
        }

        Project project = PetrelProject.PrimaryProject;


        FractureNetwork fractureNetwork;                  

        using (ITransaction trans = Slb.Ocean.Core.DataManager.NewTransaction())
        {
            trans.Lock(project);

            fractureNetwork = project.CreateFractureNetwork("FractureNetwork", Domain.ELEVATION_DEPTH);

            fractureNetwork.CreateFracturePatches(triMesh.IndexedTriangleMeshes);

            trans.Commit();
        }

    }

图片可见:http://www.flickr.com/photos/65551984@ N07/5987611731/

The issue seems to have been in the order of the indexes used for generating the triangles.

When the following code is used to generate a fracture network, the triangles are shaded.

    public static void Test()
    {
        Point3[] vertices = new Point3[9];
        IndexedTriangle[] triangles = new IndexedTriangle[8];

        vertices[0] = new Point3(0, 100, 0);
        vertices[1] = new Point3(50, 100, 5);
        vertices[2] = new Point3(100, 100, 10);
        vertices[3] = new Point3(0, 50, 15);
        vertices[4] = new Point3(50, 50, 20);
        vertices[5] = new Point3(100, 50, 25);
        vertices[6] = new Point3(0, 0, 30);
        vertices[7] = new Point3(50, 0, 35);
        vertices[8] = new Point3(100, 0, 40);

        triangles[0] = new IndexedTriangle(0, 1, 3);
        triangles[1] = new IndexedTriangle(1, 3, 4);
        triangles[2] = new IndexedTriangle(1, 2, 4);
        triangles[3] = new IndexedTriangle(2, 4, 5);
        triangles[4] = new IndexedTriangle(3, 4, 6);
        triangles[5] = new IndexedTriangle(4, 6, 7);
        triangles[6] = new IndexedTriangle(4, 5, 7);
        triangles[7] = new IndexedTriangle(5, 7, 8);

        IndexedTriangleMesh triangleMesh = new IndexedTriangleMesh(triangles, vertices, null);

        TriangleMesh triMesh = null;
        using (ITransaction trans = Slb.Ocean.Core.DataManager.NewTransaction())
        {
            Project proj = PetrelProject.PrimaryProject;
            trans.Lock(proj);
            string colName = "TringleMeshes";
            Collection collection = Collection.NullObject;
            collection = proj.CreateCollection(colName);

            trans.Lock(collection);

            DomainObjectExtensionRoot root = DomainObjectExtensionRoot.GetInstance();
            trans.Lock(root);

            triMesh = root.CreateTriangleMesh("TestMesh", Domain.ELEVATION_DEPTH, collection, "Test", "");
            trans.Lock(triMesh);
            triMesh.IndexedTriangleMeshes = new IndexedTriangleMesh[] { triangleMesh };
            triMesh.Color = Color.Blue;
            trans.Commit();
        }

        Project project = PetrelProject.PrimaryProject;


        FractureNetwork fractureNetwork;                  

        using (ITransaction trans = Slb.Ocean.Core.DataManager.NewTransaction())
        {
            trans.Lock(project);

            fractureNetwork = project.CreateFractureNetwork("FractureNetwork", Domain.ELEVATION_DEPTH);

            fractureNetwork.CreateFracturePatches(triMesh.IndexedTriangleMeshes);

            trans.Commit();
        }

    }

However, if the order of the indexes are modified, the fracture network is solid.

    public static void Test()
    {
        Point3[] vertices = new Point3[9];
        IndexedTriangle[] triangles = new IndexedTriangle[8];

        vertices[0] = new Point3(0, 100, 0);
        vertices[1] = new Point3(50, 100, 5);
        vertices[2] = new Point3(100, 100, 10);
        vertices[3] = new Point3(0, 50, 15);
        vertices[4] = new Point3(50, 50, 20);
        vertices[5] = new Point3(100, 50, 25);
        vertices[6] = new Point3(0, 0, 30);
        vertices[7] = new Point3(50, 0, 35);
        vertices[8] = new Point3(100, 0, 40);

        triangles[0] = new IndexedTriangle(0, 1, 3);
        triangles[1] = new IndexedTriangle(1, 4, 3); // switched order of last two values
        triangles[2] = new IndexedTriangle(1, 2, 4);
        triangles[3] = new IndexedTriangle(2, 5, 4); // switched order of last two values
        triangles[4] = new IndexedTriangle(3, 4, 6);
        triangles[5] = new IndexedTriangle(4, 7, 6); // switched order of last two values
        triangles[6] = new IndexedTriangle(4, 5, 7);
        triangles[7] = new IndexedTriangle(5, 8, 7); // switched order of last two values

        IndexedTriangleMesh triangleMesh = new IndexedTriangleMesh(triangles, vertices, null);

        TriangleMesh triMesh = null;
        using (ITransaction trans = Slb.Ocean.Core.DataManager.NewTransaction())
        {
            Project proj = PetrelProject.PrimaryProject;
            trans.Lock(proj);
            string colName = "TringleMeshes";
            Collection collection = Collection.NullObject;
            collection = proj.CreateCollection(colName);

            trans.Lock(collection);

            DomainObjectExtensionRoot root = DomainObjectExtensionRoot.GetInstance();
            trans.Lock(root);

            triMesh = root.CreateTriangleMesh("TestMesh", Domain.ELEVATION_DEPTH, collection, "Test", "");
            trans.Lock(triMesh);
            triMesh.IndexedTriangleMeshes = new IndexedTriangleMesh[] { triangleMesh };
            triMesh.Color = Color.Blue;
            trans.Commit();
        }

        Project project = PetrelProject.PrimaryProject;


        FractureNetwork fractureNetwork;                  

        using (ITransaction trans = Slb.Ocean.Core.DataManager.NewTransaction())
        {
            trans.Lock(project);

            fractureNetwork = project.CreateFractureNetwork("FractureNetwork", Domain.ELEVATION_DEPTH);

            fractureNetwork.CreateFracturePatches(triMesh.IndexedTriangleMeshes);

            trans.Commit();
        }

    }

Image can be seen at : http://www.flickr.com/photos/65551984@N07/5987611731/

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文