Как я перевожу отдельные объекты в OpenGL 3.x?

Я написал функцию для этого, используя объекты или массивы (одиночные или многомерные), см. На https://github.com/joaorito/php_RenameKeys .

Ниже приведен простой пример, вы можете использовать функцию json объединить с заменой, чтобы сделать это.

// Your original array (single or multi)

$original = array(
'DataHora'  => date('YmdHis'),
'Produto'   => 'Produto 1',
'Preco'     => 10.00,
'Quant'     => 2);

// Your map of key to change

$map = array(
'DataHora'  => 'Date',
'Produto'   => 'Product',
'Preco'     => 'Price',
'Quant'     => 'Amount');

$temp_array = json_encode($original);

foreach ($map AS $k=>$v) {
    $temp_array = str_ireplace('"'.$k.'":','"'.$v.'":', $temp);
    }

$new_array = json_decode($temp, $array);

16
задан Wonko 28 October 2009 в 19:03
поделиться

2 ответа

Начнем с основ.

Обычно вы хотите преобразовать вершины локального треугольника, выполнив следующие шаги:

координаты локального пространства-> координаты мирового пространства -> вид -space coords -> clip-space coords

В стандартном GL первые 2 преобразования выполняются с помощью GL_MODELVIEW_MATRIX , третье - с помощью GL_PROJECTION_MATRIX

Эти преобразования представления модели для многие интересные преобразования, которые мы обычно хотим применить (например, сдвиг, масштабирование и поворот), оказываются выраженными как вектор-матричное умножение, когда мы представляем вершины в однородных координатах . Обычно вершина V = (x, y, z) представлена ​​в этой системе как (x, y, z, 1) .

Хорошо. Скажем, мы хотим преобразовать вершину V_local посредством перемещения, затем поворота, а затем перемещения. Каждое преобразование можно представить в виде матрицы *, назовем их T1, R1, T2. Мы хотим применить преобразование к каждой вершине: V_view = V_local * T1 * R1 * T2 . Поскольку умножение матриц ассоциативно, мы можем вычислить раз и навсегда M = T1 * R1 * T2 .

Таким образом, нам нужно только передать M программе вершин и вычислить V_view = V_local * M . В конце концов, типичный вершинный шейдер умножает позицию вершины на одну матрицу. Вся работа по вычислению этой одной матрицы заключается в том, как вы перемещаете объект из локального пространства в пространство отсечения.

Хорошо ... Я просмотрел ряд важных деталей.

Во-первых, то, что я описал до сих пор, действительно касается только преобразования, которое мы обычно хотим сделать, вплоть до пространства просмотра, а не пространства клипа. Однако оборудование ожидает, что выходная позиция вершинного шейдера будет представлена ​​в этом специальном пространстве отсечения. Это' Координаты пространства отсечения трудно объяснить без математических вычислений, поэтому я опущу это, но важный момент состоит в том, что преобразование, которое приводит вершины в это пространство отсечения, обычно может быть выражено как тот же тип умножения матриц. Это то, что вычисляют старые gluPerspective, glFrustum и glOrtho.

Во-вторых, это то, что вы применяете к позициям вершин. Математика преобразования нормалей несколько иная. Это потому, что вы хотите, чтобы нормаль оставалась перпендикулярной к поверхности после преобразования (для справки, это требует умножения на обратное транспонирование вида модели в общем случае, но это можно упростить во многих случаях)

Третье , вы никогда не отправляете четырехмерные координаты в вершинный шейдер. В общем, вы проходите трехмерные. OpenGL преобразует эти 3-D координаты (или 2-D, btw) в 4-D, чтобы вершинному шейдеру не приходилось добавлять дополнительные координаты. он расширяет каждую вершину, чтобы добавить 1 в качестве координаты w .

Итак ... чтобы собрать все это вместе, для каждого объекта вам необходимо вычислить эти магические матрицы M на основе всех преобразований который вы хотите применить к объекту. Затем внутри шейдера вам нужно умножить каждую позицию вершины на эту матрицу и передать ее в вывод Position вершинного шейдера. Типичный код более или менее (здесь используется старая номенклатура):

mat4 MVP;
gl_Position=MVP * gl_Vertex;

* фактические матрицы можно найти в Интернете, особенно на страницах руководства для каждой из этих функций: rotate , перевести , масштаб , перспектива , орто

20
ответ дан 30 November 2019 в 22:10
поделиться

Эти функции, по-видимому, устарели, но технически все еще полностью функциональны и действительно будут компилироваться. Таким образом, вы, безусловно, можете использовать функции translate3f (...) и т. Д.

ОДНАКО, этот учебник дает хорошее объяснение того, как работают новые шейдеры и так далее, И для нескольких объектов в космосе.

Вы можете создать x массивов вершин, и привяжите их к объектам x VAO, и оттуда вы визуализируете сцену с помощью шейдеров и т. д. ... да, вам проще просто прочитать это - это действительно хорошее чтение, чтобы понять новые концепции.

Кроме того, OpenGL «Красная книга», как ее называют, имеет новый выпуск - Официальное руководство по изучению OpenGL, версий 3.0 и 3.1 . Он включает «Обсуждение механизма устаревания OpenGL и того, как проверить свои программы для будущих версий OpenGL».

Надеюсь, это поможет!

1
ответ дан 30 November 2019 в 22:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: