2010-08-18 53 views
7

以下代码将立方体置于(0,0,0),而将另一个置于(0,.5,.5)处,并且每个立方体置于(.5,.5,.5)中尺寸。我试图旋转屏幕变成这样的视图good,但是我得到这个视图alt text。另外,我意识到我已经把颜色倒退了。在Java3d中旋转观察平台

无论如何,这是到目前为止我的代码:

import com.sun.j3d.utils.geometry.*; 
import com.sun.j3d.utils.universe.*; 
import javax.media.j3d.*; 
import javax.vecmath.*; 

public class Positioning { 
    private Color3f lightBlue; 
    private Color3f aquaGreen; 
    private Color3f white; 
    private Color3f teal; 
    private BranchGroup group; 
    private SimpleUniverse universe; 

    public Positioning() { 
     lightBlue = new Color3f(0.0f, 0.749019608f, 1.0f); 
     aquaGreen = new Color3f(0.439215686f, 0.858823529f, 0.576470588f); 
     white = new Color3f(1.0f, 1.0f, 1.0f); 
     teal = new Color3f(0.196078431f, 0.6f, 0.8f); 

     universe = new SimpleUniverse(); 
     group = new BranchGroup(); 

     addCube(0.5f, 0.5f, 0.5f, new Vector3f(0.0f, 0.0f, 0.0f), lightBlue); 
     addCube(0.5f, 0.5f, 0.5f, new Vector3f(0.5f, 0.0f, 0.5f), aquaGreen); 

     //add light 
     DirectionalLight light1 = new DirectionalLight(white, new Vector3f(0.0f, 7.0f, -12.0f)); 
     light1.setInfluencingBounds(new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0)); 
     group.addChild(light1); 

     //look at the right spot 
     Transform3D lookAt = new Transform3D(); 
     lookAt.lookAt(new Point3d(0.0, 0.0, 3.0), new Point3d(0.0, 0.0, 0.0), new Vector3d(1.0, 1.0, 0.0)); 
     lookAt.invert(); 
     universe.getViewingPlatform().getViewPlatformTransform().setTransform(lookAt); 
     universe.addBranchGraph(group); 
    } 

    public void addCube(float x, float y, float z, Vector3f position, Color3f color) { 
     TransformGroup tg = new TransformGroup(); 
     Transform3D trans = new Transform3D(); 

     Appearance app = new Appearance(); 
     Material mat = new Material(); 
     mat.setDiffuseColor(color); 
     mat.setSpecularColor(color); 
     app.setMaterial(mat); 
     Box b = new Box(x, y, z, app); 

     //move into position and add to the branch group 
     trans.setTranslation(position); 
     tg.setTransform(trans); 
     tg.addChild(b); 

     group.addChild(tg); 
    } 

    public static void main(String[] args) { 
     new Positioning(); 
    } 
} 

所以现在画布是黑色的,我想可能是我上的lookAt功能定位。我也不完全确定向上的向量是什么。有想法该怎么解决这个吗?

回答

4

我对Java并不熟悉,但通常可以使用某种“lookAt”函数设置视图矩阵。快速浏览文档this

顺便说一句,setNominalViewingTransform只能沿z轴平移,所以你展示的截图是我期望看到的。试图自己设置视图变换是正确的。

编辑

至于对lookAt功能向上的方向来讲,这是控制相机的卷的只是一种方法。换句话说,通过指定视点和中心点(相机正在查看的点),您只定义了一个方向。相机仍然可以在该轴上旋转360度。如果你想正确地看待事情,那么只需在系统中向上指定一个向量 - 如果是y,那么它就是(0,1,0)。如果你想颠倒看看,那就是(0,-1,0)。

请注意,您不必确保“向上”向量垂直于由眼睛和中心定义的方向。只要它不平行于那个方向,那么该方法应该自动使用你提供的垂直于方向的“向上”向量的分量。

EDIT2:

根据您的编辑看来,如果你已经把在一个位置为“向上”的矢量,而不是一个方向。它应该是矢量(0,1,0)。话虽如此,它仍然不能解决你的问题作为一个不正确的“向上”向量,只是意味着相机可能最终在自己的轴上滚动,从而使它颠倒,侧面等,但它赢得了“不会影响方向。

因此,眼睛和中心位置肯定有问题,或者矩阵仍然没有倒置。您对invert()的编辑看起来不正确,因为您尚未在lookAtTransform3D上调用它,但我认为这只是一个错字。当你更新这个问题时?

我会尝试一个更简单的视角开始。只是尝试沿着Z轴看像

Transform3D lookAt = new Transform3D(); 
    lookAt.lookAt(new Point3d(0.0, 0.0, 1.0) 
       , new Point3d(0.0, 0.0, 0.0) 
       , new Vector3d(0.0, 1.0, 0.0)); 
    lookAt.invert(); 

这会发生什么?

如果你仍然黑,然后尝试改变沿z轴的眼点的位置,也许尝试2.0,3.0,然后再尝试一些负值。

另一种可能性是,您的相机正在朝正确的方向看,但由于截锥切割物体正在被剔除。您可能想要查看文档以查看默认剪贴板设置为的内容。当您沿着z轴改变眼睛位置时,这可能会在上面的示例中显示出来。如果你可以看到你的对象的z值,但不是别人,那么它可能是一个剪辑问题。

让我知道你如何继续。

+0

谢谢。我确实找到了lookAt函数,但我认为我错误地使用了它。感谢您的建议,我更新了我的代码。 – SummerCodin 2010-08-18 23:56:52

+0

@SummerCodin:文档确实表示'lookAt'生成的变换应该颠倒过来以控制'ViewPlatform'。尝试将'lookAt.invert()'传递给'setTransform'。 – Troubadour 2010-08-19 09:04:01

+0

@Troubadour感谢清理lookAt功能。但是,即使将向上方向设置为y轴上眼睛正上方的点,画布仍然会全部变黑。我已更新我的代码,以便您可以看到我的更改。我做错了什么吗?到目前为止,再次感谢您的帮助。 – SummerCodin 2010-08-19 21:22:35