J'écris mon propre rasterizer logiciel en Java, et je suis tombé sur quelques problèmes avec elle ... jetez un oeil à un exemple d'image, s'il vous plaît:Projection en perspective - comment projeter des points derrière une caméra?
Cet exemple dessiner tout simple grille carrée dans un avion. Tout fonctionne bien jusqu'à ce que je bouge la caméra assez près pour que certains points puissent bouger derrière. Après cela, ils ne sont plus projetés correctement, comme vous pouvez le voir (lignes verticales - les points qui devraient être derrière la caméra sont projetés en haut de l'écran). Mes matrices de transformation et vecteurs sont les mêmes que ceux utilisés par DirectX (PerspectiveFovLH pour la projection, LookAtLH pour la caméra).
J'utilise la méthode suivante de transformation pour projeter le point 3D:
- vecteur 3D à transformer est créé.
- Le vecteur est multiplié par la matrice ViewProjection.
Après cela, le point est transformé à l'écran en utilisant la méthode suivante:
// 'vector' is input vector in projection space // projection to screen double vX = vector.x/vector.z; double vY = vector.y/vector.z; //translate //surfaceW is width and surfaceH is height of the rendering window. vX = ((vX + 1.0f)/2.0f) * surfaceW; vY = ((-vY + 1.0f)/2.0f) * surfaceH; return new Vector3(vX, vY, vector.z);
Comme je l'ai déjà dit, il fonctionne bien jusqu'à ce point se déplace derrière la caméra. Le fait est que je peux comprendre quand le point est derrière la caméra (en testant sa valeur Z après la transformation finale), mais comme je dessine des lignes et d'autres objets basés sur des lignes, je ne peux pas ignorer ce point.
Puis j'ai essayé de définir mon pipeline de transformation selon L'article Direct3D Transformation Pipeline sur MSDN.
Malheureusement, je n'ai pas eu de chance avec ça (même résultat), donc toute aide serait très appréciée, puisque je suis un peu coincé sur celui-ci.
Merci.
Cordialement, Alex
Configurez-vous correctement le plan de découpe avant de votre caméra? Et puis en prendre en compte lors du rendu? – ChrisF
Mon plan zNear est défini sur 1 et le plan zFar sur 1000 unités. J'ai essayé de changer les valeurs, mais le problème persiste. Aucune suggestion? – Alex
Ça fait un moment que j'ai fait ce genre de chose, mais vous devez effectuer une intersection avec le plan de coupure avant * avant * de projeter la ligne. – ChrisF