2009-05-06 7 views
1

J'ai une simple application de modélisation solide dans laquelle je veux implémenter plusieurs «modes de navigation», des moyens pour l'utilisateur de naviguer dans la caméra à travers l'espace 3D. L'un d'entre eux est l'omniprésence du «glisser/déplacer/faire pivoter» utilisé dans SketchUp, Blender, etc .; Je veux également mettre en œuvre quelque chose qui est plus pertinent pour mon application spécifique. Plus précisément, je veux implémenter un mode où la caméra flotte sur un «anneau» au-dessus de l'objet en cours de modélisation (un bâtiment), et regarde toujours le centre du modèle; De cette façon, un utilisateur peut facilement «entourer» autour de l'objet, une opération courante dans mon application. Donc, ce que je veux faire est de rendre le bâtiment à mon avis, et afficher un tore en haut à droite de la vue, avec une petite sphère sur le tore pour représenter l'emplacement de la caméra. Il y aurait une flèche vers le nord dans le tore, et l'utilisateur ferait glisser la caméra autour de l'objet modèle en faisant glisser la sphère; déplacer la sphère repositionnerait la caméra et redessinerait la scène.Combiner des rendus OpenGL en une seule vue

Il semble que ce que je devrais faire est la suivante: rendre la 'vue principale', c'est-à-dire le bâtiment; Ensuite, restituez le tore et la sphère (avec différents réglages de perspective et d'éclairage) dans un tampon hors écran, et faites-le passer de là à ma vue principale.

Ensuite, cependant, j'arrive à l'essai de succès. Je veux détecter si l'utilisateur clique sur la sphère, ou le tore; d'après ce que je comprends de la sélection OpenGL (il semble que ce soit un sujet difficile: /), toutes les méthodes de sélection ne s'appliquent qu'à la sélection dans une 'scène'. En dehors de cela, je veux toujours détecter les opérations de préparation «normales» dans le modèle de construction, évidemment.

Alors, mes questions:

  • Comment puis-je rendre à un tampon et offscreen blit dans un autre contexte OpenGL (avec alpha blending & comme pour le transparence centre du torus)?
  • Comment effectuer un test de réussite dans le scénario décrit?

Répondre

2

Je ne pense pas que vous ayez besoin de faire un rendu hors écran pour cela. Vous devriez être en mesure de juste re-régler la caméra et viewport et de rendre la superposition après la scène principale. Vous avez peut-être des problèmes avec l'ordre Z et/ou la mise en mémoire tampon, mais peut-être que la "sous-scène" est assez simple pour que cela ne compte pas, ou vous pouvez bien sûr effacer le tampon Z avant de le rendre.

0

Je suis d'accord avec @unwind; vous n'avez pas besoin d'un tampon hors écran. Si vous le souhaitez, recherchez "render-to-texture".

En ce qui concerne les tests de hit, The OpenGL FAQ comporte une entrée. Il décrit plusieurs solutions: en utilisant le mode de rendu GL_SELECTION, en utilisant gluUnproject() pour obtenir un rayon de collision 3D et une solution 2D simple en utilisant des couleurs uniques.

1

En ce qui concerne le dessin du tore/sphère, créez une classe distincte pour cela et implémentez une méthode de "draw". Demandez à la classe de localiser à la fois la sphère et le tore et dessinez() ces choses à l'écran. Puis appelez myRing.draw() dans votre méthode de dessin principale et vous aurez une sphère et un tore! Si vous voulez que vous ayez un cercle/anneau rendu en 2D (ce qui pourrait être plus facile) dans le coin supérieur droit de la fenêtre, alors le même genre d'idée s'applique comme dans votre hitbox (sauf que sans calcul de projection ennuyeux!)

Enfin, je envisagerais d'utiliser une touche de fonction en combinaison avec des dragons de souris pour mettre en œuvre la fonctionnalité que vous voulez ...l'utilisateur maintient "shift", puis fait glisser la souris sur l'écran. Ces événements de souris sont interceptés et le x-delta est utilisé pour calculer l'angle de rotation. L'emplacement de la caméra est mis à jour lorsque cela se produit et vous obtenez un mouvement de glissement en douceur :)

+0

Merci, pour l'exhaustivité pour les futurs lecteurs, voici le lien vers le poste que vous avez mentionné: http://stackoverflow.com/questions/829786/ways -to-implement-manipulation-handles-en-3d-view/830909 # 830909. Je pense que c'est assez utile de répéter ici, même si mon idée pour l'instant est de rendre un tore 3d :) – Roel

Questions connexes