2010-06-03 17 views
3

Je cherche un moyen de déterminer la rotation X/Y/Z optimale d'un ensemble de sommets pour le rendu (en utilisant les coordonnées X/Y, en ignorant Z) sur un canevas 2D . J'ai eu quelques idées, l'une étant la force brute pure impliquant l'exécution d'une boucle tridimensionnelle allant de 0..359 (soit par pas de 1 ou plus, en fonction des résultats/exigences de vitesse) sur le ensemble de sommets, mesurant la différence entre le min/max sur les deux axes X/Y, en stockant les paires de résultats/rotation les plus élevées et en utilisant la paire la plus efficace. La deuxième idée serait de déterminer les deux points avec la plus grande distance entre eux dans la distance euclidienne, calculer l'angle nécessaire pour faire tourner le «chemin» entre ces deux points pour pondre le long de l'axe X (encore une fois, nous sommes en ignorant l'axe Z, de sorte que la profondeur dans le résultat n'aurait pas d'importance) puis en répétant plusieurs fois. Le problème que je peux voir avec ceci est d'abord en le répétant que nous pouvons remplacer notre rotation précédente par une nouvelle rotation, et que la rotation originale/ultérieure peut ne pas nécessairement entraîner la plus grande surface 2D utilisée. Le deuxième problème est que si nous utilisons une seule itération, le même problème se produit - les deux points les plus éloignés peuvent ne pas avoir d'autres points alignés sur le même 'chemin', et nous n'obtiendrons probablement pas de rotation optimale pour un projet 2D . L'utilisation de la deuxième idée, peut-être en utilisant le premier dire 3 itérations, en stockant l'angle de rotation requis, et en faisant la moyenne sur les 3 rendrait un résultat plus précis, car il prend en compte non seulement une rotation mais 'paires'.Rotation optimale du modèle 3D pour la projection 2D

S'il vous plaît, déchirer ces idées à part, donner un aperçu de votre choix. Je suis intressé pour voir quelles solutions vous pourriez avoir, ou des algorithmes inconnus de moi que vous pourriez citer.

+2

Vous avez demandé une solution optimale, mais la mesure à optimiser (ou les mesures) n'est pas claire. Pouvez-vous clarifier ? Vous vous référez également à «plus efficace» mais encore une fois, on ne sait pas comment vous mesureriez l'efficacité relative. –

+0

Peut-être que je devrais changer ma question - je cherche la solution _any_. Aucun des deux que j'ai décrits ne semble être très efficace. Ce que je me demande est s'il y a une technique qui peut effectuer les tâches requises d'autres manières que celles décrites. En se référant à «optimal», la rotation résultante «optimale» signifierait la plus grande différence de coordonnées min/max x/y pour l'ensemble des sommets. – Seidr

+0

Votre corps est-il convexe? Si ce n'est pas le cas, le problème est plus difficile. –

Répondre

3

Je calculerais les principaux axes d'inertie, et prend le vecteur d'axe v avec le moment correspondant le plus élevé. Je ferais ensuite pivoter les sommets pour aligner v avec l'axe z. Faites-moi savoir si vous voulez plus de détails sur la façon de s'y prendre. Intuitivement, on trouve ici l'axe sur lequel il est le plus difficile de faire tourner les points, c'est-à-dire autour desquels les sommets sont les plus «étalés». Sans une définition concrète de ce que vous considérez comme optimal, il est impossible de dire si cette méthode est performante. Cependant, il a quelques propriétés souhaitables:

  • Si les sommets sont coplanaires, cette méthode est optimale en ce qu'elle alignera toujours ce plan avec le plan x-y.

  • Si les sommets sont disposés dans une boîte rectangulaire, la plus petite dimension de la boîte s'aligne sur l'axe z.

EDIT: Voici des informations plus détaillées sur la façon de mettre en œuvre cette approche.

D'abord, affectez une masse à chaque sommet. Je vais discuter des options pour la façon de faire ci-dessous. Ensuite, calculez le centre de masse de votre ensemble de sommets. Ensuite, traduisez tous vos sommets par -1 fois le centre de masse, de sorte que le nouveau centre de masse soit maintenant (0,0,0).

