2017-07-21 6 views
0

J'essaie de changer l'orientation de mes objets vers le centre avec atan2f mais cela me donne une mauvaise valeur. Ai-je tort quelque part?atan2f() ne fonctionne pas

glm::vec3 center = glm::vec3(0.4f, 0.4f, 0.0f); 
for(int i = 0; i < num; i++){ 
    float rel = i/(float) num; 
    float angle = rel * M_PI * 2; 
    glm::vec3 position = glm::vec3(cos(angle), glm::sin(angle), position.z); 

    position.x *= radius; position.y *= radius; 
    position.x += center; position.y += center; 
    glm::mat4 trans = glm::translate(glm::mat4(1.0f), position); 

    float newAngle = atan2f(position.y - center.y, position.x - center.x); 

    glm::mat4 rotation = glm::rotation(glm::mat4(1.0f), newAngle, glm::vec3(0, 0, 1)); 

    numModel.at(i) = trans * rotation; 
} 
+0

Pouvez-vous remarquer quelque chose de spécial au sujet de la mauvaise valeur? Peut-être que vous avez besoin d'inverser le signe ou ajouter 'pi/2' à lui ou quelque chose de similaire. – HolyBlackCat

+0

@HolyBlackCat Merci pour votre réponse. J'ai 3 objet, si j'essaye de changer leur angle avec atan2f, j'en ai un reste à 0 degrés, un autre approximativement 120 degrés et un autre -120 degrés. La valeur des droits doit être de 90 degrés, 135 degrés environ, et la dernière environ -135 degrés aussi .. – Vitge

Répondre

0

Si vous souhaitez faire pivoter un objet autour du centre du monde, vous devez mettre en place une matrice de rotation première:

float angle = ...; 
glm::vec3 rotAxis(...); 
glm::mat4 rotMat = glm::rotation(glm::mat4(1.0f), angle, rotAxis); 

Notez la fonction glm::rotation calcule le sinus et le cosinus de l'angle et définit les champs appropriés à l'intérieur de la matrice.

2 vous devez configurer vos objets de matrice de position, c'est la matrice qui décrit la position initiale de l'objet:

glm::vec3 position(radius, 0.0f, 0.0f); 
glm::mat4 transMat = glm::translate(glm::mat4(1.0f), position); 

Pour faire pivoter l'objet autour du centre du monde, vous devez multiplier la rotation matrice rotMat par la matrice modèle transMat, car la matrice de rotation définit le système de référence, pour placer l'objet.

glm::mat4 modelMat = rotMat * transMat; 

Si vous souhaitez faire pivoter un objet autour de son propre origine, vous devez d'abord placer votre objet dans le monde et vous devez le faire pivoter:

glm::mat4 modelMat = transMat * rotMat; 

Voir aussi la réponse à la question OpenGL transforming objects with multiple rotations of Different axis

Dans votre cas, où vous voulez que l'objet soit dirigé vers le centre du monde, vous devez d'abord traduire l'objet à sa place. 2ème vous devez calculer l'angle entre l'axe X du monde et la direction de l'objet au centre. Enfin, vous devez tourner l'objet dans le opposé direction.

glm::vec3 position(...); 
glm::vec3 center(...); 
glm::mat4 transMat = glm::translate(glm::mat4(1.0f), position); 

float angle = atan2f(center.y - position.y, center.x - position.x); 

glm::vec3 rotAxis(0.0f, 0.0f, 1.0f); 
glm::mat4 rotMat = glm::rotation(glm::mat4(1.0f), -angle, rotAxis); 

glm::mat4 modelMat = transMat * rotMat; 
+0

Salut, j'ai déjà créé l'objet autour du centre et fait le traduire. Ce que j'essaie de faire, ce n'est pas de tourner autour d'un centre mais d'orienter les sommets de mes objets vers le centre. – Vitge

+0

@Vite Je vois, j'ai étendu ma réponse. – Rabbid76

+0

Merci, c'était ça ... Si évident – Vitge