2014-10-22 2 views
0

Я хочу иметь анимированную 3d-текстуру в моем коде LibGDX, но я изо всех сил пытаюсь выяснить, как это сделать.Как оживить текстуры в 3d-модели?

Я предполагаю, что это «должно» сделать либо;

a) Непосредственный доступ и изменение текстуры на модели. (Через пиксельной? ByteBuffer?)

или

б) предварительной визуализации большое изображение, содержащее все кадры (скажем, 20), а затем переход УФ координаты, чтобы создать иллюзию анимации. (сродни ImageStrips в 2d/webdesign).

Я сделал все, что смог полностью заменить материал каждый раз, но это кажется гораздо худшим способом сделать это. Поэтому, если бы кто-нибудь мог показать команды, которые мне нужно выполнить либо a), либо b) (или подобный оптимальный метод), я бы стал отличным. Математика. Я в порядке. Премудрости OpenGLES или GDX я не :)

(Раствор должен по крайней мере, работа HTML/Android компилирует, в идеале все)

ответ

0

С момента последнего выпуска очень легко воспроизвести анимацию 2d на 3d-поверхности. Сначала обязательно ознакомьтесь с концепцией анимации 2d, как описано здесь: https://github.com/libgdx/libgdx/wiki/2D-Animation. Затем вместо использования spritebatch вы можете использовать TextureRegion (который возвращает Animation#getKeyFrame), чтобы установить материал поверхности, как показано здесь: https://github.com/libgdx/libgdx/blob/master/tests/gdx-tests/src/com/badlogic/gdx/tests/g3d/TextureRegion3DTest.java.Так что в основном вы бы получить в методе визуализации:

attribute.set(animation.getKeyFrame(stateTime, true)); 

Или, если вы хотите более общий подход:

instance.getMaterial("<name of material>").get(TextureAttribute.class, TextureAttribute.Diffuse).set(animation.getKeyFrame(stateTime, true)); 

Или, если есть только один материал в ModelInstance:

instance.materials.get(0).get(TextureAttribute.class, TextureAttribute.Diffuse).set(animation.getKeyFrame(stateTime, true)); 
+0

К последним вы имеете в виду 1.4.1? Или какой-то ночной? Этот метод уверен, что он выглядит легко, но у меня нет метода «Установить» в TextureAttribute. – darkflame

+0

TextureAttribute attribute = instance3.materials.get (0) .get (TextureAttribute.class, TextureAttribute.Diffuse); «атрибут» не будет иметь «установленного» метода. – darkflame

+1

Последняя версия 1.4.1, в которой существует TextureAttribute # set (TextureRegion). См. Https://github.com/libgdx/libgdx/blob/1.4.1/gdx/src/com/badlogic/gdx/graphics/g3d/attributes/TextureAttribute.java#L122 – Xoppa

0

Если у вас есть память для него, я бы определенно выбрать б), то проще на процессоре. Кроме того, вы только измените значение формы. Однако из-за предварительной обработки может потребоваться некоторое время для открытия приложения.

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

Gluint animationPos = glGetUniformLocation(shaderProgram, "nameoftheuniform"); 

Ваш главный цикл должен передать значение animationPos шейдеру:

Gluniform1i (animationPos, curentAnimationIndex); 

Добавить это ваш пиксельный шейдер переменные:

uniform int animationPos; 

пиксельный шейдер главное:

float texCoordY = texCoord.y; //texture coordinates should be passed from vertex shader 
float texCoordX = texCoord.x/20.0f; //we are dividing it with 20 since it is the amount of textures that we have and if we use it directly it would try to use all the texture. Whereas the texture stores at 20 different textures. 

float textureIndex = 1.0f*animationPos/20.0f; //Pointer to the start of the animation texture. 
gl_fragColor = texture2D (yourTexture, vec2(textureIndex + texCoordX, texCoordY)); 

Вышеприведенный код предполагает что вы расширили свои текстуры в направлении x, вы также можете попытаться расширить его, как матрицу, тогда вам нужно изменить часть вычисления texCoord. Также мы используем 20 текстур.

Опция a) более тяжелая на процессоре, и вы будете менять текстуру каждый раз, чтобы она использовала pci немного больше, но проще в памяти. Вопрос больше похож на дизайнерское решение, но я думаю, что 20 изображений можно обрабатывать, так что идите с опцией b).

Редактировать: Добавлен код.

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