Calculer le moment du tenseur d'inertie. C'est une matrice 3x3 dont les entrées sont données par des formules que vous pouvez trouver sur Wikipedia. Les formules dépendent uniquement des positions de sommet et des masses que vous leur avez assignées.

Vous devez maintenant diagonaliser le tenseur d'inertie. Comme il est symétrique positif-défini, il est possible de le faire en trouvant ses vecteurs propres et ses valeurs propres. Malheureusement, les algorithmes numériques pour les trouver tendent à être compliqués; l'approche la plus directe nécessite de trouver les racines d'un polynôme cubique. Cependant trouver les valeurs propres et vecteurs propres d'une matrice est un problème extrêmement commun et tout paquet d'algèbre linéaire digne de ce nom viendra avec du code qui peut le faire pour vous (par exemple, le paquet d'algèbre linéaire open source Eigen a SelfAdjointEigenSolver). également être en mesure de trouver un code plus léger spécialisé dans le cas 3x3 sur Internet.

Vous disposez maintenant de trois vecteurs propres et de leurs valeurs propres correspondantes. Ces valeurs propres seront positives. Prenez le vecteur propre correspondant à la plus grande valeur propre; ce vecteur pointe dans la direction de votre nouvel axe z.

Maintenant, à propos du choix de la masse. La chose la plus simple à faire est de donner à tous les vertices une masse de 1. Si tout ce que vous avez est un nuage de points, c'est probablement une bonne solution.

Vous pouvez également définir la masse de chaque étoile comme sa masse réelle si vous avez accès à ces données. Si vous faites cela, l'axe z que vous calculerez sera également l'axe autour duquel le système stellaire tourne (le plus probablement).

+0

Merci pour cette avance - je vais regarder dans et voir si je peux trouver plus d'informations.J'apprends mieux en trouvant des exemples et en les adaptant, mais si je rencontre des problèmes (au début, je ne vois pas beaucoup de références au terme «axes principaux d'inertie»), je reviendrai demander de l'aide. +1 pour le moment, car il semblerait que cela aboutirait à ce que je cherche à accomplir. – Seidr

+0

Après quelques lectures (accordées, peu comme je viens de commencer à travailler - occupation sans rapport, genre de ..) il apparaît que les «axes d'inertie principaux» que vous avez mentionnés s'appliquent aux corps dont nous connaissons le volume et la masse. Alors qu'il serait possible de calculer le volume de ce nuage de points, sa masse serait une autre histoire. Techniquement, il n'a pas de masse, puisqu'il définit simplement une zone d'espace 3D? Je ferai une autre recherche plus tard, mais le temps de travail maintenant. ty Note: tout ce à quoi j'ai accès est un ensemble de POINTS (coordonnées x/y/z), tous alignés autour de 0,0,0. Ces coordonnées peuvent être de l'ordre de -1..1. – Seidr

+0

Je vais ajouter plus de détails sur la façon de mettre en œuvre à ma réponse. – user168715

0

Cette réponse est destinée à être valide uniquement pour les polyèdres convexes.

En http://203.208.166.84/masudhasan/cgta_silhouette.pdf vous pouvez trouver

« Dans cet article, nous étudions comment sélectionner les points de vue de polyèdres convexe telle que la silhouette satisfait certaines propriétés. Plus précisément, nous donnons des algorithmes pour trouver ci toutes les projections d'un convexe polyèdre tel qu'un ensemble donné d'arêtes, de faces et/ou de sommets apparaissent sur la silhouette. "

Le papier est une analyse en profondeur des propriétés et des algorithmes des projections de polyèdres. Mais ce n'est pas facile à suivre, je dois l'admettre. Avec cet algorithme, votre problème est la combinatoire: sélectionnez tous les ensembles de sommets possibles, vérifiez s'il existe ou non une projection pour chaque ensemble et, s'il existe, calculez l'aire de la coque convexe de la silhouette.

Vous n'avez pas fourni le nombre approximatif de vertex. Mais comme toujours, une solution combinatoire n'est pas recommandée pour les grandeurs illimitées.