Velocidade de um objecto em java 3D

5 respostas
nono

Bom dia.

Temos duvida em como reduzir a velocidade de um cilindro. Ele tem que percorrer um caminho e para isso temos coordenadas que definem o seu percurso. Como se apresenta em seguida:

Cylinder c1 = new Cylinder (0.5f, 0.5f);

Point3f[] positions = {new Point3f(3.17f,0.48f,0), new Point3f(2.75f,0.48f,0.0f),

new Point3f(2.33f,0.48f,0.0f), new Point3f(1.91f,0.48f,0.0f), new Point3f(1.49f,0.48f,0.0f),new Point3f(1.07f,0.48f,0.0f),

new Point3f(0.65f,0.48f,0.0f),new Point3f(0.23f,0.48f,0.0f),

new Point3f(0.48f,1.18f,0.0f),

new Point3f(0.48f,1.92f,0.0f),  new Point3f(0.48f,2.68f,0.0f),  new Point3f(1.22f,2.68f,0.0f),

new Point3f(1.98f,2.68f,0.0f)};

Em seguida temos isto para defenir a velocidade e repartimos o intervalo de knots pelo numero de pontos que temos, o resultado é que o cilindro anda muito rápido, como podemos fazer para reduzir a velocidade?

float[] knots = {0f, 0.083f, 0.166f, 0.249f, 0.332f, 0.415f, 0.498f, 0.581f, 0.664f, 0.747f, 0.831f, 0.913f,1f};
    Alpha alpha = new Alpha();
    TransformGroup target = new TransformGroup();
    target.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    target.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
    target.addChild(c1);  
    Transform3D axis = new Transform3D();
    PositionPathInterpolator interpolator = new PositionPathInterpolator(alpha, target, axis, knots, positions);
    interpolator.setSchedulingBounds(bounds);
    tgTransl.addChild(target);
    root.addChild(interpolator);

Os melhores cumprimentos e desde já agradecemos a ajuda

5 Respostas

jmoreira

O que você está usando para isso? Quais bibliotecas especificas ou especiais?

ViniGodoy

Eu não conheço Java3D, mas no OpenGL, no DirectX e em boa parte das engines gráficas, basta usar a física.

Velocidade = aceleração * intervaloTempo;

O seu intervalo de tempo está sendo definido pelo processador do computador e da placa de vídeo que você está usando. Isso é péssimo, seu cilindro está rápido no seu micro, mas pode ser que esteja lento (ou ainda mais rápido) numa outra máquina.

Então, antes de desloca-lo, obtenha a diferença de tempo entre esse loop e o anterior através da função System.currentTimeMillis(). Depois, multiplique essa diferença pelo desclocamento efetivo que você quer por milisegundo.

Assim você terá um movimento uniforme e independente de processador.

nono

Bom dia, obrigada pela ajuda.
Os import’s que estamos a usar são os seguintes

import java.util.Vector;

import javax.vecmath.<em>;

import java.awt.</em>;

import java.awt.event.<em>;

import java.net.URL;

import javax.media.j3d.</em>;

import com.sun.j3d.utils.universe.<em>;

import com.sun.j3d.utils.geometry.</em>;

import com.sun.j3d.utils.image.<em>;

import com.sun.j3d.utils.behaviors.mouse.</em>;

import com.sun.j3d.utils.behaviors.vp.<em>;

import java.applet.</em>;

import com.sun.j3d.utils.applet.MainFrame;

Os melhores cumprimentos

Marky.Vasconcelos

Eu não conheço essa classe PositionPathInterpolator
Começei a ver o Java3D a pouco tempo.

Mas procura algo sobre MOVERATE nessa classe, para movimentar mais lento é preciso diminuir esse fator.

nono

Obrigada a todos mais uma vez.
Já consegui resolver o problema. Logo após desenhar o caminho que o cilindro deveria seguir tenho que colocar a seguinte linha de codigo: Alpha alpha = new Alpha(-1,8000); assim o cilindro anda mais devagar.

Os melhores cumprimentos

Criado 27 de março de 2008
Ultima resposta 1 de abr. de 2008
Respostas 5
Participantes 4