1

在我看来,当 Frame/JPanel/Canvas3D 已调整大小时,Java3D 有时会出现重绘场景的问题。我在使用 Java3D/JUNG3D 的应用程序中遇到问题,如果 Frame/JPanel/Canvas3D 的水平尺寸达到一定尺寸,整个场景就会消失。我试图简单地解决问题,然后发现以下示例代码中出现了类似的问题:http ://www.java3d.org/samples.html (倒数第二个示例,“Text 3D Example”)我将粘贴在底部方便。

脚步:

  1. 安装 Java3D
  2. 使用 3 个 Java3D jar 构建此示例。
  3. 将框架水平拉伸到 500 像素左右,然后一切都消失了。缩小它然后它又在那里。当事物消失时,垂直伸展,事物再次出现。

它似乎与 Frame/JPanel/Canvas3D 纵横比及其显示的内容有关。我猜我自己的问题略有不同,因为我正在显示不同纵横比的场景,而根本问题是相同的。谁能告诉我如何才能绕过这个错误/功能,以便在调整窗口大小时场景永远不会消失?

以下是我到目前为止没有成功的尝试:

  1. 捕获 JPanel 调整大小事件,然后强制 Canvas3D 重绘
  2. 玩双缓冲设置
  3. 许多其他事情我现在不记得了——刚从假期回来:)

代码 :

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

    }
}
4

2 回答 2

0

尝试在此处设置缓冲区,教程。http://www.youtube.com/watch?v=vzfnUSLKUDs&list=ECA331A6709F40B79D

于 2013-06-13T03:41:03.930 回答
0

已经 5 年了,但试试这个解决方案

我试过了,它与 lookAt() 函数一起工作。

于 2018-05-16T14:24:33.167 回答