2

私はjava3D1.5.2を学んでいて、すでにいくつかのColorCubeテストを行っています。私が最後に行ったjava3Dアプレットは、約2000のColorCubeが回転し、それ自体と宇宙全体の両方で変換されます。キューブは、変換ブランチグループのリーフノード配列として生成されます

写真: ここに画像の説明を入力してください

私の問題は、問題なく表示されることもありますが、ウィンドウが白く、ウィンドウのサイズを変更するかフルスクリーンにするまで何も表示されないこともあります。

質問:この問題についてのヒントを教えてください。repaint()または同様のメソッドを使用していません。Java3Dスレッドは、私が想定しているすべてのものを描画しています。この図面更新の問題をどのように克服できますか?

これが短い疑似コードです:

class myclass extends Applet
{
    public void init()
        {
           //some init here
        }

    public void start()
        {
           //i make my thread start here
           mythread.start();
        }

    public void stop()
        {
           //...i make my thread pause here
        }

    public void destroy()
        {
           // Here i release the thread
        }

    public void paint()
        {
           //nothing here. its empty
        }

    public class my_thread extends Thread
        {
            public void run()
                 {
                        //here i use the java3D to initialize java3D things
                        while(working)
                           {
                               // here i change 2000 colorcubes' displacement and rotation
                           }
                 }
        } 
}

これが私が言及したjava3Dの初期化のいくつかです:

            GraphicsConfiguration GC_me=SimpleUniverse.getPreferredConfiguration();
            Canvas3D Canvas_me=new Canvas3D(GC_me);
            SimpleUniverse Space_me = new SimpleUniverse(Canvas_me);

ありがとう。

完全なコードは次のとおりです。

package fiziksel_model;


import java.awt.*;
import java.applet.*;

import javax.media.j3d.*;
import javax.vecmath.*;

import com.sun.j3d.utils.*;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.universe.SimpleUniverse;


public class yabanci extends Applet{

/**
* Version 1
*/


private static final long serialVersionUID = 1L;



public drawer_thread palette=new drawer_thread();
int i;
public void init()
{
   System.out.println(" started! ");



}
//Geometry geom;
public void start()
{
   System.out.println(" continuing...");


   palette.start();


}
public void stop()
{
   System.out.println(" stopped! ");

}
public void destroy()
{
   System.out.println(" destroyed!");

}
public void paint(Graphics g)
{

           System.out.println(" painted! ");// does not print anything.
}


public class drawer_thread extends Thread
{

   public void run()
   {
       Vector3f temp_vect=new Vector3f();
       ColorCube color_box=new ColorCube(0.2f);

       GraphicsConfiguration GC_me=SimpleUniverse.getPreferredConfiguration();
       Canvas3D Canvas_me=new Canvas3D(GC_me);
       SimpleUniverse my_space = new SimpleUniverse(Canvas_me);

       BranchGroup cube_barrage = new BranchGroup();
       Transform3D rotator_element=new Transform3D();
       Transform3D temp_rotator=new Transform3D();


       cube_barrage.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
       cube_barrage.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
       cube_barrage.setCapability(TransformGroup.ALLOW_CHILDREN_READ);
       cube_barrage.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE);
       setLayout(new BorderLayout());




       TransformGroup rotator1=new TransformGroup(rotator_element);
       TransformGroup rotator2=new TransformGroup(rotator_element);
       TransformGroup rotator3=new TransformGroup(rotator_element);
       TransformGroup rotator4=new TransformGroup(rotator_element);

       Vector3f translation[]=new Vector3f[4000];
       TransformGroup core1[]=new TransformGroup[4000];
       TransformGroup core2[]=new TransformGroup[4000];
       TransformGroup core3[]=new TransformGroup[4000];
       Transform3D core_move1[]=new Transform3D[4000];
       Transform3D core_move2[]=new Transform3D[4000];
       Transform3D core_move3[]=new Transform3D[4000];
       for(int j=0;j<4000;j++)
       {
       translation[j]=new Vector3f();
       core1[j]=new TransformGroup();core2[j]=new TransformGroup();
       core_move1[j]=new Transform3D();
       core_move2[j]=new Transform3D();    
       core_move3[j]=new Transform3D();
       }

