最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

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

programmeradmin5浏览0评论

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.

发布评论

评论列表(0)

  1. 暂无评论