2013-03-04 88 views
1

在我看來,Java3D有時在Frame/JPanel/Canvas3D調整大小時重畫場景。我在使用Java3D/JUNG3D的應用程序中遇到問題,如果Frame/JPanel/Canvas3D的水平尺寸具有一定的大小,整個場景就會消失。我試圖簡單地解決這個問題,然後發現在下面的示例代碼中會出現類似的問題:http://www.java3d.org/samples.html(倒數第二個例子,「Text 3D Example」)爲了方便,我將粘貼到底部。Java3D失蹤行爲

步驟:

  1. 使用3個Java3D的罐安裝Java3D的
  2. 構建這個例子。
  3. 運行
  4. 水平拉伸框架到500像素左右,然後一切消失。收縮它然後再次在那裏。當事情消失時,垂直拉伸,事情再次出現。

它似乎與Frame/JPanel/Canvas3D縱橫比和它顯示的內容有關。我猜測我自己的問題略有不同,因爲我顯示的是不同縱橫比的場景,底層問題是相同的。任何人都可以告訴我如何能夠解決這個bug /功能,以便在窗口大小調整時場景不會消失?

這裏是我到目前爲止已經試過,但沒有成功:

  1. 鳳雲的JPanel調整事件,然後迫使Canvas3D重繪
  2. 雙緩衝設置播放
  3. 許多其他的事情,我可以「T記得現在 - 剛回來,從休假:)

代碼:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.media.j3d.*; 
import javax.vecmath.*; 
import com.sun.j3d.utils.universe.*; 
import com.sun.j3d.utils.geometry.*; 

public class Titles { 

    public static void main(String[] args) { 
     Titles t = new Titles(); 
     t.setUp(); 
    } 

    public void setUp() { 
     JFrame jf = new JFrame("Welcome"); 
     // kill the window on close 
     jf.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent winEvent) { 
       System.exit(0); 
      } 
     }); 
     JPanel panel = new JPanel(); 
     panel.setLayout(new GridLayout(1, 1, 2, 2)); 

     GraphicsConfiguration config = SimpleUniverse 
       .getPreferredConfiguration(); 
     Canvas3D canvas3D = new Canvas3D(config); 
     canvas3D.setSize(360, 160); 
     SimpleUniverse universe = new SimpleUniverse(canvas3D); 
     BranchGroup group = new BranchGroup(); 
     addObjects(group); 
     addLights(group); 
     universe.getViewingPlatform().setNominalViewingTransform(); 
     universe.addBranchGraph(group); 
     panel.add(canvas3D); 
     jf.getContentPane().add(panel, BorderLayout.CENTER); 
     jf.pack(); 
     jf.setVisible(true); 
    } 

    public void addLights(BranchGroup group) { 
     BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 
       1000.0); 

     Color3f light1Color = new Color3f(1.0f, 1.0f, 1.0f); 
     Vector3f light1Direction = new Vector3f(4.0f, -7.0f, -12.0f); 
     DirectionalLight light1 = new DirectionalLight(light1Color, 
       light1Direction); 
     light1.setInfluencingBounds(bounds); 
     group.addChild(light1); 

     // Set up the ambient light 
     Color3f ambientColor = new Color3f(.1f, .1f, .1f); 
     AmbientLight ambientLightNode = new AmbientLight(ambientColor); 
     ambientLightNode.setInfluencingBounds(bounds); 
     group.addChild(ambientLightNode); 
    } 

    private void addObjects(BranchGroup group) { 
     Font3D f3d = new Font3D(new Font("TestFont", Font.PLAIN, 2), 
       new FontExtrusion()); 
     Text3D text = new Text3D(f3d, new String("Java3D.org"), new Point3f(-3.5f, 
       -.5f, -4.5f)); 

     text.setString("Java3D.org"); 
     Color3f white = new Color3f(1.0f, 1.0f, 1.0f); 
     Color3f blue = new Color3f(.2f, 0.2f, 0.6f); 
     Appearance a = new Appearance(); 
     Material m = new Material(blue, blue, blue, white, 80.0f); 
     m.setLightingEnable(true); 
     a.setMaterial(m); 

     Shape3D sh = new Shape3D(); 
     sh.setGeometry(text); 
     sh.setAppearance(a); 
     TransformGroup tg = new TransformGroup(); 
     Transform3D t3d = new Transform3D(); 
     Transform3D tDown = new Transform3D(); 
     Transform3D rot = new Transform3D(); 
     Vector3f v3f = new Vector3f(-1.6f, -1.35f, -6.5f); 
     t3d.setTranslation(v3f); 
     rot.rotX(Math.PI/5); 
     t3d.mul(rot); 
     v3f = new Vector3f(0, -1.4f, 0f); 
     tDown.setTranslation(v3f); 
     t3d.mul(tDown); 
     tg.setTransform(t3d); 
     tg.addChild(sh); 
     group.addChild(tg); 

    } 
} 
+0

我正在使用最新的Java3D:1.5.2 – 2013-03-05 04:21:25

+0

那麼你的問題如何解決這個問題?因爲我注意到了相同的東西 – fftk4323 2013-04-10 17:57:46

+0

正確,我正在尋找解決或解決此問題的方法。我還沒有發現任何,但沒關係 - 我放棄了Java3D,而只是使用jogl。 – 2013-04-15 02:41:49

回答