перспективный вид / матрица преобразования - PullRequest
1 голос
/ 28 июня 2010

Как мне выполнить преобразование вида в перспективе в Java?Насколько я понимаю, есть какая-то волшебная 4-мерная матрица, которую я могу использовать, которая будет определять FOV, формат изображения и расстояния просмотра ближнего и дальнего обзора, но я не знаю, как создать эту матрицу.Я могу реализовать «PerspectiveTransform» в Java, но я не вижу эффекта при использовании следующих

double mat[][] = {
    {1, 0, 0, 0}, 
    {0, 1, 0, 0},
    {0, 0, 1, 0},
    {0, 0, 1, 0}};
PerspectiveTransform ps = new PerspectiveTransform(mat);
ps.transform(p1, p1);
ps.transform(p2, p2);
ps.transform(p3, p3);
ps.transform(p4, p4);

Я понимаю, что самый нижний «1» может быть 1 / d, где «d»это расстояние, но независимо от того, какое число я там пробую, я не получаю никакого эффекта.Изменение других чисел имеет эффект, но я не знаю, какой эффект они будут иметь, пока не попробую (и я не могу просто догадываться бесконечно).Я знаю и смог заставить работать функцию "quadToQuad", но я снова должен был бы угадать, какие "квады" использовать.

Поэтому мне нужен ресурс, чтобы объяснить мне, как поступитьс нужной мне матрицей, основанной на поле зрения, соотношении сторон, расстоянии и т. д. Я прочитал соответствующую часть "Интерактивной компьютерной графики" 5-е издание.Эдвардом Энджелом и не понимаю этого.

То, что я пытаюсь сделать, - это преобразовать изображение с высоты птичьего полета в изображение человеческого глаза.Пример этого можно увидеть при использовании Google Планета Земля ..

спасибо

1 Ответ

1 голос
/ 28 июня 2010

Существует вероятность того, что когда вы выполняете ps.transform (p2, p2), вы отменяете эффект той же инструкции, используя аргумент p1 в качестве аргумента, но, независимо от этого, типичные значения позиций этой матрицы следующие:

альтернативный текст http://knol.google.com/k/-/-/2lijysgth48w1/zafhtk/formule16.png

Эта ссылка может помочь вам в этом.
Также здесь , вы можете проверить, как рассчитать поле зрения, в разделе «Настройка проекционного преобразования»

В вашем случае, я полагаю, в вашей матрице последняя строка должна быть установлена ​​как 0 0 0 1, а не как оналайк.Кроме того, поле зрения может быть рассчитано с помощью выражения, описанного в той же ссылке:

void VerticalFieldOfView(float degrees, float aspectRatio, 
                         float near, float far)
{
   float top = near * std::tan(degrees * Pi / 360.0f);
   float bottom = -top;
   float left = bottom * aspectRatio;
   float right = top * aspectRatio;

   glFrustum(left, right, bottom, top, near, far);
}

Где "glFrustum (...)" равно

void ApplyFrustum(float left, float right, float bottom, 
                  float top, float near, float far)
{
    float a = 2 * near / (right - left);
    float b = 2 * near / (top - bottom);
    float c = (right + left) / (right - left);
    float d = (top + bottom) / (top - bottom);
    float e = - (far + near) / (far - near);
    float f = -2 * far * near / (far - near);

    mat4 m;
    m.x.x = a; m.x.y = 0; m.x.z = 0; m.x.w = 0;
    m.y.x = 0; m.y.y = b; m.y.z = 0; m.y.w = 0;
    m.z.x = c; m.z.y = d; m.z.z = e; m.z.w = -1;
    m.w.x = 0; m.w.y = 0; m.w.z = f; m.w.w = 1;

    glUniformMatrix4fv(projectionUniform, 1, 0, m.Pointer());
}

Примерв C ++, но все, что вам нужно сделать, это перевести его в две функции Java, а также использовать соответствующие методы для того, чтобы сделать вашу матрицу единой в конце.

...