You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java3D动态重复渲染同一3D模型时触发RestrictedAccessException的问题求助

Java3D动态重复渲染同一3D模型时触发RestrictedAccessException的问题求助

我在使用Java3D API开发时遇到了一个棘手的问题:我想要动态重复渲染同一个3D对象,第一次执行渲染方法时模型能正常显示在屏幕上,但第二次调用这个方法就直接抛出了RestrictedAccessException异常。

具体的错误信息如下:

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();
        }
 
    }
    
}

我已经尝试给相关的Group和Shape3D设置了Capability权限,但还是没能解决这个问题,有没有熟悉Java3D的朋友能帮我分析一下问题出在哪里,以及该怎么修改才能实现重复渲染同一个3D模型的需求呢?

备注:内容来源于stack exchange,提问作者faztudo pedro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 20:08:01