วิธีแก้ไขข้อผิดพลาดของโมเดล 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"
}
}ประมวลผลไฟล์ขนาดใหญ่ทีละไฟล์แทนการทำงานแบบขนานเพื่อหลีกเลี่ยงปัญหาหน่วยความจำสูงสุด.
อ้างอิงข้อผิดพลาดทั่วไป
| Error | Likely Cause | Fix |
|---|---|---|
Cannot find module '@aspose/3d/formats/obj' | การกำหนดค่าการแก้ไขโมดูล | ตั้งค่า moduleResolution: node16 ใน tsconfig |
scene.rootNode.childNodes ว่าง | ตัวเลือกไม่ถูกต้องหรือไม่พบไฟล์ | ตรวจสอบเส้นทางไฟล์; ส่งค่า *LoadOptions ที่ถูกต้อง |
| Geometry appears mirrored/flipped | ระบบพิกัดไม่ตรงกัน | ตั้งค่า flipCoordinateSystem = true |
| Geometry appears scaled incorrectly | ความแตกต่างของหน่วยระหว่างรูปแบบ | ตั้งค่า scale ในตัวเลือกการโหลด |
ENOMEM หรือกระบวนการถูกฆ่า | หน่วยความจำไม่เพียงพอสำหรับไฟล์ขนาดใหญ่ | เพิ่ม --max-old-space-size |
TypeScript type error on node.entity | ประเภทเอนทิตี้กว้าง | ใช้การตรวจสอบ instanceof Mesh |
คำถามที่พบบ่อย
ฉันจะรายงานบั๊กการพาร์เซอย่างไร?
เปิด issue บน GitHub repository พร้อมชื่อฟอร์แมต, ไฟล์ตัวอย่างที่ทำซ้ำได้อย่างน้อยที่สุด, และข้อความข้อผิดพลาดที่ตรงกัน.
ทำไมเมชบางอันถึงไม่มีจุดควบคุมเลย?
บางกลุ่ม OBJ กำหนดเฉพาะพิกัดพื้นผิวหรือเวกเตอร์ปกติโดยไม่มีข้อมูลตำแหน่ง ตรวจสอบ mesh.controlPoints.length > 0 ก่อนทำการประมวลผล.
ไลบรารีจะละเลยข้อผิดพลาดการพาร์สโดยเงียบ ๆ ฉันจะตรวจจับได้อย่างไร?
ห่อ scene.open() ไว้ในบล็อก try/catch. หากไฟล์มีรูปแบบไม่ถูกต้อง ไลบรารีอาจโยนข้อยกเว้นหรือโหลดฉากบางส่วน:
try {
scene.open('model.obj', new ObjLoadOptions());
} catch (err) {
console.error('Failed to load:', err);
}