2014-10-22 6 views
0

내 LibGDX 코드에 애니메이션 3D 텍스처를 사용하고 싶지만 어떻게해야 하는지를 고민하고 있습니다.3D 모델에서 텍스처를 애니메이션으로 변환하는 방법은 무엇입니까?

"어떻게해야합니까?"라고 가정합니다.

a) 모델의 텍스처에 직접 액세스하고 수정합니다. (픽스맵 통해?의 ByteBuffer?)

또는

b) 모든 프레임을 포함하는 큰 이미지 (예를 들어, 20)를 사전 렌더링 후 애니메이션의 환영을 생성하기 위해 UV 좌표를 이동. (2d/webdesign의 ImageStrip과 유사).

매번 재료를 완전히 대체 할 수있는 방법을 찾았지만 그렇게하는 것이 훨씬 더 어려워 보입니다. 따라서 누구나 내가 a) 나 b) (또는 이와 유사한 최적의 방법)해야 할 명령을 보여줄 수 있다면 나는 위대한 타격이 될 것입니다. 수학 훌륭합니다. OpenGLES 또는 GDX의 복잡한 난 당신이 내가의 definetly) 나 선택할 것 그것을위한 메모리가있는 경우

가 (이 솔루션은/안드로이드 컴파일, 이상적으로 모든 것이 적어도 작업 HTML한다)

답변

0

최신 릴리스 이후 3D 표면에서 2 차원 애니메이션을 재생하는 것은 매우 쉽습니다. 먼저 여기에 설명 된대로 2D 애니메이션 컨셉에 익숙해 지도록하십시오 : https://github.com/libgdx/libgdx/wiki/2D-Animation. 그런 다음 스프라이트 배치를 사용하는 대신 여기에 표시된 것처럼 TextureRegion (어느 Animation#getKeyFrame이 반환 함)을 사용하여 서피스의 재질을 설정할 수 있습니다. https://github.com/libgdx/libgdx/blob/master/tests/gdx-tests/src/com/badlogic/gdx/tests/g3d/TextureRegion3DTest.java.그래서 기본적으로 당신은 당신의 렌더링 방법으로 얻을 것 :

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

다음 ModelInstance에 하나의 자료가 있다면,

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

또는 :

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

을 또는 당신은 더 일반적인 접근 방식을 원하는 경우 가장 최근에 1.4.1을 의미합니까? 아니면 밤에 뭔가? 그 방법은 분명해 보이지만 TextureAttribute에 "Set"메서드가없는 것 같습니다. – darkflame

+0

TextureAttribute 속성 = instance3.materials.get (0) .get (TextureAttribute.class, TextureAttribute.Diffuse); "속성"에는 "설정"방법이 없습니다. – darkflame

+1

최신 릴리스는 TextureAttribute # set (TextureRegion)이있는 1.4.1입니다. 참조 : https://github.com/libgdx/libgdx/blob/1.4.1/gdx/src/com/badlogic/gdx/graphics/g3d/attributes/TextureAttribute.java#L122 – Xoppa

0

, 그것이 :) 아니에요 프로세서에서 더 쉬워졌습니다. 또한 유니폼의 값만 변경하면됩니다. 그러나 사전 처리로 인해 응용 프로그램을 여는 데 약간의 시간이 걸릴 수 있습니다.

쉐이더를 컴파일하는 uniform 변수를 얻으십시오. animationPos는 전역이어야합니다.

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

귀하의 메인 루프는 셰이더 animationPos 값을 전달한다 : 주요

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)); 

Gluniform1i (animationPos, curentAnimationIndex); 

이 당신의 조각 셰이더 변수를 추가 위의 코드는 가정합니다. 텍스쳐를 x 방향으로 확장했다면 매트릭스처럼 확장하려고 시도 할 수 있습니다. 그런 다음 texCoord 계산 부분을 변경해야합니다. 또한 우리는 20 개의 텍스처를 사용하고 있습니다.

옵션 a)는 프로세서에서 더 무거 우므로 매번 텍스처를 변경하므로 pci를 조금 더 사용하지만 메모리는 더 사용합니다. 질문은 디자인 결정과 더 비슷하지만 20 개의 이미지를 처리 ​​할 수 ​​있으므로 옵션 b)를 선택해야합니다.

편집 : 코드가 추가되었습니다.

관련 문제