glunproject более дешевая альтернатива

Я создаю игру в openframeworks, где камера перемещается по стационарной 2D-плоскости в 3D-пространстве. Мне нужно выбрать 5 координат для каждого кадра, так как камера всегда движется (1 для мыши и 4 для углов окна просмотра, чтобы понять, что рисовать). Однако я обнаружил, что функция gluUnproject слишком медленная. Поскольку я выбираю координаты только на стационарной плоскости, в настоящее время на Z = 0, я полагаю, что смогу довольно дешево определить свои координаты, используя матрицы просмотра модели и проекции из моего класса камеры, но я просто не могу работать как сделать математику.

Подводя итог, у меня есть

Камера — матрицы MODELVIEW и PROJECTION, плоскость VIEWPORT, выровненная по оси Z, с размерами world_dims.x, world_dims.y

Я хочу преобразовать координаты экрана в непроецируемые координаты на плоскости без использования gluUnproject.

На случай, если я тупой с моим gluUnproject, вот код для этого бита

ofVec3f ofxGrabCam::pickCoordinate(ofVec2f t_mouseP) {
//read z value from depth buffer at mouse coords

ofVec3f t_mouseW(t_mouseP.x, t_mouseP.y, 0);

glReadPixels(t_mouseW.x, ofGetScreenHeight()-1-t_mouseP.y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &t_mouseW.z);

if (t_mouseW.z == 1.0f){
    return ofVec3f(-99,-99,-99); //represents point not found
}

GLdouble c[3];

gluUnProject(t_mouseW.x, ofGetScreenHeight()-1-t_mouseW.y, t_mouseW.z, matM, matP, viewport, c, c+1, c+2);

ofVec3f mouseW(c[0],c[1],c[2]);

return mouseW;

}


person Simon Katan    schedule 09.03.2012    source источник


Ответы (1)


Однако я обнаружил, что функция gluUnproject слишком медленная.

Обратное преобразование всего 5 координат не должно быть узким местом в производительности.

Я хочу преобразовать координаты экрана в непроецируемые координаты на плоскости без использования gluUnproject.

Вы должны определить путь обратного преобразования. То есть: инвертирование матриц, описывающих путь из пространства модели в пространство просмотра (и в какой-то момент инвертирование разделения перспективы), а затем передача в него ваших координат. Однако это именно то, что делает gluUnproject.

person datenwolf    schedule 09.03.2012
comment
Я определенно получаю падение производительности (пытаюсь работать со скоростью 60 кадров в секунду). Почти уверен, что я все делаю правильно, но на всякий случай я отредактирую часть своего кода в своем вопросе. Сейчас я изучаю этот метод mvps.org/directx/articles/rayproj.htm но все равно не повезло. Не могли бы вы или кто-нибудь дать мне конкретные инверсии, которые мне нужно сделать в определенном порядке? - person Simon Katan; 09.03.2012
comment
Я просто хотел сказать, что я тоже обнаружил, что gluUnproject является основным узким местом, и мне бы понравилось, если бы на этот вопрос был ответ вместо альтернативы. - person Jeff; 26.03.2013
comment
@Jeff: падение производительности не связано с gluUnProject. Узким местом является glReadPixels. Если вам нужен только луч, не используйте glReadPixels и используйте 0 и 1 в качестве координат Z. - person datenwolf; 26.03.2013
comment
Мое приложение отличается от описанного в этом вопросе. Я ищу просто расстояние от камеры для каждого пикселя. glReadPixels — это не узкое место, это gluUnproject. Однако я нашел решение самостоятельно выполнить преобразование, следуя этому коду: olivers. posterous.com/linear-depth-in-glsl-for-real. Он работает в 7 раз быстрее, чем gluUnproject (и я даже не использовал шейдер). Я использую glReadPixels для обоих. - person Jeff; 26.03.2013
comment
@Jeff: Ну, в таком случае, если вы передадите порядка 1 миллиона пикселей через gluUnProject, это, конечно, будет медленно. Прочитайте мой первоначальный ответ: обратное преобразование всего 5 координат пять, а не миллион. Я только что просмотрел эту статью, на которую она ссылается, но мне кажется, что это вычисляет перпендикулярное расстояние, параллельное оси обзора, что может не совсем то, что вы ищете. - person datenwolf; 26.03.2013
comment
Да, ты прав. Мой вопрос отличается от того, что было задано. Для моего приложения решение по этой ссылке идеально подходит - person Jeff; 27.03.2013