2009-11-09 4 views
0

J'écris un ray tracer (en utilisant des coordonnées gauches, si cela fait une différence). C'est pour apprendre les principes, donc je n'utilise pas OpenGL ou des fonctionnalités complexes comme la profondeur de champ (pour le moment). Mon appareil photo peut avoir une position et une orientation arbitraires; Je les indique au moyen de trois vecteurs, location, look_at, et sky, qui se comportent comme equivalent POV-Ray vectors. Son "film" a également un width et height. (La longueur focal est impliquée par la distance de position à look_at.)Comment projeter des rayons avec une caméra arbitraire?

Mon problème est que je ne sais pas comment lancer les rayons. J'ai deux quantités, vx et vy, qui indiquent où le rayon devrait finir. Ils varient tous les deux de -1 à 1. S'ils sont tous deux -1, je lance le rayon de la position de la caméra dans le coin supérieur gauche du "film"; si elles sont toutes les deux 1, en bas à droite; s'ils sont tous deux à 0, le centre; et le reste est apparent. Je ne suis pas assez familier avec l'arithmétique vectorielle pour dériver une équation pour le rayon. J'apprécierais une explication de la façon de le faire.

Répondre

1

Vous avez déjà décrit ce qui doit déjà être fait. Votre champ de vision est déterminé par la distance entre votre caméra et votre "film" que vous allez traverser. Plus la caméra est éloignée du film, plus votre champ de vision est étroit. Imaginez le film sous la forme d'une image bitmap vers laquelle l'appareil photo pointe vers. Disons que nous positionnons la caméra à une unité de l'image bitmap. Nous devons ensuite lancer un rayon sur chacun des pixels du bitmap.

Le vecteur est extrêmement simple. Si nous mettons l'emplacement de la caméra à (0,0,0), et le film bitmap juste en face de celui-ci avec son centre à (0,0,1), alors le rayon en bas à droite est - tada - (1, 1,1), et celui en bas à gauche est (-1,1,1).

Cela signifie que la différence entre le bas à droite et le bas à gauche est (2,0,0).

On suppose que votre résolution bitmap horizontale doit être de 1000, vous pouvez parcourir les pixels de la ligne de fond comme suit:

width = 1000; 
cameraToBottomLeft = (-1,1,1); 
bottomLeftToBottomRight = (2,0,0); 

for (x = 0; x < width; x++) { 
    ray = cameraToBottomLeft + (x/width) * bottomLeftToBottomRight; 
    ... 
} 

Si cela est clair, vous ajoutez juste une boucle extérieure équivalente pour vos lignes, et vous avez tous les rayons dont vous aurez besoin.

Vous pouvez ensuite ajouter des variables appropriées pour la distance de la caméra au film et la résolution horizontale et verticale. Quand cela est fait, vous pouvez commencer à changer votre vecteur look et votre vecteur up avec des transformations matricielles.

Si vous voulez envelopper votre tête autour de l'infographie, un introductory textbook pourrait être d'une grande aide. J'ai utilisé this one au collège, et je pense que je l'ai aimé.

+0

Merci, je l'ai eu à travailler maintenant. – Remy

Questions connexes