2016-09-04 1 views
0

J'ai rencontré des problèmes lors de l'implémentation d'une caméra pour mon moteur de rendu. Comme la question l'indique, je voudrais connaître les étapes nécessaires pour générer un tel appareil photo. Avec champ de vision et ratio d'aspect inclus. Il est important que le système de coordonnées soit gaucher tel que -z pousse la caméra loin de l'écran (comme Je l'ai compris). J'ai essayé de regarder en ligne mais la plupart des implémentations sont incomplètes ou m'ont échoué. Toute aide est appréciée. Merci.Traçage de trajectoire - Génération de rayons de caméra avec un système de coordonnées à gauche

Répondre

0

J'ai eu des problèmes avec cela et j'ai mis du temps à comprendre. Voici le code pour la classe de caméra.

#ifndef CAMERA_H_ 
#define CAMERA_H_ 

#include "common.h" 

struct Camera { 
    Vec3fa position, direction; 
    float fovDist, aspectRatio; 
    double imgWidth, imgHeight; 
    Mat4 camMatrix; 

    Camera(Vec3fa pos, Vec3fa cRot, Vec3fa cDir, float cfov, int width, int height) { 
     position = pos; 
     aspectRatio = width/(float)height; 
     imgWidth = width; 
     imgHeight = height; 

     Vec3fa angle = Vec3fa(cRot.x, cRot.y, -cRot.z); 
     camMatrix.setRotationRadians(angle * M_PI/180.0f); 

     direction = Vec3fa(0.0f, 0.0f, -1.0f); 
     camMatrix.rotateVect(direction); 

     fovDist = 2.0f * tan(M_PI * 0.5f * cfov/180.0); 
    } 

    Vec3fa getRayDirection(float x, float y) { 
     Vec3fa delta = Vec3fa((x-0.5f) * fovDist * aspectRatio, (y-0.5f) * fovDist, 0.0f); 
     camMatrix.rotateVect(delta); 
     return (direction + delta); 
    } 
}; 

#endif 

Incase si vous avez besoin du code rotateVect() dans la classe mat4

void Mat4::rotateVect(Vector3& vect) const 
{ 
    Vector3 tmp = vect; 
    vect.x = tmp.x * (*this)[0] + tmp.y * (*this)[4] + tmp.z * (*this)[8]; 
    vect.y = tmp.x * (*this)[1] + tmp.y * (*this)[5] + tmp.z * (*this)[9]; 
    vect.z = tmp.x * (*this)[2] + tmp.y * (*this)[6] + tmp.z * (*this)[10]; 
} 

Voici notre setRotationRadians Code

void Mat4::setRotationRadians(Vector3 rotation) 
{ 
    const float cr = cos(rotation.x); 
    const float sr = sin(rotation.x); 
    const float cp = cos(rotation.y); 
    const float sp = sin(rotation.y); 
    const float cy = cos(rotation.z); 
    const float sy = sin(rotation.z); 

    (*this)[0] = (cp * cy); 
    (*this)[1] = (cp * sy); 
    (*this)[2] = (-sp); 

    const float srsp = sr * sp; 
    const float crsp = cr * sp; 

    (*this)[4] = (srsp * cy - cr * sy); 
    (*this)[5] = (srsp * sy + cr * cy); 
    (*this)[6] = (sr * cp); 

    (*this)[8] = (crsp * cy + sr * sy); 
    (*this)[9] = (crsp * sy - sr * cy); 
    (*this)[10] = (cr * cp); 
} 
+0

Merci d'avoir répondu! Déjà mis en œuvre un mais ce n'est pas le meilleur et a certains problèmes.Ainsi, désireux d'essayer quelque chose d'autre.Pas toujours quelques questions.Qu'est-ce que la matrice Matrix est initialisée? Est-ce la matrice d'identité ou d'autres valeurs 4x4. Deuxièmement, puis-je voir le code Rotation Radians? Je voudrais comparer quelque chose. Et finalement juste une curiosité plus que n'importe quoi - Pourquoi utiliser une matrice au lieu des méthodes habituelles de produits croisés? C'est tout.Encore ...... Merci beaucoup :) – hecatonchries

+0

CamMatrix est initialisé à Identity Matrix. Vous pouvez réaliser la même chose sans matrice, mais je suis récemment devenu un fan de matrices, donc je l'ai utilisé. – codetiger

+0

Oh ok.Je crois que nous sommes tous différents.Cuz je déteste vraiment les matrices.Lol.Wont les utiliser jusqu'à ce que absolument nécessaire.Toujours merci pour tout.Faites savoir dès que je l'essaye !! Le code est parfaitement logique. – hecatonchries