java - How to Render the same model multiple times - Stack Overflow

I am trying to render the same 3D object dynamically. When I execute the method responsible for this, t

I am trying to render the same 3D object dynamically. When I execute the method responsible for this, the 3D object is rendered on the screen only once. When I execute the method again, it gives me an error. I am using the Java3D API. I intend to render the same object multiple times.

I am doing it this way, but it is giving me an error: [Exception in thread "AWT-EventQueue-0" javax.media.j3d.RestrictedAccessException: Cannot modify capability bits on a live or compiled object]


    class graphics_engine //extends javax.swing.JComponent 
    {
        
        public static com.sun.j3d.utils.geometry.NormalGenerator normal_generator = new com.sun.j3d.utils.geometry.NormalGenerator();
        
        public static com.sun.j3d.utils.geometry.Stripifier strip_fire = new com.sun.j3d.utils.geometry.Stripifier();
   
        public static java.util.ArrayList < javax.vecmath.Point3f[] > model_vertices = new java.util.ArrayList < javax.vecmath.Point3f[] >();
        
        public static BranchGroup branch_group = new BranchGroup();
        
        public static void geometry_info()
        {
            
            model_vertices.add( new javax.vecmath.Point3f[]
            { 
                
                new javax.vecmath.Point3f(-10, 30, -60),
                new javax.vecmath.Point3f(-13, 63, 0),
                new javax.vecmath.Point3f(-3, 3, 0),
                new javax.vecmath.Point3f(5, 3, 0),
                new javax.vecmath.Point3f(5, 7, 0),
                new javax.vecmath.Point3f(-165, 762, 450),
                new javax.vecmath.Point3f(45, -654, 550),
                new javax.vecmath.Point3f(-7657, -4440, -5550),
                new javax.vecmath.Point3f(-765, 660, -430),
                new javax.vecmath.Point3f(-4563, 561, -4560)
                    
            });
    
            //int model_numbers = graphics_engine.model_vertices.size();
            
            com.sun.j3d.utils.geometry.GeometryInfo geometry_info = new com.sun.j3d.utils.geometry.GeometryInfo( com.sun.j3d.utils.geometry.GeometryInfo.POLYGON_ARRAY ); 

            com.sun.j3d.utils.geometry.Triangulator triangulator[] = new com.sun.j3d.utils.geometry.Triangulator[graphics_engine.model_vertices.size()]; 

            TransformGroup transform_group[] = new TransformGroup[graphics_engine.model_vertices.size()];
        
            Shape3D shapes_3D[] = new Shape3D[graphics_engine.model_vertices.size()];
            
            try
            {
                
            for(int i = 0; i < graphics_engine.model_vertices.size(); i++)
            {
               
                triangulator[i] = new com.sun.j3d.utils.geometry.Triangulator();
                
                transform_group[i] = new TransformGroup();
                
                transform_group[i].setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                transform_group[i].setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);
                transform_group[i].setCapability(Group.ALLOW_CHILDREN_EXTEND);
                
                shapes_3D[i] = new Shape3D();
                shapes_3D[i].setCapability(Shape3D.ALLOW_GEOMETRY_WRITE); 
                shapes_3D[i].setCapability(Group.ALLOW_CHILDREN_EXTEND);
                
                transform_group[i].setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                branch_group.setCapability(Group.ALLOW_CHILDREN_EXTEND);

                int[] StripCounts = {5,5};
                int[] countourCountArray = {StripCounts.length};
                              
                geometry_info.setCoordinates(graphics_engine.model_vertices.get(i));
                
                geometry_info.setStripCounts(StripCounts);
                
                geometry_info.setContourCounts(countourCountArray);
                
                triangulator[i].triangulate(geometry_info);
                
                graphics_engine.normal_generator.generateNormals(geometry_info);
                
                graphics_engine.strip_fire.stripify(geometry_info);
                                
                shapes_3D[i].setGeometry(geometry_info.getGeometryArray());
                
                transform_group[i].addChild(shapes_3D[i]);
                
                branch_group.addChild(transform_group[i]);
                
                gui_components.objecto_branch_grupo.addChild(graphics_engine.branch_group);
                
                
            }
            
            }
            
            catch(java.lang.NullPointerException execcao)
            {
            
                execcao.printStackTrace();
            }
     
        }
        
    }

I am trying to render the same 3D object dynamically. When I execute the method responsible for this, the 3D object is rendered on the screen only once. When I execute the method again, it gives me an error. I am using the Java3D API. I intend to render the same object multiple times.

