【发布时间】:2020-03-13 08:40:48
【问题描述】:
Three.js 由于纹理加载而呈现黑色场景。
我在一个角度组件(角度版本 8)中使用了 three.js。
我正在尝试遵循 rendering Earth in WebGL 上的旧 three.js 教程,该教程现在已弃用 THREE.ImageUtils.loadTexture() 来加载网格材质贴图的纹理。
它对我不起作用,所以我尝试使用现代的THREE.TextureLoader().load()。但是,由于某种原因,它从未对其回调采取行动。
所以我尝试将THREE.TextureLoader().load() 与THREE.LoadingManager() 配对使用。虽然THREE.LoadingManager() 的回调似乎有效,但它仍然只产生一个带有一些光线的黑色场景。
虽然我不熟悉使用 three.js,但 在我看来,我的代码:
- 包括灯光
- 似乎不止一次渲染
- 不会向控制台抛出任何错误
代码:
在我的component.html中:
...
<div #rendererContainer></div>
...
在我的 component.ts 中:
import {Component, OnInit, ViewChild, ElementRef, AfterViewInit} from '@angular/core';
import * as THREE from 'three';
export class MyComponent implements OnInit, AfterViewInit {
@ViewChild('rendererContainer', {static: false}) rendererContainer: ElementRef;
renderer = new THREE.WebGLRenderer();
scene = null;
camera = null;
mesh = null;
earthSurface = new THREE.MeshStandardMaterial({color: 0xaaaaaa});
constructor() {
// scene and camera
this.scene = new THREE.Scene();
this.camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.01, 1000);
this.camera.position.z = 1.5;
// light
this.scene.add(new THREE.AmbientLight(0x333333));
const light = new THREE.DirectionalLight(0xffffff, 1);
light.position.set(5, 3, 5);
this.scene.add(light);
const manager = new THREE.LoadingManager();
const textureLoader = new THREE.TextureLoader(manager);
this.earthSurface.map = textureLoader.load('planet.jpg');
manager.onLoad = () => {
// call back
const geometry = new THREE.SphereGeometry(0.5, 32, 32);
this.mesh = new THREE.Mesh(
geometry,
this.earthSurface
);
this.scene.add(this.mesh);
this.rerender();
console.log(this.earthSurface);
};
}
ngOnInit() {}
ngAfterViewInit() {
this.renderer.setSize(window.innerWidth, window.innerHeight);
this.rendererContainer.nativeElement.appendChild(this.renderer.domElement);
this.animate();
// setInterval(() => {this.rerender();}, 1.5 * 1000);
}
rerender() {
this.renderer.render(this.scene, this.camera);
}
animate() {
this.renderer.render(this.scene, this.camera);
window.requestAnimationFrame(() => this.animate());
}
}
【问题讨论】:
标签: angular typescript three.js