在Angular中使用Three JS时,很容易出现渲染问题,特别是当尝试使用CSS样式更改画布大小和位置时。如果遇到画布渲染在错误位置的问题,可以尝试以下几种解决方法。
在Component中,可以使用ViewChild获取Canvas元素并设置其大小和位置,如下所示:
import { Component, ViewChild, ElementRef } from '@angular/core';
import * as THREE from 'three';
@Component({
selector: 'app-three-canvas',
template: '',
styleUrls:['./three-canvas.component.css']
})
export class ThreeCanvasComponent {
@ViewChild('canvas') canvasRef: ElementRef;
private scene: THREE.Scene;
private camera: THREE.PerspectiveCamera;
private renderer: THREE.WebGLRenderer;
private mesh: THREE.Mesh;
ngAfterViewInit(): void {
this.init();
this.animate();
}
private init(): void {
const width = this.canvasRef.nativeElement.clientWidth; //获取canvas宽度
const height = this.canvasRef.nativeElement.clientHeight; //获取canvas高度
//创建场景
this.scene = new THREE.Scene();
//创建相机
this.camera = new THREE.PerspectiveCamera(75, width / height, 0.1, 1000);
this.camera.position.z = 5;
//创建网格
const geometry = new THREE.BoxGeometry();
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
this.mesh = new THREE.Mesh(geometry, material);
this.scene.add(this.mesh);
//创建渲染器
this.renderer = new THREE.WebGLRenderer({
canvas: this.canvasRef.nativeElement //注意这里不要再document中获取canvas
});
this.renderer.setSize(width, height);
}
private animate(): void {
requestAnimationFrame(() => this.animate());
this.render();
}
private render(): void {
this.mesh.rotation.x += 0.01;
this.mesh.rotation.y += 0.01;
this.renderer