Добрый день!
Ни кто не сталкивался с реализацией gluUnProject или аналогом этойф-и?
Или есть ли идеи/примеры как перевести экранные координаты (левый верхний, правый нижний край экрана) в мировые координаты OpenGL?
Остались мои старые наработки по OpenGL, но везде используется gluUnProject, хотелось бы обойтись без этой ф-и
Среда:
Android NDK, OpenGlES 2, C++
Спасибо!
Умножить на обратную матрицу к MVP
Aldaron
> Ни кто не сталкивался с реализацией gluUnProject или аналогом этойф-и?
В mesa3d есть исходники этой функции и не только.
Dimich
Спасибо, гляну
akaAngeL
Умножить vector2(screenX, screenY) на MVP?
Зачем M в MVP?
const Math::Ray TCamera3D::GetRayFromViewport(const Math::Vector2& xy) const { float nx = ( 2.0f * ( xy.x)) - 1.0f; float ny = 1.0f - ( 2.0f * ( xy.y)); // We use default\optimization projection Math::Vector3 nearPoint( nx, ny, ( IDK::IRenderState::Optimization::FloatDepthProjection) ? 1.0f : -1.f); // Use midPoint rather than far point to avoid issues with infinite projection Math::Vector3 midPoint ( nx, ny, 0.0f); // Get ray origin and ray target on near plane in world space Math::Vector3 rayOrigin, rayTarget; rayOrigin = mInvViewProj * nearPoint; rayTarget = mInvViewProj * midPoint; Math::Vector3 rayDirection = Math::Normalize( rayTarget - rayOrigin); return Math::Ray( rayOrigin, rayDirection); } const Math::Vector3 TCamera3D::ProjectPointToViewport( const Math::Vector3& xyz) const { //projection point to viewport Math::Vector4 pos = mViewProj*Math::Vector4( xyz, 1.0f); // remove prespective pos = pos / pos.w; //to screen space pos.x = 0.5f*pos.x + 0.5f; pos.y = 1.0f - ( 0.5f*pos.y + 0.5f); return Math::Vector3( pos.x, pos.y, pos.z); } void TCamera3D::BuildMatrices( ) { mViewProj = mProj*mView; mInvViewProj = Math::Inverse( mViewProj); mInvView = Math::Inverse( mView); }
Умножить vector2(screenX, screenY) на MVP?
Умножить надо vector3(screenX / screenWidth * 2 - 1, screenY / screenHeight * 2 - 1, sceneDepth) на обратную матрицу ViewProject
sceneDepth - глубина из буфера глубины. Если подставить 0 то будут 3д координаты на плосоксти NearPlane.
// mInvViewProj = Math::Inverse
- много лишних вычислений так как не учитывается что view это SRT матрица.
key0
Твой вариант?
ReeV
если для выбора предметов то я сделал на выборе по цвету и пока не возвращался к вопросу а если для остального - то вот функция получения view одновременно генерицца invView
а общая идея такая - обратная к поворотной это ее транспонированная
Aldaron
недавно релизнулась в паблик книга "OpenGL Development Cookbook Over 40 recipes ..." там есть глава два про выбор предметов и собсна используется glm::unProject - если есть желание делать как раньше
Вы чё, серьезно?! Для того, что бы перевести экранные координаты в мировые собираетесь считать обратную матрицу к MVP?
ну unКусочекP сделать и unвьюпорт то надо ?обобщенную обратную к мвп это расточительно на мой вкус
Камера и матрица проекции как правило не меняется в течение всего фрейма. 1 раз на фрейм подсчитать обратную к ViewProjection сложно и расточительно?
MrShoor
> 1 раз на фрейм
1 раз на изменение камеры, камера может не меняться дольше чем 1 фрейм.
key0
>>inline void LookAt2(GLfloat resView[16], GLfloat resInvView[9],const GLfloat eyeX,
>> const GLfloat eyeY,
>> const GLfloat eyeZ,
>> const GLfloat centerX,
>> const GLfloat centerY,
>> const GLfloat centerZ,
>> const GLfloat upX,
>> const GLfloat upY,
>> const GLfloat upZ)
Лол - а вы еще говорите за оптимизации...
Эти данные нужны для рендера - и они не только для курсор-проекции
mInvViewProj = Math::Inverse(mViewProj);
mInvView = Math::Inverse(mView);
И BuildMatrices() меняется только при смещении камеры.
ReeV
>Лол - а вы еще говорите за оптимизации...
- как должно быть?
MrShoor
>1 раз на фрейм подсчитать обратную к ViewProjection сложно и расточительно?
если можно посчитать в 10 раз быстрее и нет явной задачи считать в 10 раз медленнее )
всего 9(!) умножений на обратимость viewMatrix c этого форума из 2006го
Тема в архиве.