在Java3d中旋转观察平台

时间:2010-08-18 22:49:54

标签: java 3d rotation java-3d

以下代码将多维数据集放在(0,0,0),另一个放在(0,.5,.5),每个多维数据集的维度为(.5,.5,.5)。我正在尝试将屏幕转到一个像good这样的视图,但我得到了这个视图alt text。而且,我意识到我的颜色向后倾斜了。

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

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函数上的定位。我也不确定向上矢量是什么。关于如何解决这个问题的任何想法?

1 个答案:

答案 0 :(得分:4)

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

BTW,setNominalViewingTransform仅沿z轴平移,因此您展示的屏幕截图是我期望看到的。尝试自己设置视图转换是正确的。

修改

lookAt功能的向上方向而言,这只是一种控制相机滚动的方法。换句话说,通过指定眼点和中心点(相机正在看的点),您只定义了一个方向。相机仍然可以在该轴上旋转360度。如果你想以正确的方式查看事物,那么只需在系统的“向上”方向指定一个向量 - 如果是y那么它将是(0,1,0)。如果你想颠倒一下,那就是(0,-1,0)。

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

<强> EDIT2:

根据您的编辑,看起来好像您已经为“向上”向量而不是方向放置了位置。它应该只是向量(0,1,0)。虽然说它仍然不能解决你的问题,因为一个不正确的“向上”向量只是意味着相机可能最终在它自己的轴上滚动,所以它是颠倒的,在它的一边,等等,但它赢了'影响方向。

因此,眼睛和中心位置一定有问题,或者矩阵仍未反转。您对invert()的修改看起来不对,因为您尚未在lookAt Transform3D上调用它,但我认为这只是一个错字。当你更新问题时?

我会尝试更简单的视角开始。试着用

之类的东西看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值而不是其他值,则可能是裁剪问题。

让我知道你是怎么过的。