Εργασία με το Σενάριο σκηνών
Όλα τα περιεχόμενα 3D στο Aspose.3D FOSS για το TypeScript ζουν μέσα σε ένα Scene Οργανώθηκε ως δέντρο του Node Η κατανόηση αυτής της ιεραρχίας είναι η βάση για την κατασκευή, φόρτωση και επεξεργασία οποιουδήποτε 3D αρχείου.
Εγκατάσταση
Εγκαταστήστε το πακέτο από npm πριν τρέξει οποιοδήποτε κώδικα σε αυτόν τον οδηγό:
asposefoss/3d is not yet published — build from source until it ships. See the project README for build instructions.Εξασφαλίστε την tsconfig.json περιλαμβάνει "module": "commonjs" και "moduleResolution": "node" για την σωστή ανάλυση εισαγωγών υπο-δρόμου.
Σενάριο γραφικών έννοιων
Το γραφείο της σκηνής έχει τρία τρίτα:
| ΘΕΡΑΣ | Κλάση | Ρόλος |
|---|---|---|
| σκηνή | Scene | Κερατόπεδα - Καρδιάς rootNode, animationClips,και assetInfo. |
| ΝΟΔΕ | Node | Μπορεί να έχει παιδικά κόμβα, μια οντότητα, ένα μετασχηματισμό και υλικά. |
| Οντότητα | Mesh, Camera, Light, … | Περιεχόμενο που συνδέεται με ένα κόμβο. Ένα κόμπο φέρνει πάνω από μία οντότητα. |
Η κληρονομική αλυσίδα για τα κύρια κτίρια είναι:
A3DObject
└─ SceneObject
├─ Node (tree structure)
└─ Entity
└─ Geometry
└─ Mesh (polygon geometry)scene.rootNode Δεν το δημιουργείτε με μη αυτόματο τρόπο, δημιουργείστε παιδικά κόμβα κάτω από αυτό.
Βήμα 1: Δημιουργία σκηνής
import { Scene } from '@aspose/3d';
const scene = new Scene();
console.log(scene.rootNode.name); // '' (empty string — the root node is created with no name)
Μια νέα Scene Ξεκινά με ένα κενό κόμβο ρίζας και χωρίς κλιπ animation. δημιουργείτε περιεχόμενο προσθέτοντας παιδικά κόμπες.
Βήμα 2: Προσθέστε παιδικά ντόπια
Χρησιμοποιήστε createChildNode() Η μέθοδος επιστρέφει το νέο δέντρο. Node, ώστε να μπορείτε να αλυσίδα πρόσθετες κλήσεις από οποιοδήποτε επίπεδο:
import { Scene } from '@aspose/3d';
const scene = new Scene();
const parent = scene.rootNode.createChildNode('parent');
const child = parent.createChildNode('child');
console.log(scene.rootNode.childNodes.length); // 1 (parent)
console.log(parent.childNodes.length); // 1 (child)
Τα ονόματα δεν χρειάζεται να είναι μοναδικά, αλλά χρησιμοποιώντας νόημα τα ονομά κάνουν τον κώδικα διασταύρωσης ευκολότερο για αποσπάσεις.
Βήμα 3: Δημιουργήστε ένα Mesh και να ρυθμίσετε τις καμπύλες
Mesh Η πρώτη κατηγορία γεωμετρίας.Προσθήκη των θέσεων του στήθους με την πιέση Vector4 Αξίες μέσα mesh.controlPoints,Στη συνέχεια καλέστε createPolygon() Για να προσδιορίσετε τα πρόσωπα με τον δείκτη vertex:
import { Scene } from '@aspose/3d';
import { Mesh } from '@aspose/3d/entities';
import { Vector4 } from '@aspose/3d/utilities';
const scene = new Scene();
const child = scene.rootNode.createChildNode('parent').createChildNode('child');
const mesh = new Mesh('cube');
mesh.controlPoints.push(new Vector4(0, 0, 0, 1));
mesh.controlPoints.push(new Vector4(1, 0, 0, 1));
mesh.controlPoints.push(new Vector4(1, 1, 0, 1));
mesh.controlPoints.push(new Vector4(0, 1, 0, 1));
mesh.createPolygon(0, 1, 2, 3); // quad face using all four vertices
child.entity = mesh;
console.log(mesh.controlPoints.length); // 4
console.log(mesh.polygonCount); // 1
Vector4 Χρησιμοποιεί ομοιογενείς συντονιστές: το w Το συστατικό είναι 1 Για τις θέσεις και 0 για το δίκτυο των vectors.
Βήμα 4: Εισάγετε μετασχηματισμούς νώτων
Κάθε κόμβος έχει ένα transform Ιδιοκτησία με translation, rotation,και scaling.ΣΕΤΙΔΑ translation να μετακινήσει το κόμβο σε σχέση με τον γονέα του:
import { Scene } from '@aspose/3d';
import { Mesh } from '@aspose/3d/entities';
import { Vector4, Vector3 } from '@aspose/3d/utilities';
const scene = new Scene();
const parent = scene.rootNode.createChildNode('parent');
const child = parent.createChildNode('child');
const mesh = new Mesh('cube');
mesh.controlPoints.push(new Vector4(0, 0, 0, 1));
mesh.controlPoints.push(new Vector4(1, 0, 0, 1));
mesh.controlPoints.push(new Vector4(1, 1, 0, 1));
mesh.controlPoints.push(new Vector4(0, 1, 0, 1));
mesh.createPolygon(0, 1, 2, 3);
child.entity = mesh;
child.transform.translation = new Vector3(2.0, 0.0, 0.0);globalTransform παρέχει τη ματρίκα μετασχηματισμού του κόσμου-διαστήματος (read-only), υπολογισμένη με την συμπίεση όλων των προγόνων μετατροπών.
Βήμα 5: Περνάτε το δέντρο
Γράψτε μια αναδρομική λειτουργία για να επισκεφθείτε κάθε κόμβο. node.entity και node.childNodes Σε κάθε επίπεδο:
function traverse(node: any, depth = 0): void {
const indent = ' '.repeat(depth);
const entityType = node.entity ? node.entity.constructor.name : 'none';
console.log(`${indent}${node.name} [${entityType}]`);
for (const child of node.childNodes) {
traverse(child, depth + 1);
}
}
traverse(scene.rootNode);Για την ιεραρχία που δημιουργήθηκε παραπάνω, η παραγωγή θα είναι:
[none]
parent [none]
child [Mesh]Το όνομα του κόμβου ρίζας είναι μια κενή γραμμή επειδή Scene Δημιουργεί το όνομα χωρίς λόγο.
Πάντα να διατηρείτε την πρόσβαση οντότητας με μηδενικό έλεγχο πριν ρίξετε σε ένα συγκεκριμένο τύπο. όχι κάθε κόμβος φέρει μια ονομασία.
Βήμα 6: Αποθηκεύστε στο GLTF ή GLB
Χρησιμοποιήστε GltfSaveOptions Για να ελέγξετε τη μορφή εξόδου. Set binaryMode = true Να δημιουργήσουμε ένα μοναδικό αυτοσυμπεριλαμβανόμενο .glb Ετικέτες: Αφήστε το false Για το JSON .gltf + .bin Το ζευγάρι του:
import { Scene } from '@aspose/3d';
import { Mesh } from '@aspose/3d/entities';
import { Vector4, Vector3 } from '@aspose/3d/utilities';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';
const scene = new Scene();
const parent = scene.rootNode.createChildNode('parent');
const child = parent.createChildNode('child');
const mesh = new Mesh('cube');
mesh.controlPoints.push(new Vector4(0, 0, 0, 1));
mesh.controlPoints.push(new Vector4(1, 0, 0, 1));
mesh.controlPoints.push(new Vector4(1, 1, 0, 1));
mesh.controlPoints.push(new Vector4(0, 1, 0, 1));
mesh.createPolygon(0, 1, 2, 3);
child.entity = mesh;
child.transform.translation = new Vector3(2.0, 0.0, 0.0);
const saveOpts = new GltfSaveOptions();
saveOpts.binaryMode = true; // write a single .glb file
scene.save('scene.glb', GltfFormat.getInstance(), saveOpts);
console.log('Scene saved to scene.glb');ΠΑΣΟΚ GltfFormat.getInstance() ως το επιχειρηματικό σχήμα, έτσι η βιβλιοθήκη χρησιμοποιεί τον σωστό κωδικοποιητή ανεξάρτητα από την επέκταση αρχείου.
Συμβουλές και βέλτιστες πρακτικές
- Χρησιμοποιήστε
createChildNode()Αντί να χτίζουμεNodeΑμέσως:createChildNode()Αυτόματα συνδέει τη σχέση γονέα-παιδιού και καταγράφει το κόμβο στο δέντρο. - Ελέγξτε
node.entityΠριν από την πρόσβαση σε ιδιότητες οντότητας: πολλοί κόμβοι (ομάδες, οστά, εντομοκράτες) δεν φέρουν οποιαδήποτε οντότητα. πάντα να προστατεύεται με μηδενικό έλεγχο ήinstanceofδοκιμασία . - ΣΕΤΙΔΑ
translationστα παιδικά κόμβα, όχι στις καμπύλες του μαστού:• τροποποιήσειςtransform.translationΕίναι μη καταστροφικό και συνδετικό με γονικές μετασχηματισμούς. - Προτιμώ
binaryMode = trueΓια την GLB:• Μοναδικός.glbΤα αρχεία είναι ευκολότερο να διανεμηθούν, φορτίζονται σε προγράμματα περιήγησης και εισάγονται σε κινητήρες παιχνιδιών από ό, τι το split..gltf+.binΤη μορφή. - Περνάμε μέσω
for...ofΠάνω απόchildNodes:Αποφύγετε την αριθμητική ενσωμάτωση, χρησιμοποιήστε το ιθερό άμεσα για προοδευτική συμβατότητα.
κοινά ζητήματα
| Συμπτώματα | Πιθανόν αιτία | ΦΙΛΕΞΗ |
|---|---|---|
child.entity = mesh Δεν έχει καμία επίδραση στην εξαγωγή. | Οντότητα που αποδίδεται στο λάθος επίπεδο κόμβου | Συστατικά entity στο κόμβο φύλλου, όχι σε ένα κόμμα ομάδας |
node.entity Είναι πάντα null | Μόνο ελέγχοντας rootNode Ο ίδιος | Επαναλάβετε στο node.childNodes; rootNode Συνήθως δεν υπάρχει οντότητα. |
| Μετασχηματισμός που δεν αντανακλάται στον προβολέα GLB | globalTransform Δεν ενημερώθηκε | globalTransform Εξυπηρετείται από την αποθήκευση, η transform.translation Πριν καλέσει scene.save() |
Η ΓΚΠ παράγει ξεχωριστό .bin ΣΙΔΕΑΡ | binaryMode Οι παραλείψεις για false | ΣΕΤΙΔΑ saveOpts.binaryMode = true |
Δείτε επίσης
- Χαρακτηριστικά και λειτουργίες: πλήρης αναφοράς API για όλες τις περιοχές χαρακτηριστικών.
- Στήριξη μορφοποίησης: υποστηριζόμενες μορφές 3D, ικανότητα ανάγνωσης/εγγραφής και επιλογές μορφοποίησης.
- Πώς να δημιουργήσετε ένα 3D Mesh Προγραμματικά