วิธีแก้ไขข้อผิดพลาดของโมเดล 3D ใน TypeScript
คู่มือนี้ครอบคลุมข้อผิดพลาดที่พบบ่อยที่สุดเมื่อใช้ @aspose/3d สำหรับ TypeScript และ Node.js พร้อมวิธีแก้ปัญหาที่เป็นประโยชน์สำหรับแต่ละข้อ.
คู่มือแบบขั้นตอนต่อขั้นตอน
ขั้นตอนที่ 1: ตรวจสอบการติดตั้งและเวอร์ชัน
ตรวจสอบว่าคุณใช้เวอร์ชัน Node.js ที่รองรับ (18, 20 หรือ 22) และแพ็กเกจได้ถูกติดตั้งแล้ว:
node --version # Must be v18 or later
npm list @aspose/3d # Should show the installed versionหากไม่พบแพ็กเกจ ให้ติดตั้งใหม่:
npm install @aspose/3dขั้นตอนที่ 2: แก้ไขข้อผิดพลาดการแก้ไขโมดูล
ข้อผิดพลาด: Cannot find module '@aspose/3d/formats/obj'
การนำเข้าตามเส้นทางย่อยต้องการการส่งออกแพ็กเกจของ Node.js 12.7 ขึ้นไป ใน TypeScript ให้ตั้งค่าการแก้ไขโมดูลให้ถูกต้อง:
// tsconfig.json
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"moduleResolution": "node16",
"strict": true
}
}สำหรับโครงการ ESM ให้ใช้ "module": "ES2022" และ "moduleResolution": "bundler".
ขั้นตอนที่ 3: ดีบักฉากว่างหลังจากการโหลด
หาก scene.rootNode.childNodes ว่างเปล่าหลังจาก scene.open():
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const scene = new Scene();
scene.open('model.obj', new ObjLoadOptions());
console.log(`Child nodes: ${scene.rootNode.childNodes.length}`);สาเหตุทั่วไป:
- ตัวเลือกรูปแบบไม่ถูกต้อง: สำหรับ OBJ ให้ส่งผ่านเสมอ
new ObjLoadOptions(). การใช้ตัวเลือกทั่วไปอาจทำให้การตรวจจับรูปแบบล้มเหลว. - เส้นทางไฟล์ไม่ถูกต้อง: ไลบรารีจะโหลดฉากว่างโดยเงียบหากไม่พบไฟล์:
import * as fs from 'fs';
const filePath = 'model.obj';
if (!fs.existsSync(filePath)) {
throw new Error(`File not found: ${filePath}`);
}
const scene = new Scene();
scene.open(filePath, new ObjLoadOptions());- ไฟล์ OBJ ใช้การขึ้นบรรทัดใหม่ที่ไม่เป็นมาตรฐาน: เปิดด้วยโปรแกรมแก้ไขข้อความและตรวจสอบว่าไฟล์ถูกต้อง.
ขั้นตอนที่ 4: แก้ไขปัญหาระบบพิกัด
โมเดลอาจปรากฏว่าหมุน, สะท้อน, หรือสเกลไม่ถูกต้องเนื่องจากความแตกต่างของระบบพิกัดระหว่างรูปแบบไฟล์.
ระบบมือขวา vs ระบบมือซ้าย, Y-up vs Z-up:
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const options = new ObjLoadOptions();
options.flipCoordinateSystem = true; // Swap Y and Z axes
const scene = new Scene();
scene.open('model.obj', options);ปัญหาการสเกล (เช่น STL หน่วยมิลลิเมตร vs glTF หน่วยเมตร):
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const options = new ObjLoadOptions();
options.scale = 0.001; // Convert millimeters to meters
const scene = new Scene();
scene.open('model.obj', options);ขั้นตอนที่ 5: จัดการปัญหาหน่วยความจำกับไฟล์ขนาดใหญ่
สำหรับไฟล์ที่ใหญ่กว่า 100 MB ให้เพิ่มขนาด heap ของ Node.js:
node --max-old-space-size=4096 convert.jsหรือกำหนดค่าใน package.json:
{
"scripts": {
"convert": "node --max-old-space-size=4096 dist/convert.js"
}
}ประมวลผลไฟล์ขนาดใหญ่ทีละไฟล์แทนการทำพร้อมกันเพื่อหลีกเลี่ยงปัญหาหน่วยความจำสูงสุด.
อ้างอิงข้อผิดพลาดทั่วไป
| ข้อผิดพลาด | สาเหตุที่เป็นไปได้ | แก้ไข |
|---|---|---|
Cannot find module '@aspose/3d/formats/obj' | การกำหนดค่าการแก้ไขโมดูล | ตั้งค่า moduleResolution: node16 ใน tsconfig |
scene.rootNode.childNodes เป็นค่าว่าง | ตัวเลือกไม่ถูกต้องหรือไม่พบไฟล์ | ตรวจสอบเส้นทางไฟล์; ส่งค่าที่ถูกต้อง *LoadOptions |
| เรขาคณิตดูเหมือนถูกสะท้อน/พลิกกลับ | ระบบพิกัดไม่ตรงกัน | ตั้งค่า flipCoordinateSystem = true |
| เรขาคณิตดูเหมือนถูกปรับสเกลไม่ถูกต้อง | ความแตกต่างของหน่วยระหว่างรูปแบบ | ตั้งค่า scale ในตัวเลือกการโหลด |
ENOMEM หรือกระบวนการถูกฆ่า | หน่วยความจำไม่เพียงพอสำหรับไฟล์ขนาดใหญ่ | เพิ่ม --max-old-space-size |
ข้อผิดพลาดประเภท TypeScript บน node.entity | ประเภทเอนทิตีกว้าง | ใช้ instanceof Mesh guard |
คำถามที่พบบ่อย
ฉันจะรายงานบั๊กการพาร์สได้อย่างไร?
เปิด issue บน รีโพสิตอรี GitHub พร้อมชื่อฟอร์แมต, ไฟล์ตัวอย่างที่สามารถทำซ้ำได้อย่างน้อยที่สุด, และข้อความแสดงข้อผิดพลาดที่แน่นอน.
ทำไมเมชบางส่วนถึงไม่มีจุดควบคุม (zero control points)?
บางกลุ่ม OBJ กำหนดเฉพาะพิกัดเทกซ์เจอร์หรือเวกเตอร์ปกติโดยไม่มีข้อมูลตำแหน่ง ตรวจสอบ mesh.controlPoints.length > 0 ก่อนทำการประมวลผล.
ไลบรารีจะละเลยข้อผิดพลาดการพาร์สโดยเงียบ ๆ ฉันจะตรวจจับได้อย่างไร?
ห่อ scene.open() ในบล็อก try/catch หากไฟล์มีรูปแบบไม่ถูกต้อง ไลบรารีอาจโยนข้อยกเว้นหรือโหลดฉากบางส่วน:
try {
scene.open('model.obj', new ObjLoadOptions());
} catch (err) {
console.error('Failed to load:', err);
}