大家好我有问题。有人可以向我解释为什么这里的TextureLoader没有设置我想要的图像作为我的背景吗?请向我解释一下这个问题。在放置在createSceneGraph()函数中的这部分代码中,我想将我的sky.jpg图像设置为图像文件夹中的backGround。我应该在代码中修复什么?谢谢你的帮助。
package Aplication;
import com.sun.j3d.utils.universe.SimpleUniverse;
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.GraphicsConfiguration;
import javax.media.j3d.AmbientLight;
import javax.media.j3d.Background;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.DirectionalLight;
import javax.media.j3d.ImageComponent2D;
import javax.media.j3d.Shape3D;
import javax.media.j3d.TransformGroup;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3f;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.image.TextureLoader;
import com.sun.j3d.utils.universe.SimpleUniverse;
public class backGround extends Applet{
private java.net.URL bgImage = null;
public backGround(){
init();
setLayout(new BorderLayout());
GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();
Canvas3D c = new Canvas3D(config);
add("Center", c);
BranchGroup scene = createSceneGraph();
SimpleUniverse u = new SimpleUniverse(c);
// This will move the ViewPlatform back a bit so the
// objects in the scene can be viewed.
u.getViewingPlatform().setNominalViewingTransform();
scene.compile();
u.addBranchGraph(scene);
}
public void init(){
setSize(1280,650);
}
public BranchGroup createSceneGraph(){
BranchGroup firstBranch = new BranchGroup();
//background.setColor(0.0f,0.0f,2.0f);
BoundingSphere backgroundBounds = new BoundingSphere(new Point3d(0,0,0), 1000);
TextureLoader myLoader = new TextureLoader("../images/sky.jpg",this);
ImageComponent2D myImage = myLoader.getImage( );
Background background = new Background();
background.setImage(myImage);
background.setApplicationBounds(backgroundBounds);
firstBranch.addChild(background);
Shape3D plane = new createPlane().getGeo();
plane.setBounds(new BoundingSphere());
firstBranch.addChild(plane);
AmbientLight lightA = new AmbientLight();
lightA.setInfluencingBounds(new BoundingSphere());
firstBranch.addChild(lightA);
DirectionalLight lightD1 = new DirectionalLight();
lightD1.setInfluencingBounds(new BoundingSphere());
Vector3f direction = new Vector3f(-1.0f, -1.0f, -1.0f);
direction.normalize();
lightD1.setDirection(direction);
firstBranch.addChild(lightD1);
return firstBranch;
}
public static void main(String argv[]) {
Frame frame = new MainFrame(new backGround(), 750, 750);
}
}
/ ========= plane使用该类运行它的类======= /
package Aplication;
import javax.media.j3d.Appearance;
import javax.media.j3d.Geometry;
import javax.media.j3d.GeometryArray;
import javax.media.j3d.Material;
import javax.media.j3d.QuadArray;
import javax.media.j3d.Shape3D;
import javax.vecmath.Color3f;
import javax.vecmath.Point3f;
import javax.vecmath.Vector3f;
public class createPlane extends Shape3D {
Shape3D plane;
public class LitQuad extends Shape3D {
LitQuad(Point3f A, Point3f B, Point3f C, Point3f D) {
this.setGeometry(createGeometry(A, B, C, D));
this.setAppearance(createAppearance());
}
Geometry createGeometry(Point3f A, Point3f B, Point3f C, Point3f D) {
QuadArray plane = new QuadArray(4, GeometryArray.COORDINATES
| GeometryArray.NORMALS);
plane.setCoordinate(0, A);
plane.setCoordinate(1, B);
plane.setCoordinate(2, C);
plane.setCoordinate(3, D);
Vector3f a = new Vector3f(A.x - B.x, A.y - B.y, A.z - B.z);
Vector3f b = new Vector3f(C.x - B.x, C.y - B.y, C.z - B.z);
Vector3f n = new Vector3f();
n.cross(b, a);
n.normalize();
plane.setNormal(0, n);
plane.setNormal(1, n);
plane.setNormal(2, n);
plane.setNormal(3, n);
return plane;
}
Appearance createAppearance() {
Appearance appear = new Appearance();
Color3f color = new Color3f(0.0f,1.5f,0.0f);
Material material = new Material();
material.setDiffuseColor(color);
appear.setMaterial(material);
return appear;
}
}
public createPlane(){
plane = new LitQuad(new Point3f(-1.5f, -0.5f, -5.0f),
new Point3f(-1.5f, -0.5f, 1.0f),
new Point3f(1.5f, -0.5f, 1.0f), new Point3f(1.5f, -0.5f, -5.0f));
}
public Shape3D getGeo(){
return plane;
}
}
答案 0 :(得分:0)
创建一个Background实例并将其附加到BranchGroup,然后附加根目录图。
背景可以使用纯RGB颜色,2D纹理或完整几何体,如球体或盒子。
以下是丹尼尔·塞尔曼(Daniel Selmann)一书中关于创建球体作为背景的一个例子。
/*
* Create some Background geometry to use as
* a backdrop for the application. Here we create
* a Sphere that will enclose the entire scene and
* apply a texture image onto the inside of the Sphere
* to serve as a graphical backdrop for the scene.
*/
public BranchGroup createBackground(){
// create a parent BranchGroup for the Background
BranchGroup backgroundGroup = new BranchGroup();
// create a new Background node
Background back = new Background();
// set the range of influence of the background
back.setApplicationBounds( getBoundingSphere() );
// create a BranchGroup that will hold
// our Sphere geometry
BranchGroup bgGeometry = new BranchGroup();
// create an appearance for the Sphere
Appearance app = new Appearance();
// load a texture image using the Java 3D texture loader
Texture tex = new TextureLoader( "back.jpg", this).getTexture();
// apply the texture to the Appearance
app.setTexture( tex );
// create the Sphere geometry with radius 1.0.
// we tell the Sphere to generate texture coordinates
// to enable the texture image to be rendered
// and because we are *inside* the Sphere we have to generate
// Normal coordinates inwards or the Sphere will not be visible.
Sphere sphere = new Sphere( 1.0f,
Primitive.GENERATE_TEXTURE_COORDS |
Primitive.GENERATE_NORMALS_INWARD, app );
// start wiring everything together,
// add the Sphere to its parent BranchGroup.
bgGeometry.addChild( sphere );
// assign the BranchGroup to the Background as geometry.
back.setGeometry( bgGeometry );
// add the Background node to its parent BranchGroup.
backgroundGroup.addChild( back );
return backgroundGroup;
}
将背景附加到场景中执行以下操作:
SimpleUniverse u = new SimpleUniverse();
// create a BranchGroup. A BranchGroup is a node in
// a Tree data structure that can have child nodes
BranchGroup bgRoot = new BranchGroup();
// create the Background node and add it to the SimpleUniverse
u.addBranchGraph( createBackground() );