2013-03-28 2 views
0

Если вы столкнулись с Actionscript, прежде чем вы, вероятно, знаете, как работают клипы, у них есть значения ширины, высоты, x, y, которые вы можете установить на них, и их очень просто изменить.Перемещение сетки в заданные позиции с помощью OpenGL

Но теперь, я попытался с помощью libgdx (Java) & LibCinder (C++) и есть много в него, рендеринга теперь осуществляется с помощью OpenGL, и требует шейдеров и т.д.», мне удалось импортировать 3d меш, который я создал с его текстурой, но теперь все немного странно, когда дело доходит до изменения местоположения/размера сетки.

В обеих библиотеках, которые я пытался использовать, нет реального способа изменить размер или положение сетка, как я думал .. (Сначала я ожидал чего-то вроде mesh.width/height, mesh.scale, mesh.x/y/z)

Так что мой вопрос в том, что такое привод как установить эти ценности?

ответ

1

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

http://www.songho.ca/opengl/gl_transform.html

3

Что вам нужно сделать, это называется 3d transformations.

Как это делается в OpenGL или Direct3D, как правило, путем умножения вершин ваших мешей на матрицу преобразования.

Ячейки большую часть времени экспортируются из программы моделирования, и они находятся в пространстве объектов. Чтобы разместить эти сетки вокруг вашего мира, вам нужно привести их в мировое пространство, умножив их на мировую матрицу. Эта мировая матрица может переносить трансляцию, поворот и масштабировать все в одной матрице. Библиотека DirecXMath предоставляет вам методы для создания этих матриц, а также бесплатные библиотеки для OpenGL.

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

Основные вершинные шейдеры могут выглядеть в HLSL:

cbuffer cbPerObject : register(b0) 
{ 
    float4x4 world; 
    float4x4 viewProj; 
}; 

struct VS_INPUT 
{ 
    float3 position:SV_POSITION; 
}; 

struct VS_OUTPUT 
{ 
    float4 position:SV_POSITION; 
}; 

VS_OUTPUT main(VS_INPUT vsin) 
{ 
    VS_OUTPUT output; 

    float3 position = mul(float4(vsin.position,1.0), world).xyz; 
    output.position = mul(float4(position,1.0), viewProj); 

    return output; 
} 

Так что, если вы даете каждую из ваших экземпляров сетки другой мировой матрицы, все они могут быть размещены в разных местах и ​​с разными масштабами и вращениями.

viewProj является вид и проекционные матрицы в сочетании, которые рассчитываются из ваших настроек камеры и проекции как направления взгляда, положение/вращение, FOV, недалеко от/до плоскости и т.д.

+0

Я вижу, я бы с удовольствием послушайте, что вы скажете о ответе ккурилло, хотя я задаюсь вопросом, что такое «правильный» способ, поскольку я следовал его ответу и, похоже, работал так, как я этого хотел, просто выполняя gl.transform и так далее, это лучше/хуже? – Radicate

+0

glTranslate/glRotate и т. Д. Являются старым способом выполнения преобразований, я бы предложил построить матрицы преобразования и передать их вершинному шейдеру вместо использования конвейера с фиксированной функцией. –

Смежные вопросы