2010-10-29 3 views
2

J'essaie de créer une hélice d'avion en rotation dans Java 3D. Pour l'instant, il tourne autour de l'origine. Cependant, j'en ai besoin pour tourner autour de lui-même. Je n'ai pas fait beaucoup de graphismes 3D en Java, donc je suis à peu près perplexe.Essayer de créer une hélice tournante. Je tourne autour de l'origine, pas elle-même

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

Toute aide serait grandement appréciée. PS: J'ai essayé de le traduire à l'origine avant et après mais ça ne semble pas faire quoi que ce soit. Sans connaître suffisamment Java pour donner une réponse complète;

Répondre

2

la solution correcte en termes de maths est ce que vous soupçonnez: traduire le centre de l'objet en origine, le faire pivoter, puis le replacer dans sa position d'origine.

Cependant, il est probable (c'est-à-dire, j'imagine) que lorsque vous combinez des transformations, elles sont post-multipliées pour donner l'effet que les transformations se produisent dans l'espace objet. Ce que vous voulez probablement, c'est la pré-multiplication, pour donner l'effet que les transformations se produisent dans l'espace du monde.

Considérez les voiles d'un moulin à vent. Dans le code, vous voulez être en mesure de traduire au sommet du moulin à vent, puis appelez la routine qui dessine les voiles. Cette routine peut appliquer une rotation puis dessiner. Mais en termes de transformations, vous voulez en fait faire tourner les voiles à l'origine pour qu'elles tournent autour de leur centre, puis les sortir. Ainsi, les transformations sont appliquées dans l'ordre inverse de l'ordre dans lequel vous les demandez.

Ce que cela signifie est que vous voulez appliquer les transformations que:

  1. se éloigner de l'origine
  2. faites pivoter
  3. passage à l'origine

Par exemple, si vous étaient en OpenGL (qui est également un post-multiplicateur, et assez facile à suivre dans cet exemple, même si vous ne le savez pas réellement), vous pourriez faire:

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

L'approche proposée par @Tommy est correcte. Comme GL, les transformations du contexte graphique Java sont concatenated "de la manière la plus courante", que je considère comme dernier en, premier-sorti. Une méthode typique paintComponent() est montrée ci-dessous et dans ce example complet.

@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); 
} 
Questions connexes