我正在尝试在 Ionic 2 应用程序中使用 ThreeJS 实现非常基本的动画。基本上是尝试旋转一个立方体。但立方体没有旋转,因为 requestAnimationFrame 仅在渲染循环内执行一次。
I'm able to see only this.
没有旋转动画。我在下面分享我的代码。
首页.html
<ion-header>
<ion-navbar>
<ion-title>
Ionic Blank
</ion-title>
</ion-navbar>
</ion-header>
<ion-content>
<div #webgloutput></div>
</ion-content>
home.ts
import { Component, ViewChild, ElementRef } from '@angular/core';
import { NavController } from 'ionic-angular';
import * as THREE from 'three';
@Component({
selector: 'page-home',
templateUrl: 'home.html'
})
export class HomePage {
@ViewChild('webgloutput') webgloutput: ElementRef;
private renderer: any;
private scene: any;
private camera: any;
private cube: any;
constructor(public navCtrl: NavController) {
}
ngOnInit() {
this.initThree();
}
initThree() {
this.scene = new THREE.Scene();
this.camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
this.renderer = new THREE.WebGLRenderer();
this.renderer.setSize( window.innerWidth, window.innerHeight );
this.webgloutput.nativeElement.appendChild(this.renderer.domElement);
let geometry = new THREE.BoxGeometry(1, 1, 1);
let material = new THREE.MeshBasicMaterial({ color: 0x00ff00});
this.cube = new THREE.Mesh(geometry, material);
this.scene.add(this.cube);
this.camera.position.z = 5;
this.render();
}
render() {
console.log("render called");
requestAnimationFrame(() => this.render);
this.cube.rotation.x += 0.5;
this.cube.rotation.y += 0.5;
this.renderer.render(this.scene, this.camera);
}
}
问题是您没有正确调用 requestAnimationFrame。您不是直接将渲染函数传递给它,而是传递一个箭头函数returns渲染函数。
换线requestAnimationFrame(() => this.render);
to requestAnimationFrame(this.render);
但是,当使用类方法作为回调(作为参数)时,将不再使用相同的方法调用它this
参考。在 MDN 上阅读有关此内容的更多信息 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this。在你的情况下,“这个”在render
方法将变成undefined
当被调用时requestAnimationFrame
导致错误消息TypeError: Cannot read property 'render' of undefined
。有有多种方法可以避免这种行为 https://stackoverflow.com/questions/4011793/this-is-undefined-in-javascript-class-methods,但我认为最简单的是显式绑定 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Function/bind渲染方法正确this
:
requestAnimationFrame(this.render.bind(this));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)