2009-07-12 7 views
4

Depuis que j'ai 13 ans et que je joue avec AMOS 3D, je voulais apprendre à coder les graphismes 3D. Maintenant, 10 ans plus tard, je pense finalement avoir accumulé assez de maths pour tenter le coup.Problème de rotation du cube en perspective 3D

J'ai suivi divers tutoriels, et défini screenX (et screenY, ce qui revient) comme

screenX = (pointX * cameraX)/distance 

(plus offsets et mise à l'échelle.)

Mon problème est avec ce que la distance variable fait référence à. J'ai vu la distance étant définie comme la différence de z entre la caméra et le point. Cependant, cela ne peut pas être complètement correct, puisque x et y ont le même effet que z sur la distance réelle de la caméra au point. J'ai mis en œuvre la distance comme la distance réelle, mais le résultat donne une perspective quelque peu faussée, comme si elle avait une perspective «trop».

Ma mise en œuvre "distance réelle" était le long des lignes de:

distance = new Vector(pointX, pointY, cameraZ - pointZ).magnitude() 

Jouer avec le code, j'ai ajouté une variable supplémentaire à mon équation, une perspectiveCoefficient comme suit:

distance = new Vector(pointX * perspectiveCoefficient, 
    pointY * perspectiveCoefficient, cameraZ - pointZ).magnitude() 

Pour une raison quelconque, c'est au-delà de moi, j'ai tendance à obtenir le meilleur résultat en définissant la perspectiveCoefficient à 1/sqrt (2).

Mon cube de test 3D est au http://vega.soi.city.ac.uk/~abdv866/3dcubetest/3dtest.svg. (Testé dans Safari et FF.) Il vous invite à une perspectiveCoefficient, où 0 donne une perspective sans tenir compte de la distance x/y, et 1 vous donne une perspective où la distance x, y et z est également considérée. Il est par défaut de 1/sqrt (2). Le cube peut être tourné autour de x et y en utilisant les touches fléchées. (Pour toute personne intéressée, le code correspondant est dans update() dans le fichier View.js.)

Reconnaissant pour toute idée à ce sujet.

+3

+1 pour une question bien écrite, et un fichier 3D SVG interactif très cool. –

Répondre

5

Habituellement, la projection est effectuée sur le plan Z = 0 à partir d'une position de l'œil derrière ce plan. Le point projeté est l'intersection de la ligne (Pt, Eye) avec le plan Z = 0. A la fin, vous obtenez quelque chose comme:

screenX = scaling * pointX/(1 + pointZ/eyeDist) 
screenY = scaling * pointY/(1 + pointZ/eyeDist) 

Je suppose ici que l'appareil est à (0,0,0) et les yeux (0,0, -eyeDist). Si eyeDist devient infini, vous obtenez une projection parallèle.

Questions connexes