Java 3D:使身体部位在对象模型中移动(.obj) [英] Java 3D:making body parts move in an object model (.obj)

查看:93
本文介绍了Java 3D:使身体部位在对象模型中移动(.obj)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在研究JOGL(Java OpenGL已经有好几个月了,已经设法加载对象模型,应用纹理和旋转对象,目前没有任何动画实时。我正在尝试使用Hashtable heirarchy或Map映射对象部分,在这种情况下我使用Map,但.get方法似乎返回null。我仍在学习代码结构,我不想在此时创建大量易于重用的方法,但是想使用一个统一的.jar文件来执行RotationInterpolator,Behavior和可能的Node类来让我的翅膀移动。



 import java.awt.BorderLayout; 
import java.awt.Color;
import java.awt.Frame;
import java.awt.GraphicsConfiguration;
import java.io. FileNotFoundException;
import java.util.Map;

import javax.media.j3d.Appearance;
import javax.media.j3d.BoundingSphere;
import javax。 media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
impo rt javax.media.j3d.DirectionalLight;
import javax.media.j3d.Material;
import javax.media.j3d.Shape3D;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3d;
import javax.vecmath.Vector3f;

import com.sun.j3d.loaders.IncorrectFormatException;
import com.sun.j3d.loaders.ParsingErrorException;
import com.sun.j3d.loaders.Scene;
import com.sun.j3d.loaders.objectfile.ObjectFile;
import com.sun.j3d.utils.universe.SimpleUniverse;
import com.sun.j3d.utils.universe.ViewingPlatform;

public class ObjectInteractive extends Frame {

private static final long serialVersionUID = 819877942509843369L;

/ *
*为了在分离信息后加载对象模型松散部分
* BLENDER,JAVA3D要求您在文本编辑器中打开对象并在每个对象o的前面添加
*#。命令F搜索文字o和
*输入循环,除非它提供箭头键。确保
*更改文件扩展名返回.obj,在MAC OS X上你需要支付
*点击>获取信息
*
*例如。
*
* o gargoyle< ------错误
*
* #o gargoyle< ------ right
* /


{

GraphicsConfiguration graphicsConfigI = SimpleUniverse
.getPreferredConfiguration();

setLayout( new BorderLayout());
setTitle( Heavy Evil - Act I);
Canvas3D canvas3DI = new Canvas3D(graphicsConfigI);
canvas3DI.setSize( 1200 800 );
canvas3DI.setVisible( true );
canvas3DI.setBackground(Color.BLACK);

add (canvas3DI);

ObjectFile loaderI = new ObjectFile(ObjectFile.LOAD_ALL);
loaderI.setFlags(ObjectFile.RESIZE);

Shape3D modelI = new Shape3D();
场景modelSceneI = null ;

尝试 {
modelSceneI = loaderI.load( < span class =code-string> Images / untitled.obj /);
modelI =(Shape3D)modelSceneI.getSceneGroup()。getChild( 0 );
modelSceneI.getSceneGroup()。removeChild( 0 );
modelI.getAppearance()。getMaterial();

} catch (FileNotFoundException e){
// < span class =code-comment> TODO自动生成的捕获块
e.printStackTrace();
} catch (IncorrectFormatException e){
// TODO自动生成的捕获块
e.printStackTrace();
} catch (ParsingErrorException e){
// TODO自动生成的捕获块
e.printStackTrace();
}

BranchGroup root = modelSceneI.getSceneGroup();
root.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND);
root.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE);

root.removeAllChildren();

Color3f light1Color = new Color3f( 1 .8f, 0 .1f, 0 .1f);

BoundingSphere bounds = new BoundingSphere( new Point3d( 0 0 0 0 0 0 ),
100 0 );

Vector3f light1Direction = new Vector3f( 2 .0f, 12 .0f,-12.0f);

DirectionalLight light1

= new DirectionalLight(light1Color,light1Direction);

light1.setInfluencingBounds(bounds);

root.addChild(light1);

Transform3D transform = new Transform3D();
transform.lookAt( new Point3d( 0 0 4 ), new Point3d( 0 0 0 ),
new Vector3d( 0 1 0 ));
transform.invert();

/ * 为x,y和z轴创建旋转变换* /
Transform3D rotateX = new Transform3D();
Transform3D rotateY = new Transform3D();
Transform3D rotateZ = new Transform3D();

rotateX.rotX(30d); // X轴+30度
rotateY.rotY(30d); // Y轴上+30度
rotateZ.rotZ(-15d); // 或其他东西
transform.mul(rotateX,rotateY);
transform.mul(transform,rotateZ);

root.addChild(modelI);

@SuppressWarnings( 未选中
Map< String ,Shape3D> nameMap = modelSceneI.getNamedObjects();

for String groups:nameMap.keySet()){
System。 out .printf( 名称:% s \ n,小组);
}

for String gargoyle:nameMap.keySet( )){
系统。 out .printf( 姓名:%s \ n,gargoyle);
}
for String wings:nameMap.keySet()){
系统。 out .printf( 名称: %s \ n,翅膀);
}
for String 框:nameMap.keySet()){
系统。 out .printf( 名称: %s \ n,方框);
}
for String teeth:nameMap.keySet()){
系统。 out .printf( 名称: %s \ n,牙齿);
}
for String eyes:nameMap.keySet()){
系统。 out .printf( 名称: %s \ n,眼睛);
}
for String object :nameMap.keySet()){
System。 out .printf( 名称:%s \ n object );
}
for String bar:nameMap.keySet()){
系统。 out .printf( 名称: %s \ n,bar);
}
for String hornOther:nameMap.keySet()){
系统。 out .printf( 名称: %s \ n,hornOther);
}

