亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

避免在 Three 中空檢查加載的 .obj 模型.js

避免在 Three 中空檢查加載的 .obj 模型.js

守著一只汪 2022-09-02 21:42:47
我在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      );    });  }有沒有更好的方法來操作動畫循環中的對象,而不必每次都執行空檢查?
查看完整描述

2 回答

?
UYOU

TA貢獻1878條經驗 獲得超4個贊

一種解決方案是在加載模型后立即開始動畫處理。這意味著在將模型添加到場景后立即調用回調。animate()onLoad()



查看完整回答
反對 回復 2022-09-02
?
Smart貓小萌

TA貢獻1911條經驗 獲得超7個贊

如果需要在加載任何內容之前觸發動畫循環,另一種方法是將引用替換為虛擬對象:


const nullObject= new Object3D()

let female = nullObject

let male = nullObject

let child = nullObject


//...

function onLoad( trueObject ) {

  female = trueObject

}

這樣,您可以期望存在所有方法和成員,但它們將是noops。


查看完整回答
反對 回復 2022-09-02
  • 2 回答
  • 0 關注
  • 131 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號