Я написал функцию для этого, используя объекты или массивы (одиночные или многомерные), см. На 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);
Начнем с основ.
Обычно вы хотите преобразовать вершины локального треугольника, выполнив следующие шаги:
координаты локального пространства-> координаты мирового пространства -> вид -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 , перевести , масштаб , перспектива , орто
Эти функции, по-видимому, устарели, но технически все еще полностью функциональны и действительно будут компилироваться. Таким образом, вы, безусловно, можете использовать функции translate3f (...) и т. Д.
ОДНАКО, этот учебник дает хорошее объяснение того, как работают новые шейдеры и так далее, И для нескольких объектов в космосе.
Вы можете создать x массивов вершин, и привяжите их к объектам x VAO, и оттуда вы визуализируете сцену с помощью шейдеров и т. д. ... да, вам проще просто прочитать это - это действительно хорошее чтение, чтобы понять новые концепции.
Кроме того, OpenGL «Красная книга», как ее называют, имеет новый выпуск - Официальное руководство по изучению OpenGL, версий 3.0 и 3.1 . Он включает «Обсуждение механизма устаревания OpenGL и того, как проверить свои программы для будущих версий OpenGL».
Надеюсь, это поможет!