В openGL у меня есть 3D-модель, на которой я выполняю пересечение лучей и треугольников, используя код, описанный в статье «Быстрое пересечение лучей / треугольников с минимальным объемом памяти» (http://jgt.akpeters.com/paper/MollerTrumbore97/).
Моя позиция курсора не проецируется в мировое пространство с использованием следующего кода:
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;
}
После этого я формирую луч следующим образом:
unproject(Vector3(xClick, yClick,0),resultUnproject)
ray.origin = cameraPosition;
ray.direction = resultUnproject - ray.origin;
ray.direction.normalize();
Теперь, наконец, я пытаюсь пропустить этот луч через код треугольника (ссылка выше), но мне кажется, что я не могу правильно его преобразовать. Моя текущая попытка выглядит следующим образом:
Matrix4 mview, T;
mview = getModelview();
T = mview.inverse();
ray.origin = T*ray.origin;
ray.direction = T*ray.direction;
ray.direction.normalize();
По какой-то причине это не работает. Я неправильно формирую свой луч? Или это неправильно трансформирует?