일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- node.js
- 몽고디비
- openCV
- 빅 데이타
- 우리들교회
- 확률
- Deep learning
- 김양재
- Artificial Intelligence
- 김양재 목사
- 주일설교
- Statistics
- 딥러닝
- data science
- c++
- No SQL
- 인공지능
- MongoDB
- 빅데이터
- WebGL
- probability
- 빅 데이터
- 통계
- 빅데이타
- 김양재 목사님
- nodeJS
- Big Data
- 데이터 과학
- Machine Learning
- R
Archives
- Today
- Total
Scientific Computing & Data Science
[WebGL] Blender Animation Scene 로딩하기 본문
이번 예제는 free & open source 3D 제작도구인 Blender에서 제작한 애니메이션 씬을 Three.js 프레임웍의 Loader(JSONLoader)로 불러오는 것에 관한 것입니다.
Blender에서 간단한 물리 시뮬레이션을 수행하고 이 애니메이션에 대하여 Frame Baking을 하여 각 Frame에 대한 애니메이션 데이터를 생성합니다.
Download Project
07-03-blender-animation-scene.zip
Click here to view with full screen mode
Operations
Mouse Left Button Click & Drag: Camera Rotating
Mouse Wheel: Camera Zoom In & Out
Mouse Right Button Click & Drag: Camera Panning
main.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 | // MAIN // standard global variables var container, scene, camera, renderer, controls, stats; var keyboard = new THREEx.KeyboardState(); var clock = new THREE.Clock(); // custom global variables var android; var animOffset = 0, // starting frame of animation walking = false, duration = 4000, // milliseconds to complete animation keyframes = 250, // total number of animation frames interpolation = duration / keyframes, // milliseconds per frame lastKeyframe = 0, // previous keyframe currentKeyframe = 0; init(); animate(); // FUNCTIONS function init() { // SCENE scene = new THREE.Scene(); // CAMERA var SCREEN_WIDTH = window.innerWidth, SCREEN_HEIGHT = window.innerHeight; var VIEW_ANGLE = 45, ASPECT = SCREEN_WIDTH / SCREEN_HEIGHT, NEAR = 0.1, FAR = 20000; camera = new THREE.PerspectiveCamera( VIEW_ANGLE, ASPECT, NEAR, FAR); scene.add(camera); camera.position.set(0,150,400); camera.lookAt(scene.position); // RENDERER if ( Detector.webgl ) renderer = new THREE.WebGLRenderer( {antialias:true} ); else renderer = new THREE.CanvasRenderer(); renderer.setSize(SCREEN_WIDTH, SCREEN_HEIGHT); container = document.getElementById( 'ThreeJS' ); container.appendChild( renderer.domElement ); // EVENTS THREEx.WindowResize(renderer, camera); THREEx.FullScreen.bindKey({ charCode : 'm'.charCodeAt(0) }); // CONTROLS controls = new THREE.OrbitControls( camera, renderer.domElement ); // STATS stats = new Stats(); stats.domElement.style.position = 'absolute'; stats.domElement.style.bottom = '0px'; stats.domElement.style.zIndex = 100; container.appendChild( stats.domElement ); // LIGHT var light = new THREE.PointLight(0xffffff); light.position.set(-100,200,100); scene.add(light); // FLOOR var floorTexture = new THREE.ImageUtils.loadTexture( 'img/Wood_floor.jpg' ); floorTexture.wrapS = floorTexture.wrapT = THREE.RepeatWrapping; floorTexture.repeat.set( 1, 1 ); var floorMaterial = new THREE.MeshBasicMaterial( { map: floorTexture, side: THREE.DoubleSide } ); var floorGeometry = new THREE.PlaneGeometry(1000, 1000, 10, 10); var floor = new THREE.Mesh(floorGeometry, floorMaterial); floor.position.y = -0.5; floor.rotation.x = Math.PI / 2; //scene.add(floor); // SKYBOX/FOG var skyBoxGeometry = new THREE.CubeGeometry( 10000, 10000, 10000 ); var skyBoxMaterial = new THREE.MeshBasicMaterial( { color: 0x9999ff, side: THREE.BackSide } ); var skyBox = new THREE.Mesh( skyBoxGeometry, skyBoxMaterial ); // scene.add(skyBox); scene.fog = new THREE.FogExp2( 0x9999ff, 0.00025 ); //////////// // CUSTOM // //////////// var jsonLoader = new THREE.JSONLoader(); jsonLoader.load( "models/animation_scene.js", addModelToScene ); // addModelToScene function is called back after model has loaded var ambientLight = new THREE.AmbientLight(0x111111); scene.add(ambientLight); } function addModelToScene( geometry, materials ) { // for preparing animation for (var i = 0; i < materials.length; i++) materials[i].morphTargets = true; var material = new THREE.MeshFaceMaterial( materials ); android = new THREE.Mesh( geometry, material ); android.scale.set(10,10,10); scene.add( android ); } function animate() { requestAnimationFrame( animate ); render(); update(); } function update() { if ( keyboard.pressed("z") ) { // do something } controls.update(); stats.update(); } function render() { if ( android ) // exists / is loaded { // Alternate morph targets time = new Date().getTime() % duration; keyframe = Math.floor( time / interpolation ) + animOffset; if ( keyframe != currentKeyframe ) { android.morphTargetInfluences[ lastKeyframe ] = 0; android.morphTargetInfluences[ currentKeyframe ] = 1; android.morphTargetInfluences[ keyframe ] = 0; lastKeyframe = currentKeyframe; currentKeyframe = keyframe; } android.morphTargetInfluences[ keyframe ] = ( time % interpolation ) / interpolation; android.morphTargetInfluences[ lastKeyframe ] = 1 - android.morphTargetInfluences[ keyframe ]; } renderer.render( scene, camera ); } | cs |
'Programming > WebGL(ThreeJS)' 카테고리의 다른 글
[WebGL] Model Animation Control (0) | 2015.08.07 |
---|---|
[WebGL] Tween Animation (0) | 2015.08.07 |
[WebGL] Blender Scene 불러오기 (0) | 2015.08.07 |
[WebGL] Geometry Collada Loader (0) | 2015.08.07 |
[WebGL] GUI Basic (0) | 2015.08.07 |
Comments