2017-04-05 3 views
1

Je crée un jeu dans qt Creator en utilisant C++ et OpenGL et j'essaye d'ajouter des boîtes de délimitation à ma scène afin d'implémenter la détection de collision. J'utilise des objets importés de Maya comme .obj dans ma scène afin que leurs dimensions ne soient pas définies dans le code, seulement leur position, leur rotation et leur échelle. Je suis capable de créer un cadre autour de chaque objet qui correspond à leur position, mais j'ai du mal à trouver un moyen d'accéder aux valeurs min et max x, y et z des objets afin de faire correspondre la boîte à la taille de l'objet.Comment accéder aux coordonnées min et max d'un objet 3D en C++?

Est-ce que quelqu'un a des idées sur la façon dont je pourrais accéder aux coordonnées min et max? Je sais comment implémenter le code si je pouvais accéder à ces valeurs.

+1

Si vous êtes déjà en mesure de créer la boîte englobante, quel est le problème? – Vallentin

+0

@Vallentin - si vous avez continué à lire pour 2 autres lignes, vous vous rendez compte que ce n'est pas le cas. L'OP crée une boîte de "bounding" qui ne limite pas vraiment la géométrie. – dtech

+0

Je l'ai lu.Prendre les min et max de x, y, z de tous les sommets créerait une boîte englobante qui conviendrait. Le seul cas auquel il ne conviendrait pas, c'est si le maillage est tourné plus tard, ce que OP ne mentionne pas à propos d'être le cas pour ce n'est pas approprié. – Vallentin

Répondre

1

Le problème que vous vous posez est que chaque géométrie d'objet a différents moyens de stockage interne et la détermination d'un cadre de délimitation.

Essayons quelques exemples pour illustrer ceci:

  • Supposons que nous ayons un cercle, dont les paramètres dessin stocké en interne sont les coordonnées du centre x_center et y_center et le rayon radius. Si vous essayez de déterminer la zone de délimitation pour cet objet, vous verrez qu'il s'étend de (x_center - radius, y_center - radius) à (x_center + radius, y_center + radius). Dans le cas où vous avez un rectangle non-aligné, donné par les deux points de sa diagonale principale, le cadre de délimitation coïncide avec sa forme, vous n'avez donc qu'à donner les coordonnées des deux mêmes points qui le représentent. Si, dans l'autre sens, nous avons un polygone, le cadre de délimitation sera déterminé par les coordonnées minimales et maximales de tous les sommets du polygone. Si vous permettez de faire pivoter le polygone, vous devrez faire pivoter toutes les coordonnées des sommets avant de déterminer leurs valeurs maximum et minimum, pour obtenir la boîte englobante. Si, pour un autre exemple, nous avons une spline cubique, déterminée par les coordonnées de ses quatre points de contrôle, vous déterminerez les valeurs maximum et minimum de deux polygones cubiques, ce qui signifie la résolution de deux équations quadratiques (après dérivation), dans le cas général.

Pour faire face à toutes ces choses, une forme géométrique comprend normalement un moyen de polymorphically le construire est boîte englobante (il est normalement même mises en cache, de sorte que vous n'avez pas à calculer, seulement après des rotations ou des variations de c'est la position ou l'échelle) via une méthode d'instance.

Bien sûr, tout dépend de comment et comment a défini la façon dont les formes sont implémentées. peut-être que votre cas est plus simple que ce que j'expose ici, mais vous ne le dites pas. Vous n'affichez pas non plus de code ou de données d'entrée/sortie, comme indiqué dans la page How to create a Minimal, Complete, and Verifiable example. Donc, vous feriez mieux d'éditer votre question et d'ajouter votre code d'exemple, qui montrera plus d'informations sur votre problème exact.

0

Si vous avez un chargeur d'obj, vous avez un tableau.

float t[2100]; 
int x = 2100; 
float xmax=-123243; 
while(x>=0) 
{ 
    if(xmax<t[x]) xmax=t[x]; 
    x-=3; 
} 

Voici donc un maximum de x de l'objet (?).