2010-11-04 4 views
1

Est-il possible de plier ou déformer l'espace OpenGL par une manipulation non standard des matrices ModelView ou Projection? Par exemple, la commande glScale (scaleFactor, scaleFactor, noScaleFactor) redimensionnerait tous les éléments d'une scène de manière uniforme le long des axes X et Y. Par exemple, la commande glScale (scaleFactor, scaleFactor, noScaleFactor) redimensionnerait tous les éléments d'une scène de manière uniforme. Mais si l'on pouvait déformer l'espace OpenGL d'une manière non uniforme, cela augmenterait considérablement le potentiel d'effets différents. En particulier, l'effet que je recherche est un effet de zoom semblable à un bocal, par lequel les éléments seraient grossis de façon linéaire ou non linéaire par rapport à leur proximité avec l'utilisateur (qui est dans mon cas représenté par l'axe Z).Possibilité de plier ou déformer l'espace OpenGL à travers les matrices ModelView ou Projection?

Ainsi, la mise à l'échelle de la commande glScale ci-dessus serait subordonnée à l'emplacement de chaque élément le long de l'axe Z:

glScale (function1 (la distance Z), function2 (distance Z), noScaleFactor)

Répondre

4

modèle-vue & la projection sont des matrices. Vous ne pouvez donc avoir que des transformations linéaires. Vous pouvez essayer vos effets en utilisant un vertex shader, mais vous aurez besoin d'un maillage relativement dense pour que votre transformation soit belle. Le shader modifiera chaque position de sommet, mais le triangle formé de 3 sommets ne sera toujours pas modifié.

Voici un exemple de Fisheye Lens Vertex Shader.

+0

Comment est-ce difficile de faire quelque chose comme ça avec opengl? https://youtu.be/WeOBXmLeJWo?t=43s Est-il même possible de créer un effet [wormhole] (https://en.wikipedia.org/wiki/Wormhole) avec vertex shader? – inf3rno

+0

@ inf3rno Cette question et réponse sont de 2010. S'il vous plaît créer votre propre question si vous n'êtes pas directement ajouter quelque chose à cette discussion. – daveydave400

0

Cela fait un moment que je joue avec GL ouvert, mais ma première réaction à ce sujet serait que vous devriez jeter un oeil à l'aide de shaders openGL pour résoudre ce problème. jetez un oeil à ce poste similaire: link text

0

Si vous activez la perspective (par exemple, par l'intermédiaire gluPerspective ou glFrustum) vous obtiendrez mise à l'échelle linéaire en fonction de la distance de la caméra virtuelle - qui sera le long de l'axe z par défaut. En fonction des distances que vous avez définies pour la position de la caméra, le plan proche et le plan lointain, vous pouvez obtenir une perspective exagérée similaire à celle d'un objectif extrêmement grand angle, mais ce sera toujours un objectif parfaitement rectiligne. Par exemple, les lignes dans un rectangle resteront toujours droites, sans la courbure que vous obtenez avec un objectif fisheye. En fin de compte, cependant, tout ce qui est fait avec les matrices sont des transformations linéaires, donc vous ne serez pas déformé ou plié par elles. Si vous voulez la distorsion en barillet d'un objectif fisheye, vous devrez le faire différemment, probablement dans un shader.

0

OpenGL n'a pas de notion d'espace. Vous ne pouvez pas dire "je voudrais que tout entre [0, 0, 0] et [10, 10, 0] soit bleu" ou quelque chose comme ça. La mise à l'échelle sélective devrait se faire via votre programme, en transformant vos verts comme requis avant qu'ils ne touchent le tuyau GL. (C'est-à-dire, obtenir la distance, déplacer le vert le long de l'axe que vous voulez, puis pousser le long de la ligne). Cela signifiera beaucoup plus de travail, mais si je comprends l'effet que vous voulez obtenir, vous ne pouvez pas le faire avec des matrices.

Questions connexes