수색…


소개

이 문서에서는 Three.js 장면에 직접 애니메이션을 추가하는 일반적인 방법에 대해 설명합니다. 장면 (역주, 물리학 등)에 동적 인 움직임을 추가 할 수있는 라이브러리와 프레임 워크가 있지만 몇 줄의 코드만으로 간단하게이 작업을 수행 할 수있는 방법을 이해하는 것이 도움이됩니다.

비고

애니메이션의 핵심 개념은 일정 기간 동안 소량의 객체 속성 (일반적으로 회전 및 평행 이동)을 업데이트하는 것입니다. 예를 들어 X 위치를 0.1 초마다 1 초씩 증가시켜 객체를 변환하는 경우 1 초에 X 축에서 1 단위 더 멀어 지지만 뷰어는이 위치를 통해 그 위치로 부드럽게 이동했다고 인식합니다 새로운 위치로 직접 점프하는 대신에

우리를 돕기 위해 스크립트에서 렌더 루프 를 만듭니다.

var render = function () {
    requestAnimationFrame( render );
    //update some properties here
    renderer.render(scene, camera);
}

위의 회전 큐브 예제에서 새 애니메이션 프레임이 요청 될 때마다 큐브의 회전을 변경하기 위해 작은 증분 업데이트라는이 아이디어를 사용합니다. 모든 프레임에서 cube 객체의 rotation.xrotation.y 속성을 증가시킴으로써 큐브가 두 축으로 회전하는 것처럼 보입니다.

다른 예로, 필요한 업데이트를 다른 함수로 분리하는 것은 드문 일이 아닙니다. 렌더 루프를 깔끔하게 유지하면서 추가 계산 및 검사를 할 수있는 다른 함수로 분리하는 것이 일반적입니다. 예를 들어, 아래의 렌더 루프는 장면에서 updatePoints() 의 경우 개별 객체 (또는 객체 배열)를 업데이트하기위한 4 개의 다른 업데이트 함수를 호출합니다.

//render loop
function render() {
    requestAnimationFrame( render );
    updateGrid();
    updateCube();
    updateCamera();
    updatePoints(pList);
    renderer.render( scene, camera);
}
render();

예제에서 온라인에서 카메라 컨트롤도 렌더 루프의 일부임을 알 수 있습니다.

controls = new THREE.OrbitControls( camera, renderer.domElement );
controls.enableDamping = true;
controls.dampingFactor = 0.25;
controls.enableZoom = true;
controls.autoRotate = true;

var render = function () {
    requestAnimationFrame( render );
    controls.update();
    renderer.render(scene, camera);
};

카메라를 제어하는 ​​스크립트가 똑같은 일을하기 때문입니다. 시간이 지남에 따라 업데이트. 변경 사항은 마우스 위치와 같은 사용자 입력이나 경로를 따르는 것과 같은 프로그래밍 방식으로 인해 발생할 수 있습니다. 두 경우 모두 카메라에 애니메이션을 적용하는 것입니다.

회전 큐브

var scene = new THREE.Scene();  
var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 ); 

var renderer = new THREE.WebGLRenderer(); 
renderer.setSize( window.innerWidth, window.innerHeight ); 
document.body.appendChild( renderer.domElement );

var geometry = new THREE.BoxGeometry( 1, 1, 1 );
var material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
var cube = new THREE.Mesh( geometry, material );
scene.add( cube );

camera.position.z = 5;

//Create an render loop to allow animation
var render = function () {
    requestAnimationFrame( render );

    cube.rotation.x += 0.1;
    cube.rotation.y += 0.1;

    renderer.render(scene, camera);
};

render();


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow