我在Angular項目中使用三.js。我想加載一個簡單的.obj文件并將其移動到畫布上。代碼工作正常;但是,我必須在我的animate()-函數中顯式執行空檢查,以查看模型是否已加載。如果不進行空值檢查,控制臺將記錄以下內容:類型錯誤:無法在 TestComponent.animate 上讀取 null 的屬性“位置”(test.component.ts:71)我想這是因為實例引用尚未設置,因為此時 OBJLoader 仍在忙于加載資源。最小可驗證示例:import * as THREE from 'three';import { OBJLoader2 } from 'three/examples/jsm/loaders/OBJLoader2.js';import { MTLLoader } from 'three/examples/jsm/loaders/MTLLoader.js';import { MtlObjBridge } from 'three/examples/jsm/loaders/obj2/bridge/MtlObjBridge.js';@Component({ selector: 'app-test', templateUrl: './test.component.html', styleUrls: ['./test.component.css'],})export class TestComponent implements AfterViewInit { @ViewChild('rendererContainer') rendererContainer: ElementRef; renderer: THREE.WebGLRenderer; scene = null; camera = null; mesh = null; loader = null; female = null; constructor() {} ngAfterViewInit() { this.init(); this.animate(); } init() { this.renderer = new THREE.WebGLRenderer(); this.renderer.setPixelRatio(window.devicePixelRatio); this.renderer.setSize(window.innerWidth, window.innerHeight); this.rendererContainer.nativeElement.appendChild(this.renderer.domElement); this.scene = new THREE.Scene(); this.scene.add(new THREE.AmbientLight(0xffffff)); this.camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 1, 10000 ); this.camera.position.z = 500; this.loader = new OBJLoader2(); new MTLLoader().load('./../../assets/models/female02.mtl', (mtl) => { this.loader.setModelName('female02'); this.loader.setLogging(true, true); this.loader.addMaterials( MtlObjBridge.addMaterialsFromMtlLoader(mtl), true ); this.loader.load( './../../assets/models/female02.obj', (object3d) => { this.female = object3d; this.scene.add(object3d); }, null, null, null ); }); }有沒有更好的方法來操作動畫循環中的對象,而不必每次都執行空檢查?
避免在 Three 中空檢查加載的 .obj 模型.js
守著一只汪
2022-09-02 21:42:47