three.js를 이용하여 3D 모델을 불러와서 화면에 렌더링 할 때, 해당 모델의 크기와 원점이 모두 상이하여 이를 공통적으로 처리하기 위한 함수입니다.
_zoomFit(object3D, camera, viewMode, bFront) { const box = new THREE.Box3().setFromObject(object3D); const sizeBox = box.getSize(new THREE.Vector3()).length(); const centerBox = box.getCenter(new THREE.Vector3()); let offsetX = 0, offsetY = 0, offsetZ = 0; viewMode === "X" ? offsetX = 1 : (viewMode === "Y") ? offsetY = 1 : offsetZ = 1; if(!bFront) { offsetX *= -1; offsetY *= -1; offsetZ *= -1; } camera.position.set(centerBox.x + offsetX, centerBox.y + offsetY, centerBox.z + offsetZ); const halfSizeModel = sizeBox * 0.5; const halfFov = THREE.Math.degToRad(camera.fov * .5); const distance = halfSizeModel / Math.tan(halfFov); const direction = (new THREE.Vector3()).subVectors(camera.position, centerBox).normalize(); const position = direction.multiplyScalar(distance).add(centerBox); camera.position.copy(position); camera.near = sizeBox / 100; camera.far = sizeBox * 100; camera.updateProjectionMatrix(); camera.lookAt(centerBox.x, centerBox.y, centerBox.z); }
실제 활용은 다음처럼 fbx 형식의 모델 파일 불러와 화면상에 렌더링하는 예를 보면 쉽게 확인할 수 있습니다.
loader.load('data/Rumba Dancing.fbx', object => { this._scene.add(object); this._zoomFit(object, this._camera, "X", true); } );
위의 _zoomFit의 세번째와 네번째 인자인 “X”, true는 양(plus)의 X축 방향에서 바라본다는 의미입니다. 위 코드의 결과는 다음과 같습니다.