Rotation de la plate-forme de visualisation dans Java3d


Le code suivant met un cube à (0, 0, 0) et un autre à (0, .5, .5) et chaque cube est (.5, .5, .5) dans la dimension. J'essaie de faire pivoter la vue que l'écran obtient en une comme celle-ci Bien mais à la place j'obtiens cette vue le texte d'alt. Aussi, je me rends compte que j'ai les couleurs à l'envers.

De toute façon, c'est mon code jusqu'à présent:

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();
    }
}

Donc, en ce moment, la toile est noire et je pense que c'est peut-être mon positionnement sur la fonction lookAt. Je ne suis pas non plus exactement sûr à quoi sert le vecteur up. Tout des idées sur la façon de résoudre ce problème?

Author: SummerCodin, 2010-08-19

1 answers

Je ne connais pas Java mais vous pouvez généralement configurer une matrice de vue en utilisant une sorte de fonction "lookAt". Un rapide coup d'œil aux documents est venu avec this.

BTW, setNominalViewingTransform ne traduit que le long de l'axe z, donc la capture d'écran que vous avez montrée est ce que je m'attendais à voir. Vous avez raison d'essayer de définir la vue vous transformer.

Modifier

En ce qui concerne la direction vers le haut de la fonction lookAt, ce n'est qu'un moyen de contrôler le roulis de la caméra. En d'autres termes, en spécifiant le point de vue et le point central (le point de la caméra regarde), vous avez défini un sens. La caméra pouvait toujours tourner à 360 degrés sur cet axe. Si vous voulez regarder les choses dans le bon sens, spécifiez simplement un vecteur dans la direction de "up" dans votre système - si c'est y alors ce serait (0,1,0). Si vous vouliez regarder les choses à l'envers,ce serait (0, -1,0).

Notez que vous n'avez pas à vous assurer que le vecteur " up " est perpendiculaire à la direction définie par l'œil et le centre. Tant qu'elle n'est pas parallèle à cette direction, la méthode doit automatiquement utiliser le composant de votre vecteur "up" fourni qui est perpendiculaire à la direction.

Edit2:

Sur la base de vos modifications, il semble que vous ayez placé une position pour le vecteur "up" plutôt qu'une direction. Ce devrait être juste le vecteur (0,1,0). Cela dit, cela ne résoudra toujours pas votre problème en tant que vecteur "up" incorrect cela signifie simplement que la caméra pourrait se retrouver enroulée sur son propre axe de sorte qu'elle soit à l'envers, sur le côté, etc. mais il n'affectera pas la direction.

Par conséquent, il doit y avoir quelque chose de mal avec les positions de l'œil et du centre ou la matrice n'est toujours pas inversée. Votre edit pour le invert() semble faux car vous ne l'avez pas appelé sur votre lookAt Transform3D mais je suppose que c'est juste une faute de frappe. lorsque vous avez mis à jour la question?

J'essaierais un angle de vision plus simple pour commencer. Essayez juste de regarder le long de l'axe z avec quelque chose comme

    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();

Que se passe-t-il avec ça?

Si vous obtenez toujours du noir, essayez de changer la position du point oculaire le long de l'axe z, essayez peut-être 2.0, 3.0, puis quelques valeurs négatives aussi.

L'autre possibilité est que votre appareil photo regarde dans la bonne direction mais que les objets sont abattus en raison de l'écrêtage du tronc. Vous pouvez consulter la documentation pour voir ce que les plans de clip par défaut sont définis. Cela pourrait apparaître dans le exemple ci-dessus lorsque vous changez la position de l'œil le long de l'axe z. Si vous pouvez voir vos objets pour certaines valeurs de z mais pas d'autres, c'est probablement un problème d'écrêtage.

Faites-moi savoir comment vous allez.

 4
Author: Troubadour, 2010-08-19 23:58:36