THREE.js 에서는 애니메이션 GIF 파일을 텍스쳐로 사용할수 없습니다.
구글링을 통해 텍스쳐를 애니메이션 GIF 파일처럼 적용하는 소스를 발견하여 이곳에 소개해 봅니다.
function TextureAnimator(texture, tilesHoriz, tilesVert, numTiles, tileDispDuration)
{
// note: texture passed by reference, will be updated by the update function.
this.tilesHorizontal = tilesHoriz;
this.tilesVertical = tilesVert;
// how many images does this spritesheet contain?
// usually equals tilesHoriz * tilesVert, but not necessarily,
// if there at blank tiles at the bottom of the spritesheet.
this.numberOfTiles = numTiles;
texture.wrapS = texture.wrapT = THREE.RepeatWrapping;
texture.repeat.set( 1 / this.tilesHorizontal, 1 / this.tilesVertical );
// how long should each image be displayed?
this.tileDisplayDuration = tileDispDuration;
// how long has the current image been displayed?
this.currentDisplayTime = 0;
// which image is currently being displayed?
this.currentTile = 0;
this.update = function( milliSec )
{
this.currentDisplayTime += milliSec;
while (this.currentDisplayTime > this.tileDisplayDuration)
{
this.currentDisplayTime -= this.tileDisplayDuration;
this.currentTile++;
if (this.currentTile == this.numberOfTiles)
this.currentTile = 0;
var currentColumn = this.currentTile % this.tilesHorizontal;
texture.offset.x = currentColumn / this.tilesHorizontal;
var currentRow = Math.floor( this.currentTile / this.tilesHorizontal );
texture.offset.y = currentRow / this.tilesVertical;
}
};
}
소스출처 : http://stemkoski.github.io/Three.js/Texture-Animation.html
TextureAnimator() 사용법
1. 애니메이션 스프라이트 이미지파일을 만듭니다.
- THREE.js 에서는 이미지 파일을 사용할때 가로/세로의 비율을 동일 하거나 2배수로 할것을 권장합니다.
2. 오브젝트에 텍스쳐 이미지를 등록 합니다.
- 기존의 일반 텍스쳐이미지 등록과 같습니다.
var 스프라이트텍스쳐 = new THREE.TextureLoader().load( image-url );
var 박스 = new THREE.Mesh(
new THREE.BoxBufferGeometry(1,1,1),
new THREE.MeshBasicMaterial({ map: 스프라이트텍스쳐 })
);
장면.add(박스);
3. 읽어들인 스프라이트 이미지를 재료로 하는 애니매이션 객체를 생성합니다.
var 스프라이트애니 = new TextureAnimator(
스프라이트텍스쳐, // 스프라이트 텍스쳐 객체 지정
8, // 가로 갯수
8, // 세로 갯수
63, // 총 갯수
50 // 이미지컷당 변경 시간간격(1000분의 1초)
);
- 1번의 예제 이미지 파일의 경우 가로 8칸, 세로 8칸, 총 이미지컷 수는 63개 입니다.
- 이미지의 순서는 왼쪽 아래부터 오른쪽으로 순서대로 전환됩니다.
4. 애니메이션 업데이트
var clock = new THREE.Clock();
var delta = clock.getDelta();
스프라이트애니.update(1000 * delta);
// 1000 * delta : 미세한 프레임의 지연값 보정
- 애니메이션 객체는 .update() 함수를 실행할때만 갱신 됩니다.
- 필요에 따라 별도의 함수, 또는 전반적인 렌더링 함수안(보통 animate())에 포함시켜 줍니다.
- 위에서 지연값을 보정하기 위한 Clock() 과 getDelta() 에 대한 자세한 사항은 THREE.Clock 을 참조하세요.
See the Pen TextureAnimator by Ricon Kim (@vitneum) on CodePen.
출처: https://horangi.tistory.com/409?category=821071 [노을빛호랑이의 연습장]
'프론트엔드 개발 놀이터 > Three.js' 카테고리의 다른 글
3D 모델 불러 오기 (0) | 2020.02.04 |
---|---|
3차원 공간의 개념 (0) | 2020.02.03 |
Three.js 에서 Audio 사용하기 (0) | 2020.02.03 |
스카이박스 생성 - 360도 구형 파노라마 사진으로 변환 (0) | 2020.02.03 |
스카이박스(skybox) 배경 설치하기 (0) | 2020.02.03 |