כיצד לבנות רשת תלת‑ממדית באופן תכנותי ב‑TypeScript
Aspose.3D FOSS for TypeScript מאפשר לך לבנות גאומטריה תלת‑ממדית לחלוטין בקוד ללא טעינת קובץ. אתה מגדיר את מיקומי הקודקודים כנקודות בקרה, מציין את משטחי הפוליגון לפי אינדקס, ומצמיד אלמנטים אופציונליים לקודקוד כגון נורמליות, UVs, או צבעי קודקוד. התוצאה ניתנת לשמירה בכל פורמט שניתן לכתיבה: glTF, GLB, STL, FBX, או COLLADA.
דרישות קדם
- Node.js 18 או גרסה מאוחרת יותר
- TypeScript 5.0 או גרסה מאוחרת יותר
@aspose/3dמותקן (ראה שלב 1)
מדריך שלב‑אחר‑שלב
שלב 1: התקן @aspose/3d
npm install @aspose/3dאין צורך בתוספים מקומיים או בספריות מערכת. החבילה כוללת הגדרות סוגים של TypeScript.
מינימום tsconfig.json:
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"moduleResolution": "node",
"esModuleInterop": true,
"strict": true
}
}שלב 2: צור סצנה וצומת
A Scene הוא המכולה ברמת העליון. כל הגאומטריה חייבת להיות מצורפת ל-Node בתוך עץ הסצנה:
import { Scene } from '@aspose/3d';
const scene = new Scene();
const node = scene.rootNode.createChildNode('triangle');createChildNode(name) יוצר צומת בעל שם ומחבר אותו כצאצא של הצומת הנוכחי. האובייקט Node המוחזר הוא המקום שבו תצמיד את הרשת בשלב 7.
שלב 3: צור Mesh Object
Mesh מחזיק מיקומי קודקודים והגדרות פוליגון. צור אחד עם שם אופציונלי:
import { Mesh } from '@aspose/3d/entities';
const mesh = new Mesh('triangle');הרשת מתחילה ריקה: אין קודקודים ואין פאות. אתה מוסיף אותם בשלבים הבאים.
שלב 4: הוסף נקודות שליטה (קודקודים)
נקודות הבקרה הן מיקומי הקודקוד במרחב המקומי.
הדחף ערכי Vector4 אל mesh.controlPoints.
הרכיב הרביעי (w) הוא 1 עבור מיקומים:
import { Vector4 } from '@aspose/3d/utilities';
mesh.controlPoints.push(new Vector4(0.0, 0.0, 0.0, 1.0)); // index 0
mesh.controlPoints.push(new Vector4(1.0, 0.0, 0.0, 1.0)); // index 1
mesh.controlPoints.push(new Vector4(0.5, 1.0, 0.0, 1.0)); // index 2
אתה מתייחס למיקומים אלה לפי האינדקס שמתחיל מאפס כאשר מגדיר פאות פוליגון.
שלב 5: יצירת פאות פוליגון
createPolygon() מגדיר פנים על‑ידי רשימת אינדקסי הקודקודים בסדר. שלושה אינדקסים יוצרים משולש:
mesh.createPolygon(0, 1, 2);אתה יכול גם להגדיר קוודרנטים (ארבע אינדקסים) או פוליגונים שרירותיים עבור פורמטים שתומכים בהם. עבור glTF, הספרייה תבצע טריאנגולציה אוטומטית של קוודרנטים ו‑n‑גונים ביצוא.
שלב 6: הוסף נורמות קודקוד
נורמליות משפרות את איכות הרינדור. השתמש בmesh.createElement() כדי ליצור VertexElementNormal, אסוף וקטורי נורמל למערך, ואז קרא לsetData() כדי לאחסן אותם. המקבל data מחזיר עותק מגן — הוספה אליו לא משפיעה. השתמש בFVector3 (float ברמת דיוק יחיד) לנתוני נורמל, ולא בVector4.
import { VertexElementNormal } from '@aspose/3d/entities';
import { VertexElementType, MappingMode, ReferenceMode } from '@aspose/3d/entities';
import { FVector3 } from '@aspose/3d/utilities';
const normals = mesh.createElement(
VertexElementType.NORMAL,
MappingMode.CONTROL_POINT,
ReferenceMode.DIRECT
) as VertexElementNormal;
// Build the normal array, then call setData() — do NOT push to normals.data
normals.setData([
new FVector3(0, 0, 1), // normal for vertex 0 (pointing +Z)
new FVector3(0, 0, 1), // normal for vertex 1
new FVector3(0, 0, 1), // normal for vertex 2
]);MappingMode.CONTROL_POINT משמעותו נורמל אחד לכל קודקוד. ReferenceMode.DIRECT משמעותו שמערך הנתונים מאונדקס ישירות לפי אינדקס קודקוד הפוליגון.
שלב 7: צרף את ה‑Mesh ושמור ל‑glTF
הקצה את הרשת לצומת דרך node.entity, ואז שמור את הסצנה:
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';
node.entity = mesh;
const saveOpts = new GltfSaveOptions();
scene.save('triangle.gltf', GltfFormat.getInstance(), saveOpts);
console.log('Triangle mesh saved to triangle.gltf');כדי ליצור קובץ .glb יחיד וכולל את כל המרכיבים, הגדר saveOpts.binaryMode = true ושנה את סיומת קובץ הפלט ל.glb.
דוגמה מלאה
הנה הסקריפט המלא המשלב את כל השלבים שלמעלה:
import { Scene } from '@aspose/3d';
import { Mesh, VertexElementNormal } from '@aspose/3d/entities';
import { VertexElementType, MappingMode, ReferenceMode } from '@aspose/3d/entities';
import { Vector4, FVector3 } from '@aspose/3d/utilities';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';
const scene = new Scene();
const node = scene.rootNode.createChildNode('triangle');
const mesh = new Mesh('triangle');
mesh.controlPoints.push(new Vector4(0.0, 0.0, 0.0, 1.0));
mesh.controlPoints.push(new Vector4(1.0, 0.0, 0.0, 1.0));
mesh.controlPoints.push(new Vector4(0.5, 1.0, 0.0, 1.0));
mesh.createPolygon(0, 1, 2);
const normals = mesh.createElement(
VertexElementType.NORMAL,
MappingMode.CONTROL_POINT,
ReferenceMode.DIRECT
) as VertexElementNormal;
// setData() is the correct API — normals.data returns a defensive copy; pushing to it has no effect
normals.setData([
new FVector3(0, 0, 1),
new FVector3(0, 0, 1),
new FVector3(0, 0, 1),
]);
node.entity = mesh;
const saveOpts = new GltfSaveOptions();
scene.save('triangle.gltf', GltfFormat.getInstance(), saveOpts);
console.log('Triangle mesh saved to triangle.gltf');הפעל עם ts-node:
npx ts-node triangle.tsבעיות נפוצות
| Issue | Cause | Fix |
|---|---|---|
mesh.controlPoints.length הוא 0 לאחר push | רשת (Mesh) אינה מקושרת לאף צומת | בצע push לפני הקצאת node.entity; הסדר אינו חשוב, אך יש לוודא את ההפניה |
| הייצוא מייצר גאומטריה ריקה | node.entity לא הוקצה | ודא node.entity = mesh לפני קריאה ל-scene.save() |
| חוסר התאמה במספר הנורמליים | המערך שהועבר ל-setData() קצר מ-controlPoints | הוסף ערך FVector3 אחד לכל נקודת שליטה בעת שימוש ב-MappingMode.CONTROL_POINT |
| הצופה glTF מציג רשת שחורה | הנורמליים מצביעים פנימה | הפוך את סדר הרוחב ב-createPolygon (למשל, 0, 2, 1) או הפוך את וקטורי הנורמליים |
| TypeScript: מאפיין ’normals.data’ לא נמצא | נתיב ייבוא שגוי | ייבא את VertexElementNormal מ-@aspose/3d/entities, ולא משורש @aspose/3d |
שאלות נפוצות
האם ניתן ליצור קוואדים במקום משולשים?
כן. העבר ארבע אינדקסים לcreatePolygon(0, 1, 2, 3). הספרייה מממשת קוואדים למשולשים במהלך הייצוא לפורמטים הדורשים משולשים (glTF, STL).
מה ההבדל בין MappingMode.CONTROL_POINT ל-MappingMode.POLYGON_VERTEX?CONTROL_POINT מאחסן ערך אחד לכל קודקוד ייחודי. POLYGON_VERTEX מאחסן ערך אחד לכל זוג פוליגון‑קודקוד, מה שמאפשר נורמליים שונים באותו קודקוד כאשר הוא שייך למספר פוליגונים (קצוות קשים).
האם עליי לבצע טריאנגולציה של הרשת לפני שמירתה ל‑STL?
לא. הספרייה מטפלת בטריאנגולציה אוטומטית בעת יצוא לפורמטים הדורשים משולשים. ניתן להגדיר קוודרנטים ו‑n‑גונים ברשת ולשמור ישירות ל‑STL.
איך מוסיפים קואורדינטות UV?
השתמשו mesh.createElementUV(TextureMapping.Diffuse, MappingMode.CONTROL_POINT, ReferenceMode.DIRECT) כדי ליצור VertexElementUV, ואז קראו ל-setData([...]) עם מערך של ערכי FVector2 או FVector3 — אחד לכל נקודת שליטה. המקבל data מחזיר עותק; אל תדחפו אליו ישירות.
האם אני יכול לבנות רשתות מרובות בסצנה אחת?
כן. צור מספר צמתים תחת scene.rootNode והקצה Mesh נפרד לכל תכונת entity של הצומת.