2016-04-12 36 views
1

我刚开始java3D,我可以上/下/左/右/前/后移动相机,但我似乎无法弄清楚如何制作相机例如,角度变化从期待变为向左看。有人能给我一个例子吗?另外,我应该把getViewingPlatform()。getViewPlatformTransform()。setTransform(test.position);在我的主要方法,还是我应该做别的?如何在java中旋转相机/ viewPlatform 3d

我试过只用鼠标和旋转视图 OrbitBehavior orbit = new OrbitBehavior(canvas,OrbitBehavior.REVERSE_ROTATE);

orbit.setSchedulingBounds(new BoundingSphere()); 
orbit.setRotXFactor(2); 
orbit.setRotYFactor(2); 

但它不工作时,我加入getViewingPlatform()getViewPlatformTransform()的setTransform(test.position)。 到主要方法中的while循环。视角反复重置。

+0

请包括你试过的东西。 – Reinard

回答

2

而不是使用角度来转向观看者(相机),您可以通过定义3D“gazePoint”(注意力集中点)来控制它。为了防止相机侧向倾斜,请定义upDir = [0,1,0](J3D采用+ y轴向上)。

然后,修改生活在simpleUniverse中的viewingTransform。

下面是示例代码从我的应用程序:

// ***********declare these variables in class where canvas3D lives ***** 
//J3D stuff 
public InteractiveCanvas3D canvas3D; 
public SimpleUniverse  simpleUniv; 
private Transform3D   viewingTransform; 
private TransformGroup viewingTransformGroup; 

public static Point3d viewersLocation; 
public static Point3d gazePoint; //point viewer is looking at 

// and initialize as follows: 

viewingTransformGroup = simpleUniv.getViewingPlatform().getViewPlatformTransform(); 
viewingTransform = new Transform3D(); 


//called to update viewer's location and gaze: 
// *********************** UpdateViewerGeometryJ3D 
public void UpdateViewerGeometryJ3D() { 
    Point3d eye = viewersLocation; 
    Point3d center = gazePoint; 
    Vector3d up = upDir; 
    viewingTransform.lookAt(eye, center, up); 
    viewingTransform.invert(); 
    viewingTransformGroup.setTransform(viewingTransform); 

我忘了为什么收视变换具有反转。希望这可以帮助。

+0

我有一个问题。当您向左上方向下移动并且摄像机角度发生变化时,方向是否保持不变?例如,如果我向前移动,然后向右看,但再按住前进键,我会向新的方向前进(向右)还是向前移动(开始方向)? –

+0

否。gazePoint(“lookAt()”)不影响观察者的运动,只影响方向。 为了类比橡胶驾驶员,假设高速公路的肩膀上有汽车发生火灾。司机将他们的目光固定在燃烧的汽车(GazePoint)的位置上。他的脖子不停地转动,以便继续看着他正在经过的固定点。 我发现“移动观察者+固定注视点”技术为用户提供了一种真实的三维空间感。它更直观,因为它模仿人类将注意力集中在物体上的方式。 – pbierre