Bien que le contexte de cette question soit de faire un jeu 2d/3d, le problème que j'ai se résume à quelques maths. Bien que ce soit un monde 2.5D, faisons semblant que c'est juste 2d pour cette question.J'ai ma conversion 2D/3D fonctionnant parfaitement, comment faire de la perspective
// xa: x-accent, the x coordinate of the projection
// mapP: a coordinate on a map which need to be projected
// _Dist_ values are constants for the projection, choosing them correctly will result in i.e. an isometric projection
xa = mapP.x * xDistX + mapP.y * xDistY;
ya = mapP.x * yDistX + mapP.y * yDistY;
xDistX et yDistX déterminer l'angle de l'axe x, et xDistY et yDistY déterminent l'angle de l'axe y sur la saillie (et aussi la taille de la grille, mais laisse supposer c'est la 1- pixel pour la simplicité).
x-axis-angle = atan(yDistX/xDistX)
y-axis-angle = atan(yDistY/yDistY)
un système "normal" de coordonnées de ce type
--------------- x
|
|
|
|
|
y
has values like this:
xDistX = 1;
yDistX = 0;
xDistY = 0;
YDistY = 1;
Ainsi, chaque étape dans la direction x résultera sur la projection de 1 pixel vers la droite fin 0 pixels vers le bas. Chaque pas dans la direction y de la projection se traduira par 0 pas vers la droite et 1 pixel vers le bas. Lorsque vous choisissez xDistX, yDistX, xDistY, yDistY corrects, vous pouvez projeter n'importe quel système trimétrique ou dimétrique (c'est pourquoi je l'ai choisi).
Jusqu'ici tout va bien, quand ceci est dessiné, tout se passe bien. Si «mon système» et mon état d'esprit sont clairs, passons à la perspective. Je voulais ajouter une perspective à cette grille donc j'ai ajouté quelques extras comme ceci:
camera = new MapPoint(60, 60);
dx = mapP.x - camera.x; // delta x
dy = mapP.y - camera.y; // delta y
dist = Math.sqrt(dx * dx + dy * dy); // dist is the distance to the camera, Pythagoras etc.. all objects must be in front of the camera
fac = 1 - dist/100; // this formula determines the amount of perspective
xa = fac * (mapP.x * xDistX + mapP.y * xDistY) ;
ya = fac * (mapP.x * yDistX + mapP.y * yDistY);
Maintenant, le vrai dur ... si vous avez un (xa, ya) point sur la projection et que vous voulez calculer le point d'origine (x, y). Pour le premier cas (sans perspective) j'ai trouvé la fonction inverse, mais comment cela peut-il être fait pour la formule avec la perspective. Que les compétences en mathématiques ne soient pas tout à fait à la hauteur du défi pour résoudre ce problème.
(Je me souviens vaguement d'une longue période Mathematica pourrait y créer la fonction inverse pour certains cas particuliers ... pourrait-il résoudre ce problème? Quelqu'un pourrait-il essayer peut-être?)
Qu'est-ce que 'fac'? Quelle est la "quantité de perspective"? Qu'est-ce que 100 a à voir avec quoi que ce soit? Est-ce que 'fac' est censé implémenter le rétrécissement apparent des objets dû à la perspective. Cela fait que l'objet à la distance 100 a la taille zéro, donc cela n'a pas de sens? – sigfpe
fac signifie facteur, comme dans un facteur de perspective qui peut être ajusté pour la perspective lourde ou peu. Dessiner la grille en utilisant cette fonction a donné quelque chose qui semblait assez bien. Les objets doivent toujours être placés sur "la grille" devant la caméra. Cela signifie qu'un objet ne peut jamais avoir une distance supérieure à sqrt (60^2 + 60^2) 85. La raison pour laquelle je choisis 100 est parce que c'est plus grand que 85, et m'a donné le look dont j'avais besoin. Ma fonction n'est pas correcte, mais le résultat visuel a l'air bien, même si la "perspective" est un peu exagérée ... http://img188.imageshack.us/img188/5154/gridpu.png – jdv145