我现在做一个有关java3D的项目,由于有关的资料很少,官方的资料也不多,所以特来向大家求助!1.在java3D中怎么实现骨架?也就是说,一个物体运动了之后,后面的物体也跟随其轨迹一起运动?
2.在java3D中怎么实现如下的功能:
摄象头跟随物体一起运动,也就是第一人称视角运动,跟随的效果我已经实现,在附件中我会跟上,不过现在的问题是,镜头会一直按照它的原方向运动,不会转弯了!我现在有730分,谁解决了就给谁!
大家一起讨论啊,其实都是3D中的一些小问题,不过我才接触不久。伏上我的主要代码:
/***********************初始化摄象头运动的相关参数*******************/
private void initMovement(){
Axis_info Trackline1=new Axis_info("carso");
this.TrackPos=new Point3f[Trackline1.getTrackPos().length];
TrackPos=Trackline1.getTrackPos();
this.knots=new float[Trackline1.getKnots().length];
this.knots=Trackline1.getKnots();
System.out.println("************完成摄象头运动参数的初始化**********");
}
/*************************创建摄象头跟随的效果**********************/
public BranchGroup createFollowingCamera(){
initMovement();
/*关于火车仿真我觉得用java3d实现骨骼动画应该比较容易,因为不用考虑关
* 节处的平滑无缝变形。直接用java3d中的场景图数据结构就可表示火车骨
* 骼结构,用分支图(BG)作为骨骼的起点,加入子节点TG,在TG加入车头
* 模型节点表示车头,对该TG操作就可对车头进行移动、旋转;同样,在车头
* 的TG中加入TG来表示下一节车箱,依此类推,整列火车的基本骨骼结构就表
* 示出来了,车头的移动会带动整列火车,其它的因素信息往其中加,如对每节
* 车箱加入权重信息等。*/
BranchGroup FollowingBG=new BranchGroup();
ViewingPlatform vp = su.getViewingPlatform();
vp.getViewPlatform();
View MyView=su.getViewer().getView();
MyView.setBackClipDistance(100);
MyView.setFrontClipDistance(0.001);
MyView.setFieldOfView(Math.toRadians(90.0));
TransformGroup steerTG = vp.getViewPlatformTransform();
Transform3D t3d = new Transform3D();
steerTG.getTransform( t3d );
//t3d.lookAt(new Point3d(0,0,-26),new Point3d(0,0,-25),new Vector3d(0,0.1,0));
t3d.setTranslation( new Vector3d(0, 0, Z_START) );
steerTG.setTransform(t3d); /******************************************************
* 新建一个BranchGroup对象trainBG,第三个transformGroup:sub_3,
* 作为trainBG的子TG,trainBG作为sub_trans的子接点,sub_3*
* 中通过Lorder.Vrml_loader(),取得火车模型 ***
* ****************************************************/
Vrml_loader train=new Vrml_loader();
//DS_Loader train=new DS_Loader();
TransformGroup sub_3=new TransformGroup();
sub_3=train.LoadFile_graph("models/traintou.wrl",1f);
Transform3D sub_3D=new Transform3D();
//sub_3D.rotY(1.57*3);
sub_3D.setTranslation(new Vector3d(0,0.4,0));
sub_3.setTransform(sub_3D);
ColorCube sub_2Cube=new ColorCube(10);
sub_3.addChild(sub_2Cube); /****************************************************
* sub_3的设置暂时结束*********************************
* **************************************************/
/***************添加第二个火车头********************/
TransformGroup sub_4=new TransformGroup();
sub_4=train.LoadFile_graph("models/traintou.wrl",1f);
Transform3D sub_4D=new Transform3D();
sub_4D.setTranslation(new Vector3d(0.2,0,0));
sub_4.setTransform(sub_4D);
sub_3.addChild(sub_4);
/******************添加结束************************/
/*another TransformGroup :sub_trans*/
// t3d.rotY(1.57);
TransformGroup sub_trans=new TransformGroup();
sub_trans.setTransform(t3d);
sub_trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
//sub_trans.addChild(trainBG);
sub_trans.addChild(sub_3);
/*******************************************
* !!!下面这条语句很重要,如果不这样做将会提示错误*/
vp.detach();
sub_trans.addChild(vp);
/*****************************************/
OrbitBehavior orbit =
new OrbitBehavior(view2_canvas, OrbitBehavior.REVERSE_ALL);
orbit.setSchedulingBounds(bound);
vp.setViewPlatformBehavior(orbit);
Alpha xtranAlpha2 = new Alpha(-1,100000);
/*
PositionInterpolator pos=new PositionInterpolator(
xtranAlpha2,
sub_trans,
t3d,
-10,
10
);
*/
PositionPathInterpolator pos = new PositionPathInterpolator(
xtranAlpha2,
sub_trans,
t3d,
//knots_inline,
//positions
knots,
TrackPos
);
pos.setSchedulingBounds(bound);
FollowingBG.addChild(sub_trans);
FollowingBG.addChild(pos);
FollowingBG.addChild(drawTracks());
lightScene(FollowingBG);
/***********************设置非跟随镜头场面*****************/
MovementBG=new BranchGroup();
TransformGroup MovementTG=new TransformGroup();
MovementTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
MovementTG.addChild(new ColorCube(0.04));
MovementBG.addChild(MovementTG);
PositionPathInterpolator pos1 = new PositionPathInterpolator(
xtranAlpha2,
MovementTG,
t3d,
//knots_inline,
//positions
knots,
TrackPos
);
pos1.setSchedulingBounds(bound);
MovementBG.addChild(pos1);
/*********************结束设置***************************/
//sub_3.addChild(sub_trans);
//sceneBG.addChild(sub_trans);
//FollowingBG.addChild(sub_3); return FollowingBG;
}
2.在java3D中怎么实现如下的功能:
摄象头跟随物体一起运动,也就是第一人称视角运动,跟随的效果我已经实现,在附件中我会跟上,不过现在的问题是,镜头会一直按照它的原方向运动,不会转弯了!我现在有730分,谁解决了就给谁!
大家一起讨论啊,其实都是3D中的一些小问题,不过我才接触不久。伏上我的主要代码:
/***********************初始化摄象头运动的相关参数*******************/
private void initMovement(){
Axis_info Trackline1=new Axis_info("carso");
this.TrackPos=new Point3f[Trackline1.getTrackPos().length];
TrackPos=Trackline1.getTrackPos();
this.knots=new float[Trackline1.getKnots().length];
this.knots=Trackline1.getKnots();
System.out.println("************完成摄象头运动参数的初始化**********");
}
/*************************创建摄象头跟随的效果**********************/
public BranchGroup createFollowingCamera(){
initMovement();
/*关于火车仿真我觉得用java3d实现骨骼动画应该比较容易,因为不用考虑关
* 节处的平滑无缝变形。直接用java3d中的场景图数据结构就可表示火车骨
* 骼结构,用分支图(BG)作为骨骼的起点,加入子节点TG,在TG加入车头
* 模型节点表示车头,对该TG操作就可对车头进行移动、旋转;同样,在车头
* 的TG中加入TG来表示下一节车箱,依此类推,整列火车的基本骨骼结构就表
* 示出来了,车头的移动会带动整列火车,其它的因素信息往其中加,如对每节
* 车箱加入权重信息等。*/
BranchGroup FollowingBG=new BranchGroup();
ViewingPlatform vp = su.getViewingPlatform();
vp.getViewPlatform();
View MyView=su.getViewer().getView();
MyView.setBackClipDistance(100);
MyView.setFrontClipDistance(0.001);
MyView.setFieldOfView(Math.toRadians(90.0));
TransformGroup steerTG = vp.getViewPlatformTransform();
Transform3D t3d = new Transform3D();
steerTG.getTransform( t3d );
//t3d.lookAt(new Point3d(0,0,-26),new Point3d(0,0,-25),new Vector3d(0,0.1,0));
t3d.setTranslation( new Vector3d(0, 0, Z_START) );
steerTG.setTransform(t3d); /******************************************************
* 新建一个BranchGroup对象trainBG,第三个transformGroup:sub_3,
* 作为trainBG的子TG,trainBG作为sub_trans的子接点,sub_3*
* 中通过Lorder.Vrml_loader(),取得火车模型 ***
* ****************************************************/
Vrml_loader train=new Vrml_loader();
//DS_Loader train=new DS_Loader();
TransformGroup sub_3=new TransformGroup();
sub_3=train.LoadFile_graph("models/traintou.wrl",1f);
Transform3D sub_3D=new Transform3D();
//sub_3D.rotY(1.57*3);
sub_3D.setTranslation(new Vector3d(0,0.4,0));
sub_3.setTransform(sub_3D);
ColorCube sub_2Cube=new ColorCube(10);
sub_3.addChild(sub_2Cube); /****************************************************
* sub_3的设置暂时结束*********************************
* **************************************************/
/***************添加第二个火车头********************/
TransformGroup sub_4=new TransformGroup();
sub_4=train.LoadFile_graph("models/traintou.wrl",1f);
Transform3D sub_4D=new Transform3D();
sub_4D.setTranslation(new Vector3d(0.2,0,0));
sub_4.setTransform(sub_4D);
sub_3.addChild(sub_4);
/******************添加结束************************/
/*another TransformGroup :sub_trans*/
// t3d.rotY(1.57);
TransformGroup sub_trans=new TransformGroup();
sub_trans.setTransform(t3d);
sub_trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
//sub_trans.addChild(trainBG);
sub_trans.addChild(sub_3);
/*******************************************
* !!!下面这条语句很重要,如果不这样做将会提示错误*/
vp.detach();
sub_trans.addChild(vp);
/*****************************************/
OrbitBehavior orbit =
new OrbitBehavior(view2_canvas, OrbitBehavior.REVERSE_ALL);
orbit.setSchedulingBounds(bound);
vp.setViewPlatformBehavior(orbit);
Alpha xtranAlpha2 = new Alpha(-1,100000);
/*
PositionInterpolator pos=new PositionInterpolator(
xtranAlpha2,
sub_trans,
t3d,
-10,
10
);
*/
PositionPathInterpolator pos = new PositionPathInterpolator(
xtranAlpha2,
sub_trans,
t3d,
//knots_inline,
//positions
knots,
TrackPos
);
pos.setSchedulingBounds(bound);
FollowingBG.addChild(sub_trans);
FollowingBG.addChild(pos);
FollowingBG.addChild(drawTracks());
lightScene(FollowingBG);
/***********************设置非跟随镜头场面*****************/
MovementBG=new BranchGroup();
TransformGroup MovementTG=new TransformGroup();
MovementTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
MovementTG.addChild(new ColorCube(0.04));
MovementBG.addChild(MovementTG);
PositionPathInterpolator pos1 = new PositionPathInterpolator(
xtranAlpha2,
MovementTG,
t3d,
//knots_inline,
//positions
knots,
TrackPos
);
pos1.setSchedulingBounds(bound);
MovementBG.addChild(pos1);
/*********************结束设置***************************/
//sub_3.addChild(sub_trans);
//sceneBG.addChild(sub_trans);
//FollowingBG.addChild(sub_3); return FollowingBG;
}
你把mail给我,我把完整的程序给你啊还有,我的问题应该描述得很清楚吧