2015-07-26 4 views
0

Я создал 3D-сцену с Blender и вычисленной Матрице проекции P (Также есть информация о переводе T - и ротационной Матрица R). Как я уже упоминал в названии, я пытаюсь вычислить значение z или глубину в Vertex (x, y, z) из данной камеры C с этими матрицами.Compute г-Value (расстояние до камеры) от Vertex с матрицей данной проекции

Пример: вершинных v = [1.4,1,2.3] и положение камеры с = [0, -0.7,10]. Результат должен быть около 10-2.3 = 7.7. Спасибо за помощь!

ответ

0

Обычно перед переводом применяется матрица вращения. Так

transform = R * T 
  • R является матрицей вращения (обычно 4 строк и 4 столбца)
  • T является матрицей перевода (4 строки и 4 столбца)
  • * является умножение матриц которым применяются первые Т а затем R

Конечно, я предполагаю, что вы уже знаете, как выполнять умножение матриц, я не предоставляю код, потому что неясно, нужен ли вам фрагмент python или вы используете экспорт еще одна модель.

После этого применить конечную матрицу проекции (я предполагаю, что ваша матрица проекции уже умноженное на вид матрицы)

final = P * transform 
  • P является матрица проекции (4 строки и 4 столбца)
  • transform ваш полученный ранее (4 строки и 4 столбца) матрицы

final матрица является тот, который преобразует каждый вектор ваша 3D модели, опять же здесь вы матричное умножение (но в этом случае второго операнд является Колум вектор которым четвёртый элемент 1)

transformedVertex = final * Vec4(originalVertex,1) 
  • transformedVertex вектор-столбца (4x1 матрица)
  • final является завершающим матрица (4х4)
  • вершина является ОНЛ 3 координаты, поэтому мы добавим 1, чтобы сделать его (4x1)
  • * еще матрица умножения

После преобразования вершины Z значение - это значение, которое непосредственно отображается в буфер Z и вводится в значение глубины.

На этом этапе выполняется одна операция, выполняемая «по соглашению» и делящая Z на W, чтобы нормализовать ее, тогда значения вне диапазона [0..1] отбрасываются (ближе к ближайшей плоскости клипа или ближе всего к далекой плоскость клипа).

Смотрите также вопрос: Why do I divide Z by W?

EDIT:

Может быть, я неправильно ваш вопрос, если вам нужно расстояние между камерой и точкой, это просто

function computeDistance(cam, pos) 
    dx = cam.x-pos.x 
    dy = cam.y-pos.y 
    dz = cam.z-pos.z 
    distance = sqrt(dx*dx + dy*dy + dz*dz) 
end function 

пример

cameraposition = 10,0,0 
vertexposition = 2,0,0 

выше код

computeDistance (cameraposition, vertexposition) 

выходы

8 
1

Спасибо за вашу помощь, вот что я искал:

установки данных

  • R вращения матрица 4x4
  • Т перевод матрицы 4x4
  • v любой вершины в с [х, у, г, 1] 4x1

Результат

  • vec4 вектор 4x1 (х, у , z, w)

vec4 = R * T * v

vec4.z значение является результатом я искал. Благодаря!

+0

Без проблем;). Спасибо, что приняли мой ответ и добро пожаловать в stackoverflow :) – GameDeveloper