       for(int j=0;j<4000;j++)
       {
       translation[j]=new Vector3f();
       translation[j].x=(float) (j/10.0);
       translation[j].y=(float)(-0.5+Math.random()*1.0);
       translation[j].z=(float)(-0.5+Math.random()*1.0);

       core_move1[j].setTranslation(translation[j]);
       core_move2[j].setTranslation(translation[j]);
       core_move3[j].setTranslation(translation[j]);

       core1[j]=new TransformGroup(core_move1[j]);
       core2[j]=new TransformGroup(core_move1[j]);
       core3[j]=new TransformGroup(core_move1[j]);
       core1[j].setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
       core1[j].setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
       core2[j].setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
       core2[j].setCapability(TransformGroup.ALLOW_TRANSFORM_READ);

       core3[j].setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
       core3[j].setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
       }






       rotator1.addChild(rotator2);
       rotator2.addChild(rotator3);rotator3.addChild(rotator4);
       rotator1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
       rotator1.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
       rotator2.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
       rotator2.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
       rotator3.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
       rotator3.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
       rotator4.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
       rotator4.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);




       for(int j=0;j<4000;j++)
       {
            rotator4.addChild(core1[j]);
            core1[j].addChild(core2[j]);
            core2[j].addChild(core3[j]);
            core3[j].addChild(new ColorCube(0.1));
       }


       cube_barrage.addChild(rotator1);


       cube_barrage.compile();
       my_space.addBranchGraph(cube_barrage);
       add("Center", Canvas_me);
       //Canvas_me.validate();

       my_space.getViewingPlatform().setNominalViewingTransform();
       float ran[]=new float [4000];
       float ran2[]=new float [4000];
       Vector3f temp_vector=new Vector3f();
       for(int j=0;j<4000;j++)
       {
           ran[j]=(float) Math.random();
           ran2[j]=(float) Math.random();
       }

       for(i=0;i<10000;i++)
       {



           rotator1.getTransform(temp_rotator);
           temp_rotator.setScale(0.1+0.05*Math.abs(Math.sin(i*0.03)));
           rotator1.setTransform(temp_rotator);

           rotator2.getTransform(temp_rotator);
           temp_rotator.rotX(i*0.03);
           rotator2.setTransform(temp_rotator);

           rotator3.getTransform(temp_rotator);
           temp_rotator.rotY(i*0.03);
           rotator3.setTransform(temp_rotator);

           rotator4.getTransform(temp_rotator);
           temp_rotator.rotZ(i*0.03);
           rotator4.setTransform(temp_rotator);


           for(int j=0;j<4000;j++)
           {
               core1[j].getTransform(temp_rotator);
               temp_rotator.get(temp_vector);
               temp_vector.x+=(float) (-0.5+Math.random())*0.02;
               temp_vector.y+=(float) (-0.5+Math.random())*0.02;
               temp_vector.z+=(float) (-0.5+Math.random())*0.02;

               temp_rotator.setTranslation(temp_vector);
               core1[j].setTransform(temp_rotator);

               core2[j].getTransform(temp_rotator);


               temp_rotator.rotZ(i*0.03+0.01*ran[j]*i);

               core2[j].setTransform(temp_rotator);


               core2[j].getTransform(temp_rotator);
               temp_rotator.rotY(i*0.02+0.01*ran2[j]*i);
               core2[j].setTransform(temp_rotator);
           }


           System.out.println(i);
           try {
               sleep(40);
           } catch (InterruptedException e) {
               // TODO Auto-generated catch block
               e.printStackTrace();
           }
       }
   }}}

お時間をいただきありがとうございます。

4

2 に答える 2

3

これを試してみてください。アプレットの起動コードで、システムプロパティ「sun.awt.noerasebackground」と「sun.awt.erasebackgroundonresize」をtrueに設定します。

于 2012-08-29T07:24:30.810 に答える
3

2番目の試行:次のコード行をスレッドからアプレットのinitメソッドに移動して、イベントディスパッチスレッド(EDT)で実行されるようにします。

private SimpleUniverse my_space = null;
public void init()
{
   System.out.println(" started! ");
   GraphicsConfiguration GC_me = SimpleUniverse.getPreferredConfiguration();
   Canvas3D Canvas_me = new Canvas3D(GC_me);
   my_space = new SimpleUniverse(Canvas_me);
   setLayout(new BorderLayout());
   add("Center", Canvas_me);
}

私は登録されていないので、200の評判を保存してください。いつ登録するのかわかりません。

于 2012-08-29T16:34:08.777 に答える