Java 3D - Duvidas

Ola Galera,

sou iniciante com a API Java 3D e gostaria de saber como faço alterar o valor dos eixos (x,y,z) em tempo de exeução.

Por exemplo, através do codigo abaixo, gastaria que os valores dentro do metodo rotateCube fossem mudados em tempo de excução, sendo gerados de modo aleatório e contínuo até o fim do tempo fornecido pelo método Alpha

import com.sun.j3d.utils.universe.SimpleUniverse;
import com.sun.j3d.utils.geometry.ColorCube;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.media.j3d.Canvas3D;
import javax.swing.JFrame;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;

public class Static3DWorld extends JFrame {
    private Transform3D rotate1 = new Transform3D();
    private Transform3D rotate2 = new Transform3D();

   public Static3DWorld() {
     super("Static3DWorld");
     Canvas3D canvas3D = createCanvas3D();
     BranchGroup scene = createSceneGraph();
     connect(canvas3D, scene);
   }

   private Canvas3D createCanvas3D() {
     setSize(300, 300);
     getContentPane().setLayout(new BorderLayout());
     GraphicsConfiguration config =

           SimpleUniverse.getPreferredConfiguration();
     Canvas3D canvas3D = new Canvas3D(config);
     setSize(300, 300);
     getContentPane().add(canvas3D);
     return canvas3D;
   }

   private BranchGroup createSceneGraph() {
      BranchGroup objRoot = new BranchGroup();

   
        TransformGroup objTrans = new TransformGroup();
        objTrans.setCapability(
                            TransformGroup.ALLOW_TRANSFORM_WRITE);
        objRoot.addChild(objTrans);
        Appearance app = new Appearance();
        
        objTrans.addChild(new ColorCube(0.4));      
       
        Transform3D yAxis = new Transform3D();
        Alpha rotationAlpha = new Alpha(5, 4000);
        RotationInterpolator rotator = new RotationInterpolator(
                rotationAlpha, objTrans, yAxis,
                0.0f, (float) Math.PI*2.0f);
        BoundingSphere bounds =
            new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
        rotator.setSchedulingBounds(bounds);
        objRoot.addChild(rotator);

        
        objRoot.compile();

        return objRoot;
   }

   private Transform3D rotateCube() {
     rotate1.rotX(Math.PI / 4.0d);
     rotate2.rotY(Math.PI / 4.0d);
     rotate1.mul(rotate2);
     return rotate1;
   }

   private void connect(Canvas3D canvas3D, BranchGroup scene) {
     SimpleUniverse simpleU = new SimpleUniverse(canvas3D);
     simpleU.getViewingPlatform().setNominalViewingTransform();
     simpleU.addBranchGraph(scene);
   }

   public static void main(String[] args) {
     new Static3DWorld().setVisible(true);
   }
}

Tenho que fazer uam aplicação onde haverá a necessidade da alteração dos valores em tempos de execução. Os dados serão fornecidos por um sensor.

Abraços a todos
Danilo

ola colega…

esse seu metodo rotate cube nao serve a nao ser que vc implemente a Classe Behavior, o que seria complicado para um iniciante…

use RotationInterpolator para rotacionar

Rotation interpolator behavior. This class defines a behavior that modifies the rotational component of its target TransformGroup by linearly interpolating between a pair of specified angles (using the value generated by the specified Alpha object). The interpolated angle is used to generate a rotation transform about the local Y-axis of this interpolator.

RotationInterpolator(Alpha alpha, TransformGroup target, Transform3D axisOfTransform, float minimumAngle, float maximumAngle)
Constructs a new rotation interpolator that varies the target transform node’s rotational component.

com essa classe vc pode rotacionar seu objeto em tempo de execução, ou seja, uma animação

espero ter ajudado…

valeu 8)

ops…

se vc quiser rotacionar o cubo ao seu gosto…

vc tem que habilitar as capacidades do BranchGroup e TransformGroup que contem o seu objeto como filho

objRoot.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE);
objRoot.setCapabiliy(BranchGroup.ALLOW_CHILDREN_EXTEND);

dessa forma vc pode mudar o transform3d do seu objeto em tempo de execução ao seu gosto (entrada do usuario e talls)

Olá,

Ja fiz isso, ele simplesmente gira em torno do eixo y na forma definida pelo metodo rotateCube().

Eu preciso que enquanto o cubo gira em torno de um eixo defino pelo RotationInterpolator, as suas coordenadas sejam alteradas de modo alatorio enquanto executa.

OBs: falto no linha “Transform3D yAxis = new Transform3D();” infomar para o construtor o metodo rotateCube, ficando assim:

Transform3D yAxis = new Transform3D(rotateCube());

não sei se é possivel dentro do metodo rotateCube() colocar um gerador aleatorio para os eixos X e Y, acho que mesmo assim o programa deve pegar somente o primeiro valor gerado.

Abraços,
Danilo