物理の授業用教材を作成している高校教員です。
javascript (three.js)の初心者です。3Dのモデルデータ(spring05.json:ばねモデル)をblenderから .json の形式でエクスポートしthree.jsで読み込ませ動かしています。動くことは動くのですが、chromeでエラーを見ると、
Uncaught TypeError: Cannot read property 'scale' of undefined(下から約10行のところです)
と表示されます。そのためか、フルスクリーンや画面のボックスを押しても実行が出来ません。原因は何処にあるのでしょうか。ご教示のほどよろしくお願いします。
<!DOCTYPE html> <html lang="ja"> <head> <title> </title> <meta charset="utf-8"> <script src="three.min.js"></script> </head> <style> body { margin: 0px 0px 0px; padding:0; overflow: hidden; background-color: gray } #info { color: #ccc; text-align: left; position: absolute; top: 0px; width: 50%; padding: 0px; } button, input, select, textarea { margin:0; padding: 0; background-color: #006060; border-style: none; color: white; } </style> <body> <div id="info"> <button id="menu1" style="position:absolute; left:0px;width:80px;font-size :8px">メニュー1</button> <button id="menu2" style="position:absolute; left:100px;width:80px;font-size :8px">メニュー2</button> </div> </body> <script> /////////////////////////////////////////////////////////////////////////////// // var spring,ball,scene,scene2d,camera,camera2d; var wx =1366; var wy =768; var t=0.0; var dt=0.05; // //イベント用 //document.addEventListener( 'mousedown', clickPosition, false ); //document.addEventListener( 'mouseup', clickPosition, false ); window.addEventListener( 'resize', onWindowResize, false ); // //レンダラー var renderer = new THREE.WebGLRenderer(); renderer.setPixelRatio(window.devicePixelRatio); renderer.setSize(wx, wy); //renderer.setSize(1366/4, 768/4); renderer.setClearColor( 0x003d3d, 1 ) renderer.autoClear = false; document.body.appendChild(renderer.domElement); /////////////////////////////////////////////////////////////////////////////// init(); animate(); //////////////////////////////////////////////////////////////////////////////// document.getElementById( 'menu1' ).addEventListener( 'click', function () { dt+=0.02; } ); document.getElementById( 'menu2' ).addEventListener( 'click', function () { dt-=0.02; } ); //画面縦、横の時のリサイズ function onWindowResize() { var orientation = screen.orientation || screen.mozOrientation || screen.msOrientation; if (orientation.type === "portrait-primary" || orientation.type === "portrait-secondary") { /////////////縦向き フルスクリーン解除 if (document.webkitCancelFullScreen) { document.webkitCancelFullScreen(); //Chrome15+, Safari5.1+, Opera15+ } else if (document.mozCancelFullScreen) { document.mozCancelFullScreen(); //FF10+ } else if (document.msExitFullscreen) { document.msExitFullscreen(); //IE11+ } else if(document.cancelFullScreen) { document.cancelFullScreen(); //Gecko:FullScreenAPI仕様 } else if(document.exitFullscreen) { document.exitFullscreen(); // HTML5 Fullscreen API仕様 } wx =innerWidth/2; wy =innerHeight/2; renderer.setPixelRatio(window.devicePixelRatio); renderer.setSize(innerWidth, innerWidth/2); //renderer.setSize(1366, 768); } else { ////////////横向き wx =innerWidth; wy =innerHeight; renderer.setPixelRatio(window.devicePixelRatio); renderer.setSize(innerWidth, innerHeight); //renderer.setSize(screen.width, screen.height); } } //フルスクリーン化 document.body.onclick = function() { var orientation = screen.orientation || screen.mozOrientation || screen.msOrientation; if (orientation.type === "portrait-primary" || orientation.type === "portrait-secondary") { //縦向き //何もしない } else { //横向き フルスクリーンへ if (this.webkitRequestFullScreen) { this.webkitRequestFullScreen(); } else if (this. mozRequestFullScreen) { this. mozRequestFullScreen(); } else { alert("not found") } renderer.setPixelRatio(window.devicePixelRatio); //renderer.setSize(1366, 768); renderer.setSize(innerWidth, innerHeight); } } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// function init() { camera = new THREE.OrthographicCamera(-wx/2, wx/2, wy/2, -wy/2, 0, 10000); //camera = new THREE.PerspectiveCamera(60, wx / wy, 0.001, 1000); camera.position.set(0, 0, 5000); scene = new THREE.Scene(); scene.add(new THREE.AmbientLight(0xffaa00));//環境光 var light = new THREE.DirectionalLight(0xFFFFFF,1); light.position.set(0, 1, 1); scene.add(light); //ばね var loader = new THREE.JSONLoader(); loader.load("spring03.json", loadSlingshot); function loadSlingshot(geometry, materials) { spring = new THREE.Mesh(geometry, materials); spring.position.set(0, 0, 0); spring.scale.set(1, 30,30); scene.add(spring); } //球 camera2d = new THREE.OrthographicCamera(-wx/2, wx/2, wy/2, -wy/2, 0.1, 2000); scene2d = new THREE.Scene(); var texture = new THREE.TextureLoader().load ("g.png"); var material = new THREE.SpriteMaterial( { map: texture } ); ball = new THREE.Sprite( material ); ball.position.set(0, 0, -1); ball.scale.set(80, 80, 1); // scene2d.add(ball); } ///////////////////////////////////////////// function animate() { requestAnimationFrame(animate); t +=dt; //伸び x spring.scale.x = 20.5+7*Math.sin(t);// <----------Uncaught TypeError: Cannot read property 'scale' of undefined //球 ball.position.x=365+111*Math.sin(t); ball.position.y=0; // renderer.clear(); renderer.render(scene, camera); renderer.render(scene2d, camera2d); } ////////////////////////////////////////////////////////////////////////////////////////////////// </script> </html>
回答3件
あなたの回答
tips
プレビュー