7

以下代码将一个多维数据集放置在 (0, 0, 0) 处,另一个放置在 (0, .5, .5) 处,每个多维数据集的维度为 (.5, .5, .5)。我正在尝试将屏幕的视图旋转到这样的视图,好的但我得到了这个视图替代文字。另外,我意识到我把颜色弄反了。

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

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

1 回答 1

5

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

顺便说一句,setNominalViewingTransform仅沿 z 轴平移,因此您显示的屏幕截图是我希望看到的。您尝试自己设置视图转换是正确的。

编辑

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

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

编辑2:

根据您的编辑,看起来好像您已经为“向上”向量而不是方向放置了一个位置。它应该只是向量 (0,1,0)。话虽如此,它仍然无法解决您的问题,因为不正确的“向上”矢量只是意味着相机最终可能会在自己的轴上滚动,因此它会倒置、侧放等,但它不会t 影响方向。

因此,眼睛和中心位置肯定有问题,否则矩阵仍然没有反转。您对外观的编辑是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 值但看不到其他值,则可能是裁剪问题。

让我知道你是怎么办的。

于 2010-08-18T23:36:00.733 回答