2011-04-08 4 views
3

Je travaille sur la création d'un simple moteur de rendu 3D en Java. Je me suis trompé et j'ai trouvé quelques façons différentes de faire de la projection en perspective, mais le seul que j'avais en partie fonctionnait avec des effets d'étirement étranges, plus l'objet était déplacé loin du centre de l'écran, le rendant très irréaliste. Fondamentalement, je veux une méthode (aussi simple ou compliquée soit-elle) qui prend un point 3D à projeter et le point 3D et la rotation (éventuellement?) De la 'caméra' comme arguments, et retourne la position sur l'écran ce point devrait être dessiné à. Je me fiche de la longueur/court/simple/compliqué de cette méthode. Je veux juste que cela génère le même genre de perspective que vous voyez dans un jeu de tir à la première personne en 3D moderne ou tout autre jeu, et je sais que je devrais utiliser la multiplication matricielle pour cela. Je ne veux pas vraiment utiliser OpenGL ou d'autres bibliothèques parce que j'aimerais bien faire cela comme un exercice d'apprentissage et rouler le mien, si c'est possible.Perspective 3D Projection en Java

Toute aide serait appréciée beaucoup :) Merci, encore une fois - James

Mise à jour: montrer ce que je veux dire par les « effets d'étirement », voici quelques captures d'écran d'une démo I » ve mis ensemble. Ici, un cube (40x40x10) centré sur les coordonnées (-20, -20, -5) est dessiné avec la seule méthode de projection que j'ai du tout (code ci-dessous). Les trois écrans montrent la caméra à (0, 0, 50) dans la première capture d'écran puis déplacé dans la dimension X pour montrer l'effet dans les deux autres.

Camera at (0,0,50) Camera moved a bit in the X coord Camera moved even further

Code de projection J'utilise:

public static Point projectPointC(Vector3 point, Vector3 camera) { 
    Vector3 a = point; 
    Vector3 c = camera; 
    Point b = new Point(); 

    b.x = (int) Math.round((a.x * c.z - c.x * a.z)/(c.z - a.z)); 
    b.y = (int) Math.round((a.y * c.z - c.y * a.z)/(c.z - a.z)); 

    return b; 
} 

Répondre

1

Vous ne pouvez vraiment pas faire sans se coincer dans les mathématiques. Il y a beaucoup de ressources sur le web qui expliquent la multiplication de la matrice, les coordonnées homogènes, les projections de perspective, etc. C'est un grand sujet et il ne sert à rien de répéter les calculs requis ici.

Voici un point de départ possible pour votre apprentissage:

http://en.wikipedia.org/wiki/Transformation_matrix

Il est presque impossible de dire ce qui ne va pas avec votre approche actuelle - mais une possibilité en fonction de votre explication, il semble étrange que l'objet se déplace loin du centre, c'est que votre champ de vision est trop large. Il en résulte une sorte de distorsion des lentilles fish-eye où une trop grande partie de la vision du monde est écrasée sur le bord de l'écran.

+0

Merci, et je sais que je devrais utiliser toutes sortes de maths complexes. Et je pense que vous avez raison de dire que les problèmes d'étirement sont probablement causés par un problème de champ de vision. J'ai essayé une méthode différente (et beaucoup plus compliquée) basée sur l'article wikipedia pour 3D Projective Projection, qui impliquait la multiplication matricielle et la fonction trig (sin et cos). J'ai également mis à jour le post avec quelques captures d'écran et du code si cela vous donne des idées. Merci encore. – jt78

Questions connexes