Java3D - 是否可以拥有一个跟踪移动对象的{view}平台

时间:2016-03-31 16:02:00

标签: java java-3d

我有一个非常简单的Java3D应用程序,它包含两个立方体,其中一个立方体绕另一个运行。

像这样:

enter image description here

正如您所看到的,观看平台的默认位置来自“鸟瞰”。

看起来像这样的代码

TransformGroup cameraTG = u.getViewingPlatform().
                   getViewPlatformTransform();
Vector3f translate = new Vector3f(); 
Transform3D T3D = new Transform3D();
translate.set( 0.0f, 0.0f, 20.0f);
T3D.setTranslation(translate);
cameraTG.setTransform(T3D);

我的问题是,是否可以将观察平台设置为跟踪较大的立方体(围绕较小正方形旋转的立方体)。或者更直接的是,观景平台是否可以围绕给定的身体旋转?

更多信息: 我的目标是拥有一个微型太阳系,包含太阳,地球和月亮。我想从地球的角度来看待它(几乎就像国际空间站的观点)

enter image description here

任何帮助或指示都会很棒。如果需要,请随时询问更多信息。

2 个答案:

答案 0 :(得分:2)

这里有一个很好的例子Spring Security: IP Address Whitelist Before Deferring to HTTP Basic Auth

原始http://java3d.nl/Tutorials/Java/Java3d/Controlthecamera_12.php网站已不再可用,但您仍可以使用互联网档案中的缓存版本:http://java3d.nl

         this.camera = this.universe.getViewingPlatform().getViewPlatformTransform();

         //Add things to the universe
         this.root = new BranchGroup();
         this.root.addChild(new ColorCube(0.2));
         this.universe.addBranchGraph(root);

我的想法是这样的:

BranchGroup b=new BranchGroup();
b.addChild(cube);
b.addChild(camera);

然后在旋转块的循环中:

while(true) {
  ... b.getChild()......... etc
  apply transform
}

或更具体地说

for(j=0; j<group.numChildren(); j++) {
    Node ni=group.getChild(j);
    if(ni instanceof TransformGroup) {
      Transform3D tdi=new Transform3D();
      TransformGroup tgi=(TransformGroup)group.getChild(j);
      tgi.getTransform(tdi);
      Transform3D rotation = new Transform3D();
      rotation.rotX(Math.toRadians(0.001*i));
      tdi.mul(rotation);
      tgi.setTransform(tdi);
    }
}

答案 1 :(得分:0)

有一个更简单的解决方案。试图使用角度和旋转来控制观察者凝视,你只能说出要看的3D点。在ViewingTransform中,您可以调用“lookAt(...)”:

        TransformGroup viewingTransformGroup = simpleUniv.getViewingPlatform().getViewPlatformTransform();
    Transform3D viewingTransform = new Transform3D();
    Point3d eye = viewersLocation;
    Point3d center = gazePoint;
    Vector3d up = new Vector3d(0,1,0); //assumes  +y-axis points up
    viewingTransform.lookAt(eye, center, up);
    viewingTransform.invert();
    viewingTransformGroup.setTransform(viewingTransform);