I am doing it this way, but it is giving me an error: [Exception in thread "AWT-EventQueue-0" javax.media.j3d.RestrictedAccessException: Cannot modify capability bits on a live or compiled object]


    class graphics_engine //extends javax.swing.JComponent 
    {
        
        public static com.sun.j3d.utils.geometry.NormalGenerator normal_generator = new com.sun.j3d.utils.geometry.NormalGenerator();
        
        public static com.sun.j3d.utils.geometry.Stripifier strip_fire = new com.sun.j3d.utils.geometry.Stripifier();
   
        public static java.util.ArrayList < javax.vecmath.Point3f[] > model_vertices = new java.util.ArrayList < javax.vecmath.Point3f[] >();
        
        public static BranchGroup branch_group = new BranchGroup();
        
        public static void geometry_info()
        {
            
            model_vertices.add( new javax.vecmath.Point3f[]
            { 
                
                new javax.vecmath.Point3f(-10, 30, -60),
                new javax.vecmath.Point3f(-13, 63, 0),
                new javax.vecmath.Point3f(-3, 3, 0),
                new javax.vecmath.Point3f(5, 3, 0),
                new javax.vecmath.Point3f(5, 7, 0),
                new javax.vecmath.Point3f(-165, 762, 450),
                new javax.vecmath.Point3f(45, -654, 550),
                new javax.vecmath.Point3f(-7657, -4440, -5550),
                new javax.vecmath.Point3f(-765, 660, -430),
                new javax.vecmath.Point3f(-4563, 561, -4560)
                    
            });
    
            //int model_numbers = graphics_engine.model_vertices.size();
            
            com.sun.j3d.utils.geometry.GeometryInfo geometry_info = new com.sun.j3d.utils.geometry.GeometryInfo( com.sun.j3d.utils.geometry.GeometryInfo.POLYGON_ARRAY ); 

            com.sun.j3d.utils.geometry.Triangulator triangulator[] = new com.sun.j3d.utils.geometry.Triangulator[graphics_engine.model_vertices.size()]; 

            TransformGroup transform_group[] = new TransformGroup[graphics_engine.model_vertices.size()];
        
            Shape3D shapes_3D[] = new Shape3D[graphics_engine.model_vertices.size()];
            
            try
            {
                
            for(int i = 0; i < graphics_engine.model_vertices.size(); i++)
            {
               
                triangulator[i] = new com.sun.j3d.utils.geometry.Triangulator();
                
                transform_group[i] = new TransformGroup();
                
                transform_group[i].setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                transform_group[i].setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);
                transform_group[i].setCapability(Group.ALLOW_CHILDREN_EXTEND);
                
                shapes_3D[i] = new Shape3D();
                shapes_3D[i].setCapability(Shape3D.ALLOW_GEOMETRY_WRITE); 
                shapes_3D[i].setCapability(Group.ALLOW_CHILDREN_EXTEND);
                
                transform_group[i].setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                branch_group.setCapability(Group.ALLOW_CHILDREN_EXTEND);

                int[] StripCounts = {5,5};
                int[] countourCountArray = {StripCounts.length};
                              
                geometry_info.setCoordinates(graphics_engine.model_vertices.get(i));
                
                geometry_info.setStripCounts(StripCounts);
                
                geometry_info.setContourCounts(countourCountArray);
                
                triangulator[i].triangulate(geometry_info);
                
                graphics_engine.normal_generator.generateNormals(geometry_info);
                
                graphics_engine.strip_fire.stripify(geometry_info);
                                
                shapes_3D[i].setGeometry(geometry_info.getGeometryArray());
                
                transform_group[i].addChild(shapes_3D[i]);
                
                branch_group.addChild(transform_group[i]);
                
                gui_components.objecto_branch_grupo.addChild(graphics_engine.branch_group);
                
                
            }
            
            }
            
            catch(java.lang.NullPointerException execcao)
            {
            
                execcao.printStackTrace();
            }
     
        }
        
    }

Share Improve this question edited Mar 27 at 22:21 jewelsea 160k15 gold badges381 silver badges418 bronze badges asked Mar 27 at 12:52 faztudo pedrofaztudo pedro 292 bronze badges 2
  • 2 Is this AWT, or JavaFX? Can you create a minimal reproducible example; it's not at all clear what you're doing or what is causing the error from the code snippet you have posted. Also, please use standard naming conventions when posting code. – James_D Commented Mar 27 at 13:37
  • This is Java3D, not JavaFX. I updated your tags accordingly. – jewelsea Commented Mar 27 at 22:21
Add a comment  | 

1 Answer 1

Reset to default 3

This is why:

public static BranchGroup branchGroup = new BranchGroup();

You have a static BranchGroup, that's it, there will exist only one.

Every time you run the method the same object is called, which is the cause of the error.

In order to avoid this, you could insert the creation of the BranchGroup at each call (so it creates a new one instead of trying to modify a live one), inside the geometryInfo method:

public static void geometryInfo()
{
   //...
   BranchGroup branchGroup = new BranchGroup();
   //...
}

p.s: Note that I modified the names for Java naming convention.

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1744088144a4556568.html

相关推荐

  • java - How to Render the same model multiple times - Stack Overflow

    I am trying to render the same 3D object dynamically. When I execute the method responsible for this, t

    8天前
    70

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信