在Java3d中旋转观察平台

以下代码将立方体放在(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函数的定位。 我也不完全确定向上的向量是什么。 有想法该怎么解决这个吗?


我不熟悉Java,但通常可以使用某种“lookAt”函数设置视图矩阵。 快速查看文档提出了这一点。

顺便说一句, 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值,但不是别人,那么它可能是一个剪辑问题。

让我知道你是怎么办的。

链接地址: http://www.djcxy.com/p/47533.html

上一篇: Rotating the viewing platform in Java3d

下一篇: Query for accurate and localized list of installed Windows updates