2010-10-12 6 views
3

J'ai un modèle de voiture avec différentes parties de la voiture décrites dans les groupes de vertex.OpenGL: Traduire l'objet en origine

+1

La matrice d'identité ne bougera pas du tout. * Identité * ici est dans le sens de "identique": ne change pas de position du tout. Utilisez les matrices de traduction @ ChrisF pour déplacer chaque pneu de son centre vers l'origine et vers l'arrière. – LarsH

Répondre

6

Vous connaissez la position actuelle du pneu afin que vous utilisez une matrice de translation construit à partir de la matrice d'identité et la position niée pour le traduire à l'origine:

1 0 0 -x 
0 1 0 -y 
0 0 1 -z 
0 0 0 1 

Ensuite, faites pivoter et appliquer ensuite la transformation avant de mettre en arrière:

1 0 0 x 
0 1 0 y 
0 0 1 z 
0 0 0 1 
+0

Ceci est l'affiche originale. Merci pour la réponse. Si on me donne un tas de vertices qui composent le pneu, comment puis-je trouver le point central de ces sommets? Je suppose que c'est ce que les valeurs x y z seront dans ces matrices de traduction. Ai-je besoin de définir une base vectorielle pour mon pneu? – TheGambler

+0

@TheGambler: Regardez vers le haut la boîte de sélection alignée par axe (AABB). Trouvez l'AABB de vos sommets de pneus. Le centre de cette boîte fonctionne généralement bien au centre de votre pneu. Pour les objets de forme plus bizarre, vous pourriez plutôt vouloir le centre de masse, ce qui est plus compliqué à calculer. Dans ces cas, il revient généralement à l'artiste de centrer le modèle à l'endroit approprié, ou au moins d'ajouter un marqueur exportable pour marquer cette position. – Alan

0

Voici le code:

glTranslatef(x_translate_factor,y_translate_factor,z_translate_factor); 
glRotatef(global_car_rotate,0,1,0) ; 
glRotatef(global_tire_rotate,0,1,0); 
glRotatef(tire_speed,1,0,0); 

Lorsque la vitesse du pneu est la vitesse d'essorage du pneu, global_tire_rotate est la rotation du pneu par rapport à la voiture. Global_car_rotate est la rotation de la voiture (et des objets avec la roue) par rapport à l'axe z. * _translate_factor est la * -position de la voiture dans votre scence. Cela a fonctionné très bien pour moi, j'espère que cela fera pour vous;).

1

Vous voudrez peut-être vérifier glPushMatrix() et glPopMatrix(). glPushMatrix() sauvegardera toutes les opérations de translation/mise à l'échelle/rotation que vous avez précédemment utilisées (c'est-à-dire votre ancienne matrice de vue de modèle). Lorsque vous poussez votre ancienne matrice de vue de modèle, vous travaillerez alors à l'origine. Ensuite, vous pouvez effectuer toute nouvelle opération de translation/rotation/mise à l'échelle vers ce que vous dessinez actuellement. Enfin, vous appelez glPopMatrix(). Cela rechargera votre ancienne matrice de vue de modèle. C'est le moyen le plus propre et le plus facile de penser à ces opérations.

glPushMatrix(); 
// at this point you're working at the origin 
// translate the tire here 
// rotate the tire here 
glPopMatrix(); 

En général, c'est un bon moyen de positionner quelque chose que vous dessinez.