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.
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;
}
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