【问题标题】:Java3d read each polygon of an 3d-objectJava3d 读取 3d 对象的每个多边形
【发布时间】:2014-09-07 21:05:44
【问题描述】:

我正在使用 Java3d(VERSION 1.6)并尝试从任何对象读取所有多边形。

我使用以下代码加载了一个对象:

private BranchGroup loadObj(String p) {
        BranchGroup objRoot = new BranchGroup(); 
        TransformGroup tg = new TransformGroup();
        Transform3D t3d = new Transform3D();
        t3d.setScale(0.3);
        Matrix4d matrix = new Matrix4d();
        t3d.get(matrix);
        try
        {   
            Scene s = null;
            ObjectFile f = new ObjectFile ();
            String basepath = new File(p).getAbsolutePath();
            System.out.println(basepath);
            f.setBasePath(basepath);

            f.setFlags (0);

            s = f.load (s1);

            s.getSceneGroup().setBoundsAutoCompute(true);
            tg.addChild (s.getSceneGroup ());


            objRoot.addChild(tg);
            bounds.add(objRoot.getBounds());
            objRoot.compile();

        }

现在我喜欢从 BranchGroup 或场景对象中读取计算出的多边形,并将每个多边形放入一个主要由 Point3d 数组组成的类中。通过该课程,我构建了一些算法来搜索特定的点和东西。那么如何获得这些多边形呢?

我需要它的原因是因为我试图在不平坦的表面上“行走”。我不能使用 BoundingBoxes 或 spheres,因为那不够精确。我也希望有不同的解决方案!

编辑: 在 gouessej 的帮助下,我走到了这一步:

    try
    {   
        Scene s = null;
        ObjectFile f = new ObjectFile ();
        String basepath = new File(p).getAbsolutePath();
        System.out.println(basepath);
        f.setBasePath(basepath);

        f.setFlags (ObjectFile.TRIANGULATE);

        String s1 = p;
        s = f.load (s1);

        BranchGroup branch = s.getSceneGroup();
        branch.setBoundsAutoCompute(true);
        Shape3D shape = (Shape3D)branch.getChild(0);
        Geometry g = shape.getGeometry();
        TriangleArray ta = (TriangleArray)shape.getGeometry();
        System.out.println(ta.getVertexCount()); // Prints around 95.000, sounds about right
        System.out.println(ta.getVertexFormat()); // prints 387

        double[] coords = ta.getCoordRefDouble(); // line: 526; Here it throws the exception


        System.out.println(Arrays.toString(coords));  


        tg.addChild (branch);


        objRoot.addChild(tg);

        bounds.add(objRoot.getBounds());
        System.out.println();
        objRoot.compile();

    }

但是在ta.getCoordRefDouble()这行,它给我抛出了一个异常:

Exception in thread "main" java.lang.IllegalStateException: GeometryArray: cannot access individual array references in INTERLEAVED mode
    at javax.media.j3d.GeometryArray.getCoordRefDouble(GeometryArray.java:5755)
    at com.object.simpleTest.Test1.loadObj(Test1.java:526)
    at com.object.simpleTest.Test1.<init>(Test1.java:428)
    at com.object.simpleTest.Test1.main(Test1.java:686)

这是什么意思以及如何解决?

【问题讨论】:

    标签: java object 3d polygon java-3d


    【解决方案1】:

    一开始,Java 3D 并没有如您所见 here(请编辑您的问题)。

    其次,你可以看看the Java documentation of the class ObjectFile。我建议您使用“TRIANGULATE”标志来确保获得一个仅包含凸多边形的多边形数组,以简化您的计算。

    场景对象的分支组包含一个 Shape3D 对象。此 Shape3D 对象包含一个 Geometry 对象,它存储您的多边形。 ObjectFile 的源代码是here。看this line

    编辑:您可以通过调用 Scene.getSceneGroup() 来获取场景的 BranchGroup。您可以看到该组已添加到场景here 中。调用Group.getAllChildren(),循环所有孩子,使用instanceof检查孩子是否是Shape3D的实例。对于每个 Shape3D,调用 getGeometry() 或 getAllGeometry()。几何应该是一个 GeometryArray,也许是一个 TriangleArray。 getCoordRefBuffer() 在 Java 3D 1.6 中可能不会以完全相同的方式工作,因为我们删除了 J3DBuffer,使用 getCoordRefDouble()、getCoordRefFloat() 或 getCoordinate() 或 getCoordinates() 的任何变体。请确保您使用 Java 3D 1.6,以便我们讨论相同的代码和相同的版本。旧版本已过时且未维护。

    Edit.2:如果顶点是交错的,不如调用getInterleavedVertices(),正如其名称所暗示的那样。请记住,它也可能包含法线(在第一个位置),而不仅仅是顶点坐标(在第二个位置): nx ny nz vx vy vz

    【讨论】:

    • 感谢您的回复。不过,您能否进一步解释一下,如何实际获得 Shape3D、几何对象和多边形?会很感激的。
    • 我刚刚编辑了我的答案。让我知道您是否还不清楚。
    • 非常感谢!现在很清楚,对于水晶的东西:我更新了我的问题。我也在使用 1.6。
    • 我刚刚编辑了我的答案。它不应该崩溃,但我有点怀疑。也许你也可以看看这个文档:ftp.ecs.csus.edu/clevengr/165/old/fall06/handouts/…
    • 非常感谢!这是完美的解决方案:)
    猜你喜欢
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多