2010-03-27 9 views
1

Je code écrit qui génère un rayon de l ' « œil » de la caméra au plan de visualisation à une certaine distance de l'œil de la caméra:Ray Generation Incohérence

R3Ray ConstructRayThroughPixel(...) 
{ 
    R3Point p; 

    double increments_x = (lr.X() - ul.X())/(double)width; 
    double increments_y = (ul.Y() - lr.Y())/(double)height; 
    p.SetX(ul.X() + ((double)i_pos+0.5)*increments_x); 
    p.SetY(lr.Y() + ((double)j_pos+0.5)*increments_y); 
    p.SetZ(lr.Z()); 

    R3Vector v = p-camera_pos; 

    R3Ray new_ray(camera_pos,v); 
    return new_ray; 
} 

ul est le coin supérieur gauche de l'affichage plan et lr est le coin inférieur gauche du plan de visualisation. Ils sont définis comme suit:

R3Point org = scene->camera.eye + scene->camera.towards * radius; 
    R3Vector dx = scene->camera.right * radius * tan(scene->camera.xfov); 
    R3Vector dy = scene->camera.up * radius * tan(scene->camera.yfov); 
    R3Point lr = org + dx - dy; 
    R3Point ul = org - dx + dy; 

Ici, org est le centre du plan d'observation avec radius étant la distance entre le plan d'observation et l'œil de la caméra, dx et dy sont les déplacements dans les directions x et y de le centre du plan de visualisation. La fonction ConstructRayThroughPixel(...) fonctionne parfaitement pour une caméra dont l'œil est à (0,0,0). Cependant, lorsque la caméra est dans une position différente, tous les rayons nécessaires ne sont pas produits pour l'image.

Des suggestions ce qui pourrait ne pas aller? Peut-être que quelque chose ne va pas avec mes équations?

Merci pour l'aide.

+0

Je ne pense pas que vous voulez la balise de graphiques vectoriels. Les graphiques vectoriels habituels se réfèrent à un format de fichier qui stocke des données sous une forme qui signifie "dessiner une ligne de (x1, y1) à (x2, y2) avec l'épaisseur t et la couleur c". alors que vous allez stocker des données pixel par pixel, non? – dmckee

+0

Eh bien, J'utilise un format de fichier de scène pour afficher mes graphiques qui stocke des données sous une forme similaire que vous avez décrite, mais ma question n'a rien à voir avec cela. J'ai mal compris ce que "vector-graphics signifie" -.- – Myx

Répondre

0

La raison pour laquelle mon code ne fonctionnait pas était parce que je traitais les valeurs x, y, z séparément. Ceci est faux, puisque la caméra peut être orientée dans n'importe quelle direction et donc si elle était orientée vers le bas de l'axe des x, les coordonnées x seraient les mêmes, produisant increments de 0 (ce qui est incorrect). Au lieu de cela, ce qui devrait être fait est une interpolation des points d'angle (où les points ont des coordonnées x, y, z). S'il vous plaît voir la réponse dans le poste connexe: 3D coordinate of 2D point given camera and view plane

0

Voici une argutie qui peut avoir rien à voir avec vous problème:

Lorsque vous faites ceci:

R3Vector dx = scene->camera.right * radius * tan(scene->camera.xfov); 
R3Vector dy = scene->camera.up * radius * tan(scene->camera.yfov); 

Je suppose que les vecteurs sont normalisés right et up, non? Dans ce cas, vous voulez sin pas tan. Bien sûr, si les angles fov sont petits, cela ne fera pas beaucoup de différence.

+0

J'ai fait le changement et cela n'a pas fait beaucoup de différence. Ce qui se passe, c'est que les rayons sont émis mais pas toute la gamme des rayons. Donc, je suppose que le mappage n'est pas fait de la bonne façon parce que plusieurs rayons sont lancés sur le même pixel ou que la valeur résultante du pixel "cast" est très proche de celle d'à côté, donc toute la gamme de les pixels ne sont pas entièrement reconstruits (ie il n'y a pas exactement un rayon pour le pixel à la position du plan de visualisation (i, j)) – Myx

+0

Cela * sonne * comme le genre de problème que vous obtenez en passant d'un nombre entier à un nombre à virgule flottante, mais je ne vois aucun signe de cela dans le code que vous avez posté. Avez-vous essayé de passer par le code pour un cas simple où vous obtenez l'erreur (dans le débogueur ou à la main). Parfois, c'est le moyen le plus facile d'y aller, fastidieux ou pas. – dmckee

+0

J'espérais que ce serait mon dernier recours.Du fait qu'il fonctionne sur des scènes dont la caméra est à (0,0,0) mais ne fonctionne pas pour les scènes dont la caméra est à une autre position, je pensais qu'il y avait une erreur dans ma logique lors du calcul du X et Y coordonnées du point généré sur le plan de visualisation. – Myx