TransformGroup groups = new TransformGroup(transform);
TransformGroup gargoyle = new TransformGroup();
TransformGroup teeth = new TransformGroup();
TransformGroup wings = new TransformGroup();
TransformGroup eyes = new TransformGroup();
TransformGroup object = new TransformGroup();
TransformGroup bar = new TransformGroup();
TransformGroup box = new TransformGroup();
TransformGroup hornOther = new TransformGroup();

object .addChild(nameMap。 get Object01));
bar.addChild(nameMap。 get ));
box.addChild(nameMap。 get ));
eyes.addChild(nameMap。 get eye_left));
eyes.addChild(nameMap。 get eye_right));
gargoyle.addChild(nameMap。 get 怪兽));
hornOther.addChild(nameMap。 get gargoyle.001\" ));
hornOther.addChild(nameMap。 get gargoyle.002\" ));
wings.addChild(nameMap。 get gargoyle.003\" ));
wings.addChild(nameMap。 get gargoyle.004\" ));
teeth.addChild(nameMap。 get gargoyle.005\" ));
teeth.addChild(nameMap。 get gargoyle.006\" ));
teeth.addChild(nameMap。 get gargoyle.007\" ));
teeth.addChild(nameMap。 get gargoyle.008\" ));
teeth.addChild(nameMap。 get gargoyle.009\" ));
teeth.addChild(nameMap。 get gargoyle.010\" ));
teeth.addChild(nameMap。 get gargoyle.011\" ));
teeth.addChild(nameMap。 get gargoyle.012\" ));
teeth.addChild(nameMap。 get gargoyle.013\" ));
teeth.addChild(nameMap。 get gargoyle.014\" ));
teeth.addChild(nameMap。 get gargoyle.015\" ));
teeth.addChild(nameMap。 get gargoyle.016\" ));
teeth.addChild(nameMap。 get gargoyle.017\" ));
teeth.addChild(nameMap。 get gargoyle.018\" ));
teeth.addChild(nameMap。 get gargoyle.019\" ));
teeth.addChild(nameMap。 get gargoyle.020\" ));
teeth.addChild(nameMap。 get gargoyle.021\" ));
teeth.addChild(nameMap。 get gargoyle.022\" ));
teeth.addChild(nameMap。 get gargoyle.023\" ));
teeth.addChild(nameMap。 get gargoyle.024\" ));
teeth.addChild(nameMap。 get gargoyle.025\" ));
teeth.addChild(nameMap。 get gargoyle.026\" ));
teeth.addChild(nameMap。 get gargoyle.027\" ));
teeth.addChild(nameMap。 get gargoyle.028\" ));
teeth.addChild(nameMap。 get gargoyle.029\" ));
teeth.addChild(nameMap。 get gargoyle.030\" ));
teeth.addChild(nameMap。 get gargoyle.031\" ));
teeth.addChild(nameMap。 get gargoyle.032\" ));
teeth.addChild(nameMap。 get gargoyle.033\" ));
teeth.addChild(nameMap。 get gargoyle.034\" ));
teeth.addChild(nameMap。 get gargoyle.035\" ));
teeth.addChild(nameMap。 get gargoyle.036\" ));
teeth.addChild(nameMap。 get gargoyle.037\" ));
teeth.addChild(nameMap。 get gargoyle.038\" ));
teeth.addChild(nameMap。 get gargoyle.039\" ));
teeth.addChild(nameMap。 get gargoyle.040\" ));
teeth.addChild(nameMap。 get gargoyle.041\" ));
teeth.addChild(nameMap。 get gargoyle.042\" ));
teeth.addChild(nameMap。 get gargoyle.043\" ));
teeth.addChild(nameMap。 get gargoyle.044\" ));
teeth.addChild(nameMap。 get gargoyle.045\" ));
teeth.addChild(nameMap。 get gargoyle.046\" ));
teeth.addChild(nameMap。 get gargoyle.047\" ));
teeth.addChild(nameMap。 get gargoyle.048\" ));
teeth.addChild(nameMap。 get gargoyle.049\" ));
teeth.addChild(nameMap。 get gargoyle.050\" ));
teeth.addChild(nameMap。 get gargoyle.051\" ));
teeth.addChild(nameMap。 get gargoyle.052\" ));
teeth.addChild(nameMap。 get gargoyle.053\" ));
teeth.addChild(nameMap。 get gargoyle.054\" ));
teeth.addChild(nameMap。 get gargoyle.055\" ));
teeth.addChild(nameMap。 get gargoyle.056\" ));

@SuppressWarnings( 未选中
Shape3D wingz = (Shape3D)modelSceneI.getNamedObjects()。getOrDefault(
gargoyle.003,modelI );

// NamedObject返回null,需要映射Hashtable

外观出现= 外观();

材料垫= 材料();
mat.setAmbientColor(0f,0f,5f);
mat.setDiffuseColor(0f,0f,5f);
mat.setLightingEnable( true );
appear.setMaterial(mat);
wingz.setAppearance(出现);

/ * 添加已完成的场景图,构建组* /

groups.addChild(gargoyle);
gargoyle.addChild(wings);
gargoyle.addChild(牙齿);
gargoyle.addChild(眼睛);
gargoyle.addChild( object );
gargoyle.addChild(bar);
gargoyle.addChild(hornOther);
gargoyle.addChild(方框);

groups.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
groups.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);
gargoyle.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
gargoyle.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
gargoyle.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);

wings.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
wings.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);

teeth.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
eyes.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
object .setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
bar.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
hornOther.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
box.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);

// INSERT TRANSFORMS或JAVA VECTOR UTILS

Vector3d vecs = new Vector3d();
transform.rotY( 0 .1d);
vecs.setZ( 3 .0d);

transform.setTranslation(vecs);

SimpleUniverse universeI = new SimpleUniverse(canvas3DI);
universeI.getViewingPlatform()。setNominalViewingTransform();

ViewingPlatform viewPlatformI = universeI.getViewingPlatform();

TransformGroup viewTransformI = viewPlatformI
.getViewPlatformTransform();

viewTransformI.setTransform(transform);
universeI.addBranchGraph(root);

}

public static void main( String [] args){

ObjectInteractive frameObj = new ObjectInteractive();
frameObj.setSize( 1200 800 );
frameObj.setVisible( true );

}

}





我的尝试:



我已经使用文本编辑器浏览了目标文件,并将我所有单独的部分编辑为Java 3D规范,这些部分将在前面添加#所有对象部分的行前面都有一个o,直到所有错误消失。一切正常。我的getOrDefault方法总是将纹理应用于整个文件,因此我的代码中有一些错误,其中.get没有正确处理对象部分。 Google和Java3D教程没有任何意义,其中大部分内容都没有涉及使用目标文件段的动画。我也不确定那些for循环是什么,如果有的话。它们可以用于多次使用段。



我最后通过鼠标拖动添加了旋转行为,但我仍然无法正确映射机翼等。



 OrbitBehavior orbit =  new  OrbitBehavior(canvas3DI,
OrbitBehavior.REVERSE_ALL) ;
orbit.setSchedulingBounds(bounds);
orbit.setRotateEnable( true );
orbit.setRotXFactor(5d);

viewPlatformI.setViewPlatformBehavior(orbit);

解决方案

你应该学会尽快使用调试器。而不是猜测你的代码在做什么,现在是时候看到你的代码执行并确保它完成你期望的。



调试器允许你跟踪执行逐行检查变量,你会看到它有一个停止做你期望的点。

调试器 - 维基百科,免费的百科全书 [ ^ ]

掌握Visual Studio 2010中的调试 - A初学者指南 [ ^ ]

http: //docs.oracle.com/javase/7/docs/technotes/tools/windows/jdb.html [ ^ ]

https://www.jetbrains.com/idea/help/debugging-your -first-java-application.html [ ^ ]



调试器在这里向您展示您的代码正在做什么,您的任务是与它应该做什么进行比较做。

I have been studying JOGL(Java OpenGL for several months now and have managed to load an object model, apply textures and rotate the object, without any animation in real time currently. I'm trying to use a Hashtable heirarchy or Map to map the object parts, in this case I'm using Map, but the .get method seems to return null. I am still learning the code structure, and I do not want to create lots of easily re-usable methods at this time, but want to use one uniform .jar file to execute a RotationInterpolator, Behavior, and possibly Node classes to make my wings move.

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Frame;
import java.awt.GraphicsConfiguration;
import java.io.FileNotFoundException;
import java.util.Map;

import javax.media.j3d.Appearance;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.DirectionalLight;
import javax.media.j3d.Material;
import javax.media.j3d.Shape3D;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3d;
import javax.vecmath.Vector3f;

import com.sun.j3d.loaders.IncorrectFormatException;
import com.sun.j3d.loaders.ParsingErrorException;
import com.sun.j3d.loaders.Scene;
import com.sun.j3d.loaders.objectfile.ObjectFile;
import com.sun.j3d.utils.universe.SimpleUniverse;
import com.sun.j3d.utils.universe.ViewingPlatform;

public class ObjectInteractive extends Frame {

	private static final long serialVersionUID = 819877942509843369L;

	/*
	 * IN ORDER TO LOAD THE OBJECT MODEL AFTER SEPARATING IT INTO LOOSE PARTS IN
	 * BLENDER, JAVA3D REQUIRES YOU TO OPEN THE OBJECT IN A TEXT EDITOR AND ADD
	 * "#" IN FRONT OF EVERY OBJECT "o". COMMAND F TO SEARCH FOR TEXT "o" AND
	 * ENTER TO CYCLE, UNLESS IT PROVIDES YOU WITH ARROW KEYS. MAKE SURE TO
	 * CHANGE THE FILE EXTENSION BACK TO .obj, ON MAC OS X YOU HAVE TO RIGHT
	 * CLICK>GET INFO
	 * 
	 * eg.
	 * 
	 * o gargoyle <------wrong
	 * 
	 * # o gargoyle <------right
	 */

	{

		GraphicsConfiguration graphicsConfigI = SimpleUniverse
				.getPreferredConfiguration();

		setLayout(new BorderLayout());
		setTitle("Heavy Evil - Act I");
		Canvas3D canvas3DI = new Canvas3D(graphicsConfigI);
		canvas3DI.setSize(1200, 800);
		canvas3DI.setVisible(true);
		canvas3DI.setBackground(Color.BLACK);

		add(canvas3DI);

		ObjectFile loaderI = new ObjectFile(ObjectFile.LOAD_ALL);
		loaderI.setFlags(ObjectFile.RESIZE);

		Shape3D modelI = new Shape3D();
		Scene modelSceneI = null;

		try {
			modelSceneI = loaderI.load("Images/untitled.obj/");
			modelI = (Shape3D) modelSceneI.getSceneGroup().getChild(0);
			modelSceneI.getSceneGroup().removeChild(0);
			modelI.getAppearance().getMaterial();

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IncorrectFormatException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ParsingErrorException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		BranchGroup root = modelSceneI.getSceneGroup();
		root.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND);
		root.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE);

		root.removeAllChildren();

		Color3f light1Color = new Color3f(1.8f, 0.1f, 0.1f);

		BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0),
				100.0);

		Vector3f light1Direction = new Vector3f(2.0f, 12.0f, -12.0f);

		DirectionalLight light1

		= new DirectionalLight(light1Color, light1Direction);

		light1.setInfluencingBounds(bounds);

		root.addChild(light1);

		Transform3D transform = new Transform3D();
		transform.lookAt(new Point3d(0, 0, 4), new Point3d(0, 0, 0),
				new Vector3d(0, 1, 0));
		transform.invert();

		/* Creates rotation transforms for x, y and z axis */
		Transform3D rotateX = new Transform3D();
		Transform3D rotateY = new Transform3D();
		Transform3D rotateZ = new Transform3D();

		rotateX.rotX(30d); // +30 degrees on the X axis
		rotateY.rotY(30d); // +30 degrees on the Y axis
		rotateZ.rotZ(-15d); // or something
		transform.mul(rotateX, rotateY);
		transform.mul(transform, rotateZ);

		root.addChild(modelI);

		@SuppressWarnings("unchecked")
		Map<String, Shape3D> nameMap = modelSceneI.getNamedObjects();

		for (String groups : nameMap.keySet()) {
			System.out.printf("Name: %s\n", groups);
		}

		for (String gargoyle : nameMap.keySet()) {
			System.out.printf("Name: %s\n", gargoyle);
		}
		for (String wings : nameMap.keySet()) {
			System.out.printf("Name: %s\n", wings);
		}
		for (String box : nameMap.keySet()) {
			System.out.printf("Name: %s\n", box);
		}
		for (String teeth : nameMap.keySet()) {
			System.out.printf("Name: %s\n", teeth);
		}
		for (String eyes : nameMap.keySet()) {
			System.out.printf("Name: %s\n", eyes);
		}
		for (String object : nameMap.keySet()) {
			System.out.printf("Name: %s\n", object);
		}
		for (String bar : nameMap.keySet()) {
			System.out.printf("Name: %s\n", bar);
		}
		for (String hornOther : nameMap.keySet()) {
			System.out.printf("Name: %s\n", hornOther);
		}

		TransformGroup groups = new TransformGroup(transform);
		TransformGroup gargoyle = new TransformGroup();
		TransformGroup teeth = new TransformGroup();
		TransformGroup wings = new TransformGroup();
		TransformGroup eyes = new TransformGroup();
		TransformGroup object = new TransformGroup();
		TransformGroup bar = new TransformGroup();
		TransformGroup box = new TransformGroup();
		TransformGroup hornOther = new TransformGroup();

		object.addChild(nameMap.get("Object01"));
		bar.addChild(nameMap.get("cone"));
		box.addChild(nameMap.get("box"));
		eyes.addChild(nameMap.get("eye_left"));
		eyes.addChild(nameMap.get("eye_right"));
		gargoyle.addChild(nameMap.get("gargoyle"));
		hornOther.addChild(nameMap.get("gargoyle.001"));
		hornOther.addChild(nameMap.get("gargoyle.002"));
		wings.addChild(nameMap.get("gargoyle.003"));
		wings.addChild(nameMap.get("gargoyle.004"));
		teeth.addChild(nameMap.get("gargoyle.005"));
		teeth.addChild(nameMap.get("gargoyle.006"));
		teeth.addChild(nameMap.get("gargoyle.007"));
		teeth.addChild(nameMap.get("gargoyle.008"));
		teeth.addChild(nameMap.get("gargoyle.009"));
		teeth.addChild(nameMap.get("gargoyle.010"));
		teeth.addChild(nameMap.get("gargoyle.011"));
		teeth.addChild(nameMap.get("gargoyle.012"));
		teeth.addChild(nameMap.get("gargoyle.013"));
		teeth.addChild(nameMap.get("gargoyle.014"));
		teeth.addChild(nameMap.get("gargoyle.015"));
		teeth.addChild(nameMap.get("gargoyle.016"));
		teeth.addChild(nameMap.get("gargoyle.017"));
		teeth.addChild(nameMap.get("gargoyle.018"));
		teeth.addChild(nameMap.get("gargoyle.019"));
		teeth.addChild(nameMap.get("gargoyle.020"));
		teeth.addChild(nameMap.get("gargoyle.021"));
		teeth.addChild(nameMap.get("gargoyle.022"));
		teeth.addChild(nameMap.get("gargoyle.023"));
		teeth.addChild(nameMap.get("gargoyle.024"));
		teeth.addChild(nameMap.get("gargoyle.025"));
		teeth.addChild(nameMap.get("gargoyle.026"));
		teeth.addChild(nameMap.get("gargoyle.027"));
		teeth.addChild(nameMap.get("gargoyle.028"));
		teeth.addChild(nameMap.get("gargoyle.029"));
		teeth.addChild(nameMap.get("gargoyle.030"));
		teeth.addChild(nameMap.get("gargoyle.031"));
		teeth.addChild(nameMap.get("gargoyle.032"));
		teeth.addChild(nameMap.get("gargoyle.033"));
		teeth.addChild(nameMap.get("gargoyle.034"));
		teeth.addChild(nameMap.get("gargoyle.035"));
		teeth.addChild(nameMap.get("gargoyle.036"));
		teeth.addChild(nameMap.get("gargoyle.037"));
		teeth.addChild(nameMap.get("gargoyle.038"));
		teeth.addChild(nameMap.get("gargoyle.039"));
		teeth.addChild(nameMap.get("gargoyle.040"));
		teeth.addChild(nameMap.get("gargoyle.041"));
		teeth.addChild(nameMap.get("gargoyle.042"));
		teeth.addChild(nameMap.get("gargoyle.043"));
		teeth.addChild(nameMap.get("gargoyle.044"));
		teeth.addChild(nameMap.get("gargoyle.045"));
		teeth.addChild(nameMap.get("gargoyle.046"));
		teeth.addChild(nameMap.get("gargoyle.047"));
		teeth.addChild(nameMap.get("gargoyle.048"));
		teeth.addChild(nameMap.get("gargoyle.049"));
		teeth.addChild(nameMap.get("gargoyle.050"));
		teeth.addChild(nameMap.get("gargoyle.051"));
		teeth.addChild(nameMap.get("gargoyle.052"));
		teeth.addChild(nameMap.get("gargoyle.053"));
		teeth.addChild(nameMap.get("gargoyle.054"));
		teeth.addChild(nameMap.get("gargoyle.055"));
		teeth.addChild(nameMap.get("gargoyle.056"));

		@SuppressWarnings("unchecked")
		Shape3D wingz = (Shape3D) modelSceneI.getNamedObjects().getOrDefault(
				"gargoyle.003", modelI);

		// NamedObject returns null, need to map Hashtable

		Appearance appear = new Appearance();

		Material mat = new Material();
		mat.setAmbientColor(0f, 0f, 5f);
		mat.setDiffuseColor(0f, 0f, 5f);
		mat.setLightingEnable(true);
		appear.setMaterial(mat);
		wingz.setAppearance(appear);

		/* Add completed scenegraph, Construct the groups */

		groups.addChild(gargoyle);
		gargoyle.addChild(wings);
		gargoyle.addChild(teeth);
		gargoyle.addChild(eyes);
		gargoyle.addChild(object);
		gargoyle.addChild(bar);
		gargoyle.addChild(hornOther);
		gargoyle.addChild(box);

		groups.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		groups.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);
		gargoyle.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		gargoyle.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
		gargoyle.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);

		wings.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		wings.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);

		teeth.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		eyes.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		object.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		bar.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		hornOther.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		box.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);

		// INSERT TRANSFORMS OR JAVA VECTOR UTILS

		Vector3d vecs = new Vector3d();
		transform.rotY(0.1d);
		vecs.setZ(3.0d);

		transform.setTranslation(vecs);

		SimpleUniverse universeI = new SimpleUniverse(canvas3DI);
		universeI.getViewingPlatform().setNominalViewingTransform();

		ViewingPlatform viewPlatformI = universeI.getViewingPlatform();

		TransformGroup viewTransformI = viewPlatformI
				.getViewPlatformTransform();

		viewTransformI.setTransform(transform);
		universeI.addBranchGraph(root);

	}

	public static void main(String[] args) {

		ObjectInteractive frameObj = new ObjectInteractive();
		frameObj.setSize(1200, 800);
		frameObj.setVisible(true);

	}

}



What I have tried:

I have gone through the object file with a text editor and edited all of my separate parts to Java 3D specs which are to add a # in front of all of the object parts with the line preceded by an "o", until all of the errors went away. Everything works fine. My getOrDefault method always applies the texture to the entire file, so there is something wrong in my code where the .get is not properly processing the object parts. Google and Java3D tutorials are not making any sense, and most of which do not touch on animation using object file segments. I'm also not sure what those for loops are accomplishing if anything. They may be used for using segments multiple times.

I added the rotation behavior finally via mouse drag but I still cannot map the wings etc. correctly.

OrbitBehavior orbit = new OrbitBehavior(canvas3DI,
				OrbitBehavior.REVERSE_ALL);
orbit.setSchedulingBounds(bounds);
orbit.setRotateEnable(true);
orbit.setRotXFactor(5d);

viewPlatformI.setViewPlatformBehavior(orbit);

解决方案

You should learn to use the debugger as soon as possible. Rather than guessing what your code is doing, It is time to see your code executing and ensuring that it does what you expect.

The debugger allow you to follow the execution line by line, inspect variables and you will see that there is a point where it stop doing what you expect.
Debugger - Wikipedia, the free encyclopedia[^]
Mastering Debugging in Visual Studio 2010 - A Beginner's Guide[^]
http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jdb.html[^]
https://www.jetbrains.com/idea/help/debugging-your-first-java-application.html[^]

The debugger is here to show you what your code is doing and your task is to compare with what it should do.


这篇关于Java 3D:使身体部位在对象模型中移动(.obj)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