2017-05-06 64 views
0

此代码正常工作,但有一个小错误:没有动画。它绘制一个轴和一个立方体。立方体必须是动画的。我只在控制台中看到“animate”字符串一次。Three.js + TypeScript。为什么只有一次调用动画的方法?

解决方案。这个一个requestAnimationFrame(this.animate.bind(this));https://codepen.io/8Observer8/pen/oWoXyz

/// <reference path="../node_modules/@types/three/index.d.ts" /> 

//import * as THREE from "three"; 
// this line does't work. Error: Cannot find module 'three' from ... 

// https://github.com/pinqy520/three-typescript-starter/blob/master/src/index.ts 

class Game 
{ 
    private _scene: THREE.Scene; 
    //private _canvas: HTMLCanvasElement; 
    private _camera: THREE.PerspectiveCamera; 
    private _renderer: THREE.WebGLRenderer; 
    private _axis: THREE.AxisHelper; 
    private _light: THREE.DirectionalLight; 
    private _light2: THREE.DirectionalLight; 
    private _material: THREE.MeshBasicMaterial; 
    private _box: THREE.Mesh; 

    public constructor() 
    { 
     //this._canvas = <HTMLCanvasElement>document.getElementById(canvasElement); 
     this._scene = new THREE.Scene(); // create the scene 
     // create the camera 
     this._camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000); 
     this._renderer = new THREE.WebGLRenderer(); 
     this._axis = new THREE.AxisHelper(10); // add axis to the scene 
     this._light = new THREE.DirectionalLight(0xffffff, 1.0); // add light1 
     this._light2 = new THREE.DirectionalLight(0xffffff, 1.0); // add light2 
     this._material = new THREE.MeshBasicMaterial({ 
      color: 0xaaaaaa, 
      wireframe: true 
     }); 
     // create a box and add it to the scene 
     this._box = new THREE.Mesh(new THREE.BoxGeometry(1, 1, 1), this._material); 
    } 

    public createScene(): void 
    { 
     // set size 
     this._renderer.setSize(window.innerWidth, window.innerHeight); 
     document.body.appendChild(this._renderer.domElement); // add canvas to dom 
     this._scene.add(this._axis); 
     this._light.position.set(100, 100, 100); 
     this._scene.add(this._light); 
     this._light2.position.set(-100, 100, -100) 
     this._scene.add(this._light2); 
     this._scene.add(this._box) 
     this._box.position.x = 0.5; 
     this._box.rotation.y = 0.5; 

     this._camera.position.x = 5; 
     this._camera.position.y = 5; 
     this._camera.position.z = 5; 

     this._camera.lookAt(this._scene.position); 
    } 

    public animate(): void 
    { 
     requestAnimationFrame(this.animate.bind(this)); 
     this._render(); 
    } 

    private _render(): void 
    { 
     let timer = 0.002 * Date.now(); 
     this._box.position.y = 0.5 + 0.5 * Math.sin(timer); 
     this._box.rotation.x += 0.1; 
     this._renderer.render(this._scene, this._camera); 
    } 
} 

window.onload =() => 
{ 
    let game = new Game(); 
    game.createScene(); 
    game.animate(); 
} 
+0

您从动画方法获取控制台日志多少次? – M98

+0

我只在控制台中看到“animate”字符串一次。 – 8Observer8

+0

你可以试试吗? 'requestAnimationFrame(this.animate());' – M98

回答

-1

解决方案1 ​​requestAnimationFrame(()=>this.animate());

解决方案2requestAnimationFrame(() => {this.animate();});

解决方案3requestAnimationFrame(this.animate.bind(this));https://codepen.io/8Observer8/pen/oWoXyz

/// <reference path="../node_modules/@types/three/index.d.ts" /> 

//import * as THREE from "three"; 
// this line does't work. Error: Cannot find module 'three' from ... 

// https://github.com/pinqy520/three-typescript-starter/blob/master/src/index.ts 

class Game 
{ 
    private _scene: THREE.Scene; 
    //private _canvas: HTMLCanvasElement; 
    private _camera: THREE.PerspectiveCamera; 
    private _renderer: THREE.WebGLRenderer; 
    private _axis: THREE.AxisHelper; 
    private _light: THREE.DirectionalLight; 
    private _light2: THREE.DirectionalLight; 
    private _material: THREE.MeshBasicMaterial; 
    private _box: THREE.Mesh; 

    public constructor() 
    { 
     //this._canvas = <HTMLCanvasElement>document.getElementById(canvasElement); 
     this._scene = new THREE.Scene(); // create the scene 
     // create the camera 
     this._camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000); 
     this._renderer = new THREE.WebGLRenderer(); 
     this._axis = new THREE.AxisHelper(10); // add axis to the scene 
     this._light = new THREE.DirectionalLight(0xffffff, 1.0); // add light1 
     this._light2 = new THREE.DirectionalLight(0xffffff, 1.0); // add light2 
     this._material = new THREE.MeshBasicMaterial({ 
      color: 0xaaaaaa, 
      wireframe: true 
     }); 
     // create a box and add it to the scene 
     this._box = new THREE.Mesh(new THREE.BoxGeometry(1, 1, 1), this._material); 
    } 

    public createScene(): void 
    { 
     // set size 
     this._renderer.setSize(window.innerWidth, window.innerHeight); 
     document.body.appendChild(this._renderer.domElement); // add canvas to dom 
     this._scene.add(this._axis); 
     this._light.position.set(100, 100, 100); 
     this._scene.add(this._light); 
     this._light2.position.set(-100, 100, -100) 
     this._scene.add(this._light2); 
     this._scene.add(this._box) 
     this._box.position.x = 0.5; 
     this._box.rotation.y = 0.5; 

     this._camera.position.x = 5; 
     this._camera.position.y = 5; 
     this._camera.position.z = 5; 

     this._camera.lookAt(this._scene.position); 
    } 

    public animate(): void 
    { 
     requestAnimationFrame(this.animate.bind(this)); 
     this._render(); 
    } 

    private _render(): void 
    { 
     let timer = 0.002 * Date.now(); 
     this._box.position.y = 0.5 + 0.5 * Math.sin(timer); 
     this._box.rotation.x += 0.1; 
     this._renderer.render(this._scene, this._camera); 
    } 
} 

window.onload =() => 
{ 
    let game = new Game(); 
    game.createScene(); 
    game.animate(); 
} 
2

我们谈了意见,我只是写了这个替换该行requestAnimationFrame(() => this.animate);,代码波纹管是你如何让它在打字稿工作,我只是说里面_render其他的console.log看结果。

class Game { 
    public animate() 
    { 
     console.log("animate()"); 
     this._render(); 
     requestAnimationFrame(()=>this.animate()); 

    } 

    private _render(): void 
    { 
     console.log("From _render") 

    } 
} 

let game = new Game(); 
    game.animate(); 

看看在example on Playground并打开控制台,当你运行示例

+0

您的代码对我无效。但它有效,当我替换'requestAnimationFrame(()=> this.animate());'这个:'requestAnimationFrame(()=> {this.animate();});' – 8Observer8

+0

@ 8Observer8它几乎和我一样代码,我的代码有效!我用我的代码编写了一个简单的程序 – M98

+0

是的,它的工作原理!我检查了。抱歉! – 8Observer8

相关问题