1

-

2

Ca vaux ce que ca vaux, mais regarder les astuces utilise dans les raycasters pour enlever cet effet de fisheye

genre : http://gamedev.stackexchange.com/questions/45295/raycasting-fisheye-effect-question

Mais le plus simple reste encore de travailler les textures pour qu'elle la distortion en compte

(ou alors je n'ai pas compris ta question grin)
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

3

(je pense que t'as pas compris : il ne veut pas éviter le fisheye, il veut générer une image en "fisheye" (360°) et avoir une routine pour la convertir en affichage 2D selon un angle défini. (c'était le cas dans Riven (la suite de myst) il me semble))
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

4

Orion_, je suppose que c'est ce que tu as déjà essayé de faire, mais tu peux calculer les coordonnées des pixels de l'image finale dans un repère cartésien à 3 dimensions (l'image finale est un rectangle sur un plan à une certaine distance de la caméra qui est un point, l'origine du repère) et les convertir en coordonnées sphériques (longitude, latitude). Cette conversion te donne à un facteur près les coordonnées des pixels de la texture.
avatar

5

Hmm je crois que c'est un poil plus compliqué que ça (ou alors j'ai rien compris à ce que tu as dit), mais c'est pas très compliqué quand même...
J'avais commencé à écrire un post mardi mais comme je suis complètement ko en ce moment j'ai pas trouvé le temps de le terminer cheeky
(J'essayerai de le faire quand même tongue)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

6

GoldenCrystal (./5) :
Hmm je crois que c'est un poil plus compliqué que ça
Bah j'ai pas voulu alourdir mon post avec toutes les explications (comme la rotation de l'image finale dans le repère cartésien suivant la direction observée dans le jeu ou le choix de la distance focale). On verra ces étapes si ce sont celles-ci qui posent problème à Orion_ smile
avatar

7

-

8

Cet article a l'air pertinent : http://www.dr-lex.be/info-stuff/qtvrmath.html
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

9

ta premiere image c'est un mapping spherique.
la 2eme un mapping cylindrique.

mettons que tu considere que la premiere, parceque c'est la seule qui te permet de regarder partout, comme une skybox:

si j'ai bien suivi, ton pbl c'est de convertir les coordonnees de pixels de ton affichage en coordonnees de texels pour faire une lookup dans ta texture?

tu peux faire en deux etapes:
A- coord pixel ecran -> coords 3D d'un vecteur (comme si tu codais un raytracer/raycaster)
B- coord vecteur 3D -> coord texel 2D


pour A:

classique, t'as les 3 vecteurs 3d de ta camera: side, up, et forward, et tu fais un truc du genre:

int2 pixelCoords; // coordonnees dans le range [0,screenSize[

float2 pixelUV_01 = (pixelCoords + 0.5) / screenSize;
float2 pixelUV_m1p1 = pixelUV_01 * 2 - 1;
float3 view = forward * invZoomFactor + side * pixelUV_m1p1.x + up * pixelUV_m1p1.y;


si tu as une matrice 3x3 pour ta camera tu peux directement faire:

int2 pixelCoords; // coordonnees dans le range [0,screenSize[

float2 pixelUV_01 = (pixelCoords + 0.5) / screenSize;
float3 pixelUV_m1p1 = float3(pixelUV_01 * 2 - 1, invZoomFactor);
float3 view = viewMatrix.transform(pixelUV_m1p1);




pour B:
les coordonnees 'XY' du vecteur view vont mapper sur la coordonnee 'U' de ta texture.
la coordonnee 'Y' du vecteur va mapper sur la coordonnee 'V' de ta texture.
suivant comment est fait ta projection, 'Y->V' peut etre un mapping direct, mais c'est plus probable que ce soit spherique aussi.
bon, donc, en gros:

texU = atan2f(view.x, view.z) / (2*pi); // extrait l'angle de vue horizontal, et le remappe dans [0,1]
texV = acosf(view.y) / pi; // extrait l'angle de vue vertical, et le remappe dans [0,1]


tes tecoords {texU, texV} sont entre 0 et 1 et pretes a faire une lookup.
apres, si tu fais ca par pixel, et que tu veux pas utiliser OpenGL pour pouvoir le "porter sur des plateformes retros", le cout par pixel risque de piquer un peu avec toute cette trig cheeky
donc je dirais que c'est ptet pas le mapping le plus judicieux grin

tu peux eviter l'acosf en changeant la projection pour que Y->V soit un mapping lineaire, et t'aurais:

texU = atan2f(view.x, view.z) / (2*pi); // extrait l'angle de vue horizontal, et le remappe dans [0,1]
texV = view.y * 0.5 + 0.5;


mais ca reste quand meme hardcore.
ya des chances qu'une cubemap soit qd meme plus efficace, mais bon je connais pas ton HW...

pour la lookup de la cubemap, l'idee est toute simple, t'as ton view vector, et tu dois trouver l'axe le plus grand:

int largestAxis = 0;
if (abs(view.y) > abs(view.x))
    largestAxis = (abs(view.y) > abs(view.z)) ? 1 : 2;
else if (abs(view.z) > abs(view.x))
    largestAxis = 3;

int cubeFaceId = 2*largestAxis + (view.axis(largestAxis) >= 0);


cubeFaceId aura les valeurs suivantes:
0 = face X negative
1 = face X positive
2 = face Y negative
3 = face Y positive
4 = face Z negative
5 = face Z positive

ensuite, tu lookup la face en question avec les UV suivants:

float2 uv = float2(view.axis((largestAxis + 1)%3), view.axis((largestAxis + 2)%3)) / view.axis(largestAxis);


ca va prendre les deux axes autres que l'axe principal de la vue, et ca va les renormaliser en les projetant au bout de la pyramide qui va du centre de la cubemap a la face.
un side-effect de cette reprojection est que ton vecteur 'view' n'a pas besoin d'etre normalise, donc c'est plutot cool smile
avatar
HURRRR !

10

-