2010-06-28 2 views
1

Как преобразовать перспективное представление в Java? Насколько я понимаю, есть какая-то магическая 4-мерная матрица, которую я могу использовать, которая определит расстояния FOV, Aspect Ratio и Near и Far, но я не знаю, как создать эту матрицу.матрица перспективного представления/преобразования

Я в состоянии реализовать «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», но снова мне нужно было угадать, в какой «квадрациклов» использовать.

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

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

благодаря

+0

Также обратите внимание, что это не зависит от Java. –

ответ

1

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

alt text http://knol.google.com/k/-/-/2lijysgth48w1/zafhtk/formule16.png

This link может быть в состоянии дать вам немного руку с этим.
Also in here, вы можете проверить, как рассчитать поле зрения, в разделе «Настройка Tranform Проекции»

В вашем случае, я полагаю, ваша матрица должна иметь последнюю строку устанавливается как 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, а также использовать соответствующие методы для того, чтобы ваша матрица была однородной в конце.

+0

Итак, вот что я не понимаю о предоставляемых ссылках ... Кажется, что маркированная матрица с правомX, rightY, eyeX, eyeY, eyeZ и т. Д. Означает, что я должен притворяться, что мое 2d изображение является 3d и изобретает точку для глаза/камеры и точку, на которую смотрит глаз. Итак, какие пункты я использую? Ни одна из ссылок, похоже, не упоминает FOV или расстояние вообще. Второй упоминает «близко и далеко», но ничего не говорит о том, как выбирать эти цифры, или как выбирать eyeX, eyeY, eyeZ и т. Д. Есть ли что-то, чего я не хватает? – Aaron

+0

Хорошо, во-первых, всякий раз, когда вы используете измерения 4x4, вы имеете в виду 3D-пространство, а это означает, что для двумерных ситуаций вы в основном фиксируете одну из осей, чтобы определить плоскость, в которой вы работаете. Вы всегда работаете с одной дополнительной единицей размера в матрице, чем размер пространства, над которым работаете, чтобы сделать квадрат матрицы, что упрощает операции с ним. Насколько я знаю, вы не можете использовать этот метод, чтобы фактически изменить свою перспективу изображения, если только это изображение не является вашим экраном и выражается в виртуальной 3D-среде. –

+0

«не может использовать этот метод, чтобы реально изменить вашу перспективу изображения» ... Итак ... Вы говорите, что я не могу изменить перспективу 2-го изображения с использованием матрицы 4x4? – Aaron