1
在我看来,Java3D有时在Frame/JPanel/Canvas3D调整大小时重画场景。我在使用Java3D/JUNG3D的应用程序中遇到问题,如果Frame/JPanel/Canvas3D的水平尺寸具有一定的大小,整个场景就会消失。我试图简单地解决这个问题,然后发现在下面的示例代码中会出现类似的问题:http://www.java3d.org/samples.html(倒数第二个例子,“Text 3D Example”)为了方便,我将粘贴到底部。Java3D失踪行为
步骤:
- 使用3个Java3D的罐安装Java3D的
- 构建这个例子。
- 运行
- 水平拉伸框架到500像素左右,然后一切消失。收缩它然后再次在那里。当事情消失时,垂直拉伸,事情再次出现。
它似乎与Frame/JPanel/Canvas3D纵横比和它显示的内容有关。我猜测我自己的问题略有不同,因为我显示的是不同纵横比的场景,底层问题是相同的。任何人都可以告诉我如何能够解决这个bug /功能,以便在窗口大小调整时场景不会消失?
这里是我到目前为止已经试过,但没有成功:
- 凤云的JPanel调整事件,然后迫使Canvas3D重绘
- 双缓冲设置播放
- 许多其他的事情,我可以“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);
}
}
我正在使用最新的Java3D:1.5.2 – 2013-03-05 04:21:25
那么你的问题如何解决这个问题?因为我注意到了相同的东西 – fftk4323 2013-04-10 17:57:46
正确,我正在寻找解决或解决此问题的方法。我还没有发现任何,但没关系 - 我放弃了Java3D,而只是使用jogl。 – 2013-04-15 02:41:49