Tentando criar hélice giratória. Continua girando em torno da origem, não ela mesma

StackOverflow https://stackoverflow.com/questions/4053745

  •  27-09-2019
  •  | 
  •  

Pergunta

Estou tentando criar uma hélice de avião giratório em Java 3D. No momento, está girando em torno da origem. No entanto, preciso que ele gire em torno de si mesmo. Eu não fiz muitos gráficos 3D em Java, então estou praticamente perplexo.

TransformGroup rotateTheBlades = new TransformGroup();
rotateTheBlades.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
Alpha rotationAlpha = new Alpha(-1,5000);

RotationInterpolator rotator = new RotationInterpolator(
         rotationAlpha,rotateTheBlades);

Transform3D abc = new Transform3D();
abc.rotZ(Math.PI/2);

rotator.setTransformAxis(abc);
rotator.setSchedulingBounds(new BoundingSphere());
rotateTheBlades.addChild(rotator);
rotateTheBlades.addChild(propeller);

sceneBG.addChild(rotateTheBlades);

Qualquer ajuda seria muito apreciada. PS: Eu tentei traduzi -lo para a origem antes e depois, mas parece não fazer nada.

Foi útil?

Solução

Sem saber Java suficiente para dar uma resposta completa; A solução correta em termos de matemática é como você suspeita: traduzir o centro do objeto para originar, girar e traduzi -lo novamente em sua posição original.

No entanto, é provável que (ou seja, suponho) que, quando você combina transformações, elas estão pós-multiplicadas para dar o efeito de que as transformações acontecem no espaço do modelo. O que você provavelmente deseja é pré-multiplicação, para dar o efeito de que as transformações ocorrem no espaço mundial.

Considere as velas de um moinho de vento. No código, você deseja traduzir para o topo do moinho de vento e chamar a rotina que desenha as velas. Essa rotina pode aplicar uma rotação e depois desenhar. Mas em termos de transformações, você realmente deseja girar as velas enquanto estiver na origem, para que elas girem em torno do centro e depois movam -as para fora. Portanto, as transformações são aplicadas na ordem oposta à ordem em que você as solicita.

O que isso significa é que você deseja aplicar as transformações como:

  1. Afaste -se da origem
  2. girar
  3. mover para a origem

Por exemplo, se você estava no OpenGL (que também é pós-multiplier e fácil de seguir neste exemplo, mesmo que você não o saiba), você pode fazer:

glTranslatef(centreOfBody.x, centreOfBody.y, 0.0f);
glRotatef(angle, 0.0f, 0.0f, 1.0f);
glTranslatef(-centreOfBody.x, -centreOfBody.y, 0.0f);

Outras dicas

A abordagem sugerida por @tommy está correta. Como GL, as transformações do contexto gráfico Java são concatenated "da maneira mais útil", que eu penso como último-in, primeiro a sair. Um típico paintComponent() o método é mostrado abaixo e neste completo exemplo.

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.translate(this.getWidth() / 2, this.getHeight() / 2);
    g2d.rotate(theta);
    g2d.translate(-image.getWidth(null) / 2, -image.getHeight(null) / 2);
    g2d.drawImage(image, 0, 0, null);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top