Java3d,求助关于画面未填满,且不在中心的原因

weixin_43626964 2019-01-17 04:04:10
3D对象不在画布Canvas3D的中心,实际位置偏左下,且距离上边框和右边框都有一定的空白,
谁知道是为什么?不吝赐教,谢谢

另外,程序128-132行,MouseTranslate,鼠标右键平移无法实现,左中右三键点击拖拽都是旋转,
不知道为什么?




package sjw.java3d.chapter10;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.TextArea;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.media.j3d.AmbientLight;
import javax.media.j3d.Appearance;
import javax.media.j3d.Background;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.ImageComponent2D;
import javax.media.j3d.Material;
import javax.media.j3d.PointLight;
import javax.media.j3d.Texture;
import javax.media.j3d.Texture2D;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.vecmath.Color3f;
import javax.vecmath.Point3f;
import javax.vecmath.Vector3d;

import com.sun.j3d.utils.behaviors.mouse.MouseRotate;
import com.sun.j3d.utils.behaviors.mouse.MouseTranslate;
import com.sun.j3d.utils.behaviors.mouse.MouseWheelZoom;
import com.sun.j3d.utils.behaviors.mouse.MouseZoom;
import com.sun.j3d.utils.geometry.Primitive;
import com.sun.j3d.utils.geometry.Sphere;
import com.sun.j3d.utils.image.TextureLoader;
import com.sun.j3d.utils.universe.SimpleUniverse;

import sjw.java3d.chapter07.Axes;

/**
* 鼠标行为:MouseBehavior
* 1、触发动作
* 2、目标对象TransformGroup
* 3、处理方法
*
* MouseBehavior
* |- MouseRotate
* |- MouseTranslate
* |- MouseZoom
*
* @author aaron
*
*/
public class MoveGlobe extends JFrame {

public static void main(String[] args) {
JFrame frame = new MoveGlobe();
frame.setTitle("Java 3D");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(480, 480);
// frame.pack();
frame.setVisible(true);

}

public MoveGlobe() {

// Canvas3D
GraphicsConfiguration gc = SimpleUniverse.getPreferredConfiguration();
Canvas3D cv = new Canvas3D(gc);
setLayout(new BorderLayout());
add(cv, BorderLayout.CENTER);

TextArea ta = new TextArea("", 3, 30, TextArea.SCROLLBARS_NONE);
ta.setText("Rotation: Drag with left button\n");
ta.append("Translation: Drag with right button\n");
ta.append("Zoom: Hold Alt key and drag with left button");
add(ta, BorderLayout.SOUTH);

// SimpleUniverse
SimpleUniverse su = new SimpleUniverse(cv);

// BranchGroup, 图形root
su.getViewingPlatform().setNominalViewingTransform();

// BranchGroup, 视图root
BranchGroup bg = createSceneGraph();
bg.compile();
su.addBranchGraph(bg);

}

private BranchGroup createSceneGraph() {

BranchGroup root = new BranchGroup();

// 坐标轴
Transform3D tr = new Transform3D();
tr.setScale(0.5);
tr.setTranslation(new Vector3d(-0.8, -0.7, -0.5));
TransformGroup tg = new TransformGroup(tr);
root.addChild(tg);
Axes axes = new Axes();
tg.addChild(axes);

// spin -> tg -> Shape3D
TransformGroup spin = new TransformGroup();
spin.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
spin.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
root.addChild(spin);
Appearance ap = createAppearance();
spin.addChild(new Sphere(0.7f, Primitive.GENERATE_TEXTURE_COORDS, 50, ap));

// bounds
BoundingSphere bounds = new BoundingSphere();

// Behavior: 鼠标左键拖动
MouseRotate rotator = new MouseRotate(); // 传入TransformGroup
rotator.setTransformGroup(spin);
rotator.setSchedulingBounds(bounds);
root.addChild(rotator);

// Behavior: 鼠标右键平移
MouseTranslate translator = new MouseTranslate();
translator.setTransformGroup(spin);
translator.setSchedulingBounds(bounds);
root.addChild(translator);

// MouseTranslate translator = new MouseTranslate();
// translator.setTransformGroup(spin);
// spin.addChild(translator);
// translator.setSchedulingBounds(bounds);

// Behavior: 鼠标 second mouse button
MouseZoom zoom = new MouseZoom();
zoom.setTransformGroup(spin);
zoom.setSchedulingBounds(bounds);
root.addChild(zoom);

// Behavior: wheel
MouseWheelZoom wheel = new MouseWheelZoom();
wheel.setTransformGroup(spin);
wheel.setSchedulingBounds(bounds);
root.addChild(wheel);

// Lights
AmbientLight light = new AmbientLight(true, new Color3f(Color.BLUE));
light.setInfluencingBounds(bounds);
root.addChild(light);

PointLight ptlight = new PointLight(new Color3f(Color.WHITE),
new Point3f(0f, 0f, 2f),
new Point3f(1f, 0.3f, 0f));
ptlight.setInfluencingBounds(bounds);
root.addChild(ptlight);

// Background
Background background = new Background(0.7f, 0.7f, 0.7f);
background.setApplicationBounds(bounds);
root.addChild(background);

return root;
}

private Appearance createAppearance() {
Appearance appear = new Appearance();

BufferedImage bi = null;
try {
bi = ImageIO.read(new File("C:\\Users\\aaron\\Pictures\\FLAMING MOUNTAIN.JPG"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

TextureLoader loader = new TextureLoader(bi, this); // 纹理载入
ImageComponent2D image = loader.getImage();
Texture2D texture = new Texture2D(Texture.BASE_LEVEL, Texture.RGBA,
image.getWidth(), image.getHeight());
texture.setImage(0, image);
texture.setEnable(true);
texture.setMagFilter(texture.BASE_LEVEL_LINEAR);
texture.setMinFilter(Texture.BASE_LEVEL_LINEAR);
appear.setTexture(texture);


return appear;
}

}


...全文
165 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dis2017 2019-09-13
  • 打赏
  • 举报
回复
问下有没有找到不设置的解决方案,同时感谢这个解决方法
weixin_43626964 2019-01-18
  • 打赏
  • 举报
回复
自己回复一下,不在中心,偏左下的原因,win10对显示支持不好,

默认缩放与布局中,更改文本、应用等项目的大小:125%,

改为100%后,良好显示。

但是不知道,如果不改的话,在java中怎么设置能避免?

50,526

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