ПрограммированиеФорумГрафика

Перевод экраннх координат в мировые на OpenGLES без gluUnProject

Страницы: 1 2 Следующая »
#0
10:47, 24 окт 2013

Добрый день!
Ни кто не сталкивался с реализацией gluUnProject  или аналогом этойф-и?
Или есть ли идеи/примеры как перевести экранные координаты (левый верхний, правый нижний край экрана) в мировые координаты OpenGL?

Остались мои старые наработки по OpenGL, но везде используется gluUnProject, хотелось бы обойтись без этой ф-и

Среда:
Android NDK, OpenGlES 2, C++

Спасибо!

#1
11:02, 24 окт 2013

Умножить на обратную матрицу к MVP

#2
11:25, 24 окт 2013

Aldaron
> Ни кто не сталкивался с реализацией gluUnProject  или аналогом этойф-и?
В mesa3d есть исходники этой функции и не только.

#3
12:00, 24 окт 2013

Dimich
Спасибо, гляну
akaAngeL
Умножить vector2(screenX, screenY) на MVP?
Зачем M в MVP?

#4
12:04, 24 окт 2013
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);
}
#5
12:04, 24 окт 2013

Умножить vector2(screenX, screenY) на MVP?

Умножить надо vector3(screenX / screenWidth * 2 - 1, screenY / screenHeight * 2 - 1, sceneDepth) на обратную матрицу ViewProject
sceneDepth - глубина из буфера глубины. Если подставить 0 то будут 3д координаты на плосоксти NearPlane.

#6
14:43, 24 окт 2013

// mInvViewProj = Math::Inverse
- много лишних вычислений так как не учитывается что view это SRT матрица.

#7
17:18, 24 окт 2013

key0
Твой вариант?

#8
18:36, 24 окт 2013

ReeV
если для выбора предметов то я сделал на выборе по цвету и пока не возвращался к вопросу а если для остального - то вот функция получения view одновременно генерицца invView

+ Показать

а общая идея такая - обратная к поворотной это ее транспонированная
Aldaron
недавно релизнулась в паблик книга "OpenGL Development  Cookbook Over 40 recipes ..." там есть глава два про выбор предметов и собсна используется glm::unProject - если есть желание делать как раньше

#9
1:03, 25 окт 2013

Вы чё, серьезно?! Для того, что бы перевести экранные координаты в мировые собираетесь считать обратную матрицу к MVP?

#10
3:03, 25 окт 2013

ну unКусочекP сделать и unвьюпорт то надо ?обобщенную обратную к мвп это расточительно на мой вкус

#11
8:41, 25 окт 2013

Камера и матрица проекции как правило не меняется в течение всего фрейма. 1 раз на фрейм подсчитать обратную к ViewProjection сложно и расточительно?

#12
11:06, 25 окт 2013

MrShoor
> 1 раз на фрейм
1 раз на изменение камеры, камера может не меняться дольше чем 1 фрейм.

#13
11:47, 25 окт 2013

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() меняется только при смещении камеры.

#14
16:28, 25 окт 2013

ReeV
>Лол - а вы еще говорите за оптимизации...
- как должно быть?
MrShoor
>1 раз на фрейм подсчитать обратную к ViewProjection сложно и расточительно?
если можно посчитать в 10 раз быстрее и нет явной задачи считать в 10 раз медленнее )
всего 9(!) умножений на обратимость viewMatrix c этого форума из 2006го

+ Показать
Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.