6
votes

Transition en douceur de la projection orthographique à la projection en perspective?

Je développe un jeu composé de 2 étapes, l'une d'entre elles a une projection orthographique et l'autre étape a une projection de perspective.

Actuellement, lorsque nous allons entre les modes, nous nous sommes faibles au noir, puis revenez en mode caméra.

Comment irai-je sur la transition sans heurts entre les deux?


2 commentaires

Je devine juste, mais si p1 (x) est les coordonnées dans une projection et p2 (x) dans l'autre, vous pouvez obtenir une transition en douceur F P1 (x) + (1-F) P2 (x) en modifiant sans heurts F de 0 à 1


Cette question est intéressante et claire, mais comme écrit, cela vous permet de dire que vous demandez à quelqu'un de faire le travail pour vous. Vous devez ajouter plus de détails, comme la matrice pour l'ortho et la matrice de la transformation en perspective, etc. Comme l'autre commentaire mentionne, si votre projection d'ortho est une matrice 4x4 et la matrice de perspective est également, vous pouvez essayer une combinaison linéaire de les deux.


3 Réponses :


5
votes

Il y a probablement une poignée de façons d'accomplir cela, les deux que j'ai trouvés qui semblaient être comme ils travailleraient les meilleurs étaient:

  1. lier tous les éléments matriciels d'une matrice à l'autre. Apparemment, cela fonctionne assez bien toutes les choses considérées. Je ne crois pas que cette transition apparaîtra linéaire, cependant. Vous pouvez essayer de lui donner une fonction d'assouplissement au lieu de faire l'interpolation linéairement

  2. a Dolly Zoom sur la matrice de perspective allant / à partir d'un champ de vision près de 0. Vous alliez appartenir à la matrice orthographique à la matrice de la perspective de près de 0 et lerp la FOV sur votre cible, et probablement de peaufiner les avions proches / éloignés que vous allez. En sens inverse, vous seriez lerp à 0 puis sur la matrice orthographique. L'idée derrière cet étant que les choses semblent plus flattées avec une FOV inférieure et qu'un fov de 0 est essentiellement une projection orthographique. Ceci est plus complexe mais peut également être ajusté beaucoup plus.


2 commentaires

Grand merci! J'avais pensé au zoom de Dolly, mais je n'avais pas pensé à "reproduire" la vue orthographique dans une vue en perspective avec 0 champ de vision. Tellement théoriquement, tout ce que je devais faire est de modifier la position de la caméra avec un champ de vision de 0 pour recréer la scène orthographique, puis interpolez-vous le champ de la vue et la position de la caméra?


Théoriquement, oui. Beaucoup de résultats ont abouti à des trucs spécifiques à l'unité, mais la théorie / les mathématiques sont les mêmes - réponses.unity3d.com/questions/58306/...



1
votes

J'ai réussi à faire cela sans l'utilisation explicite des matrices. J'ai utilisé Java afin que la syntaxe soit différente mais comparable. Une des choses que j'ai utilisées était cette fonction mix (). Il renvoie value1 lorsque facteur est 1 et value2 lorsque facteur est 0 et a une transition linéaire pour chaque valeur Entre. XXX

Lorsque j'appelle cette fonction, j'utilise la valeur1 pour la perspective et la valeur2 pour orthographique, comme: Mix (longueur focale / voxel.z, Orthozoom, facteur)

Lors de la détermination de votre longueur focale et de votre facteur de zoom orthographique, il est utile de savoir que quelque chose à distance FOCALLLENDENDREND / ORTHOZOOM

J'espère que cela aide. Vous pouvez télécharger mon programme pour voir comment il regarde https://github.com/npetrangelo/3rd -Dimension / libération .


0 commentaires

1
votes

Si vous avez accès à un pipeline programmable (A.K.A. Shaders), vous pouvez effectuer la transition dans le Shader Vertex. J'ai constaté que cela fonctionne très bien et n'introduit pas des artefacts. Voici un extrait de code GLSL: xxx pré>

dans le code, upersptoortho code> est un Vec2 code> (par exemple, un flotteur2 code> ) qui contient une valeur dans la plage [0..1]. Lorsque vous êtes réglé sur 0, vos coordonnées utiliseront la projection de la perspective (en supposant que votre matrice de projection est une perspective). Lorsque vous êtes défini sur 1, vos coordonnées se comporteront comme si projetées par une matrice de projection orthographique. Vous pouvez le faire séparément pour les axes X et Y. p>

'Unarclipplanplane' est la distance à proximité de l'avion, qui est la valeur que vous avez utilisée pour créer la matrice de projection de la perspective. P>

Lorsque vous convertissez ceci en HLSL, vous devrez peut-être utiliser Voir.Z code> au lieu de -View.z code>, mais je pourrais avoir tort. p>

J'espère que vous trouverez cela utile. p>

EDIT: Au lieu de passer dans la distance de l'avion à proximité, vous pouvez également l'extraire de la matrice de projection. Pour OpenGL, voici comment: p> xxx pré>

EDIT 2: Vous pouvez optimiser le code en faisant la mise à l'échelle sur X et Y en même temps: P>

uniform float uInvNearClipPlane; // = 1.0 / zNear


0 commentaires