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」関数を使用してビューマトリックスを設定できます。ドキュメントをざっと見て、これを思いついた。

ところで、setNominalViewingTransformz軸に沿ってのみ翻訳されるので、あなたが示したスクリーンショットは私が期待するものです。ビュー変換を自分で設定しようとするのは正しいことです。

編集

機能のアップ方向に関するlookAt限り、これはカメラのロールを制御する方法にすぎません。つまり、アイポイントとセンターポイント(カメラが見ているポイント)を指定することで、方向を定義しただけです。カメラはその軸を中心に360度回転できます。物事を正しい方向に見たい場合は、システムで「上」の方向にベクトルを指定するだけです。それがyの場合、(0,1,0)になります。物事を逆さまに見たい場合は、(0、-1,0)になります。

「上」ベクトルが目と中心によって定義された方向に垂直であることを確認する必要はないことに注意してください。その方向に平行でない限り、メソッドは、その方向に垂直な、指定された「上」ベクトルのコンポーネントを自動的に使用する必要があります。

Edit2:

編集に基づいて、方向ではなく「上」ベクトルの位置に配置したように見えます。ベクトル(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を試してから、いくつかの負の値も試してください。

もう1つの可能性は、カメラが正しい方向を向いているが、錐台のクリッピングのためにオブジェクトがカリングされていることです。ドキュメントをチェックして、デフォルトのクリッププレーンが何に設定されているかを確認することをお勧めします。これは、上記の例で、z軸に沿って目の位置を変更したときに表示される場合があります。zの一部の値についてオブジェクトを表示できるが、他の値は表示できない場合は、おそらくクリッピングの問題です。

どうやって乗るのか教えてください。

于 2010-08-18T23:36:00.733 に答える