2016-04-20 2 views
0

Je travaille sur la prise d'une image en 3D par un échantillon Nvidia Optix. J'ai modifié Optix SDK progressivePhotonMap pour atteindre mon objectif. J'ai la même position de caméra, la même direction de caméra et le même champ de vision (FOV) dans mes codes progressovePhotonMap et OpenGL. Cependant, la vue de la caméra est très différente l'une de l'autre, comme ci-dessous.Pourquoi l'affichage de la caméra dans optix est différent de OpenGL?

image de sortie:

enter image description here

sur la gauche est une image de sortie de progressivePhotonMap, l'autre côté est sortie OpenGL. Vous pouvez voir le point de puissance à gauche (indiquer par l'intersection de deux lignes rouges) ne sont pas localiser sur la même position dans deux images.

Je sais que Optix est basé sur OpenGL, donc je suis très confus pourquoi ces deux images (vue caméra) ne sont pas les mêmes dans le même paramètre de caméra.

Voici ma pensée de la raison:

1.Maybe le problème est proche et paramètre loin, en raison de l'affichage des cadres dans GlutDisplay.cpp, le gluPerspective() sont inutiles. Je ne peux pas donner le paramètre near et far. (Même en ppm.cpp) Alors, comment et où puis-je ajouter ces deux paramètres?

2.Maybe plan de projection optix n'est pas à proximité du plan? En OpenGL, on peut voir le plan de projection proche du plan, mais pas en optix?

3.Peut-être que la présentation du modèle 3D dans optix est juste différente d'OpenGL ??? (J'ai trouvé que ces deux images ont une distorsion différente les unes des autres) Donc je ne peux pas éviter cette situation?

J'ai retracé tout le projet et je n'ai rien trouvé d'utile, quelqu'un peut-il m'aider ou donner une idée ou un conseil sur la raison de cette situation? J'apprécierai très bien toute réponse. Je vous remercie!

Il y a un code source court, j'espère que ce serait utile.

OpenGL:

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
gluPerspective(FOV,(GLdouble)windWidth/(GLdouble)windHeight , NEAR, FAR); 
gluLookAt(camera_pos[0],camera_pos[1],camera_pos[2], 
     look_at_target[0],look_at_target[1],look_at_target[2], 
     up_vector[0], up_vector[1], up_vector[2]); 

En Optix:

InitialCameraData init_camera; 
init_camera = InitialCameraData(make_float3(camera_pos[0], camera_pos[1],camera_pos[2]),make_float3(look_at_target[0],look_at_target[1],look_at_target[2]),make_float3(0.0f, 1.0f, 0.0f)/*up*/,FOV); 
GLUTDisplay::setCamera(init_camera); 
signalCameraChanged(); 

mise à jour dans 4/21 16:11 Reoutput images

I reoutput images et trouver HFOV (FOV horizontal) peut-être le raison, il semble que dans deux images la hauteur de la fenêtre est la même dans mon écran. Dans ma connaissance, hfov et vfov sont les mêmes dans gluPerspective dans OpenGL. Donc je pense que le hfov est la raison pour laquelle ces deux vues de caméra sont différentes dans mon code optix.

Cependant, je ne sais toujours pas comment modifier hfov en ppm.cpp. Je pense toujours que FOV, que je donne à InitialCameraData, peut être indiquer hfov et vfov. Si cette idée est fausse, où devrais-je modifier hfov? Je peux seulement ajuster le paramètre vfov en tant que code source. Est-ce que quelqu'un, qui est familier avec l'exemple progressivePhotonMap, pourrait me dire où je modifie hfov? Merci pour toute réponse!

+2

Vous pouvez afficher le code source. En tout cas, en regardant les deux images, on dirait que le champ de vision est très différent entre les deux. Comment les matrices de projection sont-elles générées? – Xirema

+0

Désolé, je ne peux pas (je ne sais pas comment) obtenir la projection matix à partir du code optix (ils le violent comme un sténopé, peut-être le traiter dans leur bibliothèque (c'est pourquoi je ne trouve pas pourquoi le –

+0

Je poste un code source dans le sujet, j'espère que cela pourrait aider, merci de votre réponse! –

Répondre

0

La principale différence/problème est que dans Optix, je ne vois pas de matrice de projection.Au mieux, je vois qu'Optix règle le champ de vision en même temps qu'il définit les informations de la caméra, mais l'absence d'un paramètre de rapport d'aspect me trouble, d'autant plus que je regarde l'image Optix de plus près. dans l'axe horizontal, ce qui est moins un problème dans le rendu OpenGL (qui fournit correctement des informations sur le rapport d'aspect).

L'autre chose que je voudrais observer est que vous devriez vérifier comment Optix s'attend à ce que le paramètre Field of View soit fourni. GLU l'attend en degrés, et le traite comme le champ de vision y. Je ne sais pas comment Optix l'attend, mais de nombreuses API s'attendent à ce que Field of View soit fourni par rapport à l'axe des x.