En openGL, j'ai un modèle 3D sur lequel j'effectue une intersection rayon-triangle, en utilisant le code expliqué dans l'article "Fast, Minimum Storage Ray/Triangle Intersection" (http://jgt.akpeters.com/papers/MollerTrumbore97/).Transformation de rayon pour l'intersection rayon-triangle
Ma position du curseur est non projeté dans l'espace du monde en utilisant le code suivant:
bool SCamera::unproject(Vector3 input, Vector3 & output){
GLint viewport[4];
glGetIntegerv(GL_VIEWPORT,viewport); //Grab screen info
float x = input.mX;
float y = input.mY;
float z = input.mZ;
Matrix4 P, Mv, res;
P = getProjection();
Mv = getCameraTransform();
Vector3 N; //Cursor point translated to having 0,0 at screen center
N.mX = ((x-viewport[0])/viewport[2])*2 - 1;
N.mY = ((y-viewport[1])/viewport[3])*2 - 1;
N.mZ = z*2-1;
res = P * Mv; //Multiply P * Mv to get transform
Vector3 w = res.inverse() * N; //Apply transform to N.
output.mX = w[0];
output.mY = w[1];
output.mZ = w[2];
return true;
}
Après cela, je forme un rayon en procédant comme suit:
unproject(Vector3(xClick, yClick,0),resultUnproject)
ray.origin = cameraPosition;
ray.direction = resultUnproject - ray.origin;
ray.direction.normalize();
Maintenant, enfin je suis en train pour exécuter ce rayon à travers le code triangle (lié ci-dessus), mais je ne peux pas sembler le transformer correctement. Ma tentative actuelle est la suivante:
Matrix4 mview, T;
mview = getModelview();
T = mview.inverse();
ray.origin = T*ray.origin;
ray.direction = T*ray.direction;
ray.direction.normalize();
Pour une raison quelconque, cela ne fonctionne pas. Est-ce que je forme mal mon rayon? Ou le transformer mal?
Génial! C'est une très bonne façon de déboguer des choses auxquelles je n'avais pas pensé. Merci. –
Malheureusement, j'ai toujours des problèmes. Pourriez-vous regarder au-dessus des extraits de code court énumérés ci-dessus? –
@Ian - Je ne pense pas que je puisse être d'une grande aide, car c'est un peu éloigné des trucs OGL auxquels je suis habitué, et je suis un quaternion;) La formation du rayon semble un peu soupçonnez-moi - habituellement avec glFrustum, vous pouvez travailler sur une 'pyramide' avec l'utilisateur à (0,0) et l'écran en bas - la base dépend * de * la taille de la fenêtre et des plages de coordonnées. – sje397