2010-08-18 10 views
7

Le code suivant place un cube à (0, 0, 0) et un autre à (0, .5, .5) et chaque cube est (.5, .5, .5) dans dimension. J'essaye de faire pivoter la vue que l'écran obtient à un tel comme ceci good mais à la place j'obtiens cette vue alt text. Aussi, je réalise que j'ai récupéré les couleurs.Rotation de la plate-forme d'affichage dans Java3d

Quoi qu'il en soit, voici 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 maintenant la toile est noire et je pense que ce pourrait être mon positionnement sur la fonction lookat. Je ne suis pas exactement sûr de ce que le vecteur haut est pour. Des idées pour résoudre le problème?

Répondre

4

Je ne suis pas familier avec Java, mais vous pouvez généralement configurer une matrice de vue en utilisant une sorte de fonction "lookAt". Un rapide coup d'oeil à la docs est venu avec this. Ne traduit que le long de l'axe z de sorte que la capture d'écran que vous avez montré est ce que je m'attendais à voir. Vous avez raison d'essayer de configurer la vue pour vous transformer.

Modifier

En ce qui concerne la direction vers le haut pour la fonction lookAt qui concerne ceci est juste un moyen de contrôle du roulis de la caméra. En d'autres termes, en spécifiant le point de vue et le point central (le point que la caméra regarde), vous n'avez défini qu'une direction. La caméra pourrait encore tourner à 360 degrés sur cet axe. Si vous voulez regarder les choses dans le bon sens, il vous suffit de spécifier 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 «haut» est perpendiculaire à la direction définie par l'œil et le centre. Tant que ce n'est pas parallèle à cette direction, la méthode devrait automatiquement utiliser le composant de votre vecteur "up" fourni qui est perpendiculaire à la direction.

Edit2:

En fonction de vos modifications, il semble que vous avez mis dans une position pour le vecteur « up » plutôt qu'une direction. Ce devrait juste être le vecteur (0,1,0). Cela dit, cela ne résoudra toujours pas votre problème, car un vecteur "up" incorrect signifie simplement que la caméra pourrait se retrouver enroulée sur son propre axe de sorte qu'elle soit à l'envers, de son côté, etc. t affecter la direction.

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

Je voudrais essayer un angle de vue plus simple pour commencer. Essayez 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(); 

Qu'est-ce qui se passe avec ça?

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

L'autre possibilité est que votre caméra regarde dans le bon sens mais que les objets soient réformés à cause de l'écrêtage du tronc.Vous pouvez vérifier la documentation pour voir à quoi correspondent les plans de plan par défaut. Cela peut apparaître dans l'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.

Dites-moi comment vous en êtes.

+0

Merci. J'ai trouvé la fonction lookAt mais je pense que je l'utilise mal. J'ai mis à jour mon code grâce à votre suggestion. – SummerCodin

+0

@SummerCodin: La documentation indiquait que la transformation générée par 'lookAt' devrait être inversée pour contrôler un' ViewPlatform'. Essayez de passer 'lookAt.invert()' dans 'setTransform'. – Troubadour

+0

@Troubadour merci pour effacer la fonction lookAt. Cependant, même après avoir défini la direction du haut pour être un point juste au-dessus de l'œil sur l'axe des y, la toile finit toujours par être noire. J'ai mis à jour mon code pour que vous puissiez voir mes modifications. Est-ce que je fais quelque chose d'autre de mal? Merci encore pour votre aide jusqu'à présent. – SummerCodin