2015-08-24 1 views
11

Je travaille sur quelques graphiques de rendu, j'ai un modèle comme celui-ci, j'utilise des outils de toile Java et de fenêtrage, autrement écrit indépendamment.Depth trier les polygones rectangulaires, toutes les parties des axes du modèle

3d-frame model

Toutes les parties sont des polygones rectangulaires ou segments de ligne. Comme cela arrive dans ce modèle, toutes les parties du polygone sont alignées avec les plans x, y ou z, l'origine xy s'exécutant à partir du coin avant du modèle dans l'image. (Il est possible de discerner la subdivision rectangulaire des côtés en regardant de près comment ils apparaissent rapiécés - mais la suppression de cet artefact n'est pas abordée ici)

Je n'ai pas trouvé une technique pour obtenir une profondeur propre -sort, celui-ci est basé sur le sommet le plus éloigné. J'ai essayé des techniques naïves et ils ont tous des artefacts différents. J'ai noté le partitionnement de l'espace binaire et l'algorithme de Newell sans creuser, mais j'ai le sentiment qu'il devrait y avoir un moyen plus facile dans ce cas, en particulier à condition que toutes les parties soient alignées à droite et parallèles aux axes. Des conseils sur les moyens à son sujet apprécié

Mise à jour

Je suis venu avec cette idée qui pourrait avoir quelque chose pour elle

comparison of rectangular polygons

Compte tenu de la contrainte face plane, il y a 6 relations possibles, (plan xx), plan (xy), (plan xz), (plan yy), (plan yz) et (plan zz).

Il est facile de trier deux polygones s'ils partagent le même plan, les 3 autres combinaisons sont indiquées ci-dessus (xy sur xz), (xy sur yz) et (xz sur yz), avec un ordre de profondeur différent se produire.

Je pense ma condition de comparaison pourrait aller quelque chose comme ça, étant donné P1 = polygon1 et P2 = polygon2

if (P1 == xy_plane) return min(P1.z, P2.z) 
if (P2 == xy_plane) return min(P2.z, P1.z) 
if (P1 == xz_plane) return min(P1.y, P2.y) 
if (P2 == xz_plane) return min(P2.y, P1.y) 

P1 ou P2 doivent se trouver dans l'un des deux premiers avions, donc pour l'énoncé du problème devrait être suffisante, doivent confirmer si cette approche fonctionne

Update2

J'ai eu quelques progrès sur l'idée ci-dessus, et il semble que le tri sur la correspondance du polygone fait quelque chose inte au repos, ça marche en partie, je dirais que ça a l'air facile, mais, bon ... j'espère que vous pensez que c'est le cas et que je peux me dire ce que je dois faire.

Le long de la ligne ci-dessus, tout d'abord contrairement à mon hypothèse, les polygones dans un même plan ne sont pas triviaux, ils peuvent avoir plusieurs configurations différentes montrées ici; parallèle et ne pas partager un autre axe comme dans les deux premiers, ou parallèle et sur le même plan. Cela signifie parfois qu'ils ne se soucient pas des axes sur lesquels ils trient (pour une comparaison par paire), (et parle d'un côté plus profond de cette poursuite).

polygons on the same plane

Mise en place d'une série de déclarations conditionnelles peu importe, quelque chose dans le sens de la suggestion ci-dessus, qui avait un je pense que la saveur de la force brute avec une longue série de « if-else », finalement j'ai trouvé une comparaison polygone-polygone correcte par paire, de sorte que dans cette notion on peut dire certainement si le sujet ou l'autre est le plus proche.

Travaillant sur un seul côté du modèle ici, réussi à produire quelque chose qui semble assez convaincant. Le processus en général se sent proche de l'enfermement, mais en essayant de se débarrasser d'un désalignement final quelque peu provocant, alors que de vieux trivias physiques fixant un côté de l'autre se brisent toujours.

enter image description here

+0

Voulez-vous trier par rapport à la direction de la caméra ou à l'un des trois axes? – MooseBoys

+3

Considérons 3 triangles, où le coin supérieur de chacun est au-dessus de la section large de l'un des autres. Facile à visualiser, mais seulement un tampon de profondeur peut trier celui-là :) Cela dit, il peut y avoir une solution pour votre cas contraint. – usr2564301

+0

Je voudrais par rapport à la caméra, comme dans la vue ci-dessus, j'utilise un point focal A, souvent l'origine, et une caméra mobile, le vecteur C.Je pensais, mais je ne suis pas arrivé à une méthode, que si la caméra est sur les huit octets xyz, les avions auraient une préférence le long de chacun des axes + ive ou -ive, le tri sur l'un de ces donnent souvent résultats raisonnables, mais pas complètement propre, encore – area5one

Répondre

5

Permettez-moi d'ajouter quelques observations:

Les conditions

  • tous les côtés du polygone sont parallèles à un axe et que
  • les polygones ne sont pas SÉCANTES

ne sont pas assez pour assurer l'existence d'un tri global en profondeur des polygones - comme on peut le voir avec cet exemple de trois rectangles:

depths interleaving

également l'ordre de la profondeur relative de deux objets peut dépendre d'autres objets comme on peut le voir dans cet exemple 2D, où l'ordre de profondeur des objets A et B, qui ne sont pas cachés de l'autre, dépend de la position de l'objet C:

enter image description here

va donc pour un tri en profondeur globale des objets ne semble pas être le chemin à parcourir.

0

Résoudre le problème général, où les côtés ne sont généralement pas parallèles aux axes, peut être plus facile.

Déterminez la ligne d'intersection (appelez-la L) des plans contenant les 2 faces. Maintenant, en supposant que les faces ne se croisent pas, chaque face sera entièrement d'un côté de L.

Trouvez maintenant un vecteur V perpendiculaire à L, qui traverse la caméra. La face visible est celle qui est à un angle inférieur à V. Vous pouvez comparer les angles en utilisant des produits croisés et des produits scalaires.

Vous pouvez simplifier cela beaucoup pour le cas parallèle-à-axe (trouver L et V est trivial).

Pour les segments de ligne, l'utilisation d'un plan arbitraire contenant la ligne devrait fonctionner.

Pour les faces coplanaires, peu importe, car l'une n'obscurcira jamais l'autre.

Vous devez cas particulier le cas de la face parallèle.

Cet algorithme est O (N^2) dans le nombre de faces, vous devez faire des comparaisons par paires. Utiliser le tampon de profondeur comme suggéré peut être plus viable si vous avez beaucoup de visages.