Java3D - 是否有可能有一个跟踪移动对象的查看平台
Java3D - Is it possible to have a viewingPlatform that tracks a moving object
我有一个非常简单的 Java3D 应用程序,它包含两个立方体,其中一个围绕另一个运行。
像这样:
如您所见,观景台的默认位置是'kind of'鸟瞰图。
看起来像这样的代码
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);
我的问题是,是否可以将观察平台设置为跟踪较大的立方体(围绕较小正方形旋转的立方体)。或者更直接一点,观景台是否可以围绕给定的物体旋转?
更多信息:
我的目标是拥有一个微型太阳系,包含太阳、地球和月球。我想从地球的角度来看它(几乎就像从国际空间站的角度)
任何帮助或指点都会很棒。如果需要,请随时询问更多信息。
你这里有一个很好的例子http://java3d.nl/Tutorials/Java/Java3d/Controlthecamera_12.php
原http://java3d.nl website is no longer available, but you can still use the cached version from the Internet Archive: https://web.archive.org/web/20131218022035/http://java3d.nl/Tutorials/Java/Java3d/Controlthecamera_12.php
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);
}
}
有一个更简单的解决方案。不再尝试使用角度和旋转来控制观看者的视线,您只需说出要看的 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);
我有一个非常简单的 Java3D 应用程序,它包含两个立方体,其中一个围绕另一个运行。
像这样:
如您所见,观景台的默认位置是'kind of'鸟瞰图。
看起来像这样的代码
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);
我的问题是,是否可以将观察平台设置为跟踪较大的立方体(围绕较小正方形旋转的立方体)。或者更直接一点,观景台是否可以围绕给定的物体旋转?
更多信息: 我的目标是拥有一个微型太阳系,包含太阳、地球和月球。我想从地球的角度来看它(几乎就像从国际空间站的角度)
任何帮助或指点都会很棒。如果需要,请随时询问更多信息。
你这里有一个很好的例子http://java3d.nl/Tutorials/Java/Java3d/Controlthecamera_12.php
原http://java3d.nl website is no longer available, but you can still use the cached version from the Internet Archive: https://web.archive.org/web/20131218022035/http://java3d.nl/Tutorials/Java/Java3d/Controlthecamera_12.php
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);
}
}
有一个更简单的解决方案。不再尝试使用角度和旋转来控制观看者的视线,您只需说出要看的 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);