Je suis nouveau dans le monde three.js ... Ma question est la suivante: Puis-je lier deux formes différentes ensemble comme une forme? Par exemple relier une sphère et un cylindre ensemble?Three.js - lier deux formes ensemble comme une seule?
Répondre
Type, oui, il y a des options multiples:
- via hiérarchie Vous pouvez simplement ajouter une maille à l'autre en utilisant la fonction
add()
- via
merge()
fonction de GeometryUtil fusionner les sommets et les mailles de deux objets Géométrie en un - en utilisant un éditeur 3D de base qui prend en charge les opérations booléennes entre les maillages et l'exportation.
Méthode 1 est assez simple:
var sphere = new THREE.Mesh(new THREE.SphereGeometry(100,16,12),new THREE.MeshLambertMaterial({ color: 0x2D303D, wireframe: true, shading: THREE.FlatShading }));
var cylinder = new THREE.Mesh(new THREE.CylinderGeometry(100, 100, 200, 16, 4, false),new THREE.MeshLambertMaterial({ color: 0x2D303D, wireframe: true, shading: THREE.FlatShading }));
cylinder.position.y = -100;
scene.add(sphere);
scene.add(cylinder);
Notez que 16 est répétée, de sorte que les subdivisions niveau dans une maille correspond à l'autre (pour un look décent)
Méthode 2.1 - via GeometryUtils
//make a sphere
var sg = new THREE.SphereGeometry(100,16,12);
//make cylinder - ideally the segmentation would be similar to predictable results
var cg = new THREE.CylinderGeometry(100, 100, 200, 16, 4, false);
//move vertices down for cylinder, so it maches half the sphere - offset pivot
for(var i = 0 ; i < cg.vertices.length; i++) cg.vertices[i].position.y -= 100;
//merge meshes
THREE.GeometryUtils.merge(sg,cg);
var mesh = new THREE.Mesh(sg,new THREE.MeshLambertMaterial({ color: 0x2D303D, wireframe: true, shading: THREE.FlatShading }));
scene.add(mesh);
Méthode 2.2 fusionner un Lathe half-sphere et un cylindre:
var pts = [];//points array
var detail = .1;//half-circle detail - how many angle increments will be used to generate points
var radius = 100;//radius for half_sphere
var total = Math.PI * .51;
for(var angle = 0.0; angle < total ; angle+= detail)//loop from 0.0 radians to PI (0 - 180 degrees)
pts.push(new THREE.Vector3(0,Math.cos(angle) * radius,Math.sin(angle) * radius));//angle/radius to x,z
var lathe = new THREE.LatheGeometry(pts, 16);//create the lathe with 12 radial repetitions of the profile
//rotate vertices in lathe geometry by 90 degrees
var rx90 = new THREE.Matrix4();
rx90.setRotationFromEuler(new THREE.Vector3(-Math.PI * .5,0,0));
lathe.applyMatrix(rx90);
//make cylinder - ideally the segmentation would be similar for predictable results
var cg = new THREE.CylinderGeometry(100, 100, 200, 16, 4, false);
//move vertices down for cylinder, so it maches half the sphere
for(var i = 0 ; i < cg.vertices.length; i++) cg.vertices[i].position.y -= 100;
//merge meshes
THREE.GeometryUtils.merge(lathe,cg);
var mesh = new THREE.Mesh(lathe, new THREE.MeshLambertMaterial({ color: 0x2D303D, wireframe: true, shading: THREE.FlatShading }));
mesh.position.y = 150;
scene.add(mesh);
Le problème que je ne peux pas résoudre pour le moment vient des faces qui se trouvent à l'intérieur du maillage. Idéalement, les normaux seraient retournés afin qu'ils ne rendent pas, mais n'ont pas trouvé une solution rapide pour cela.
Le 3ème est assez simple. La plupart des packages 3D permettent un fonctionnement booléen sur des maillages (par exemple, fusionner deux maillages avec l'opération ADD (meshA + meshB)). Essayez de créer un cylindre et une sphère dans Blender (gratuit, opensource), qui a déjà un exportateur three.js. Vous pouvez également exporter un fichier .obj des maillages fusionnés à partir de votre éditeur ou choix 3D et utiliser le script convert_obj_three.
Mise à jour
J'ai encore trouvé une autre méthode, ce qui pourrait être plus facile/plus intuitive. Rappelez-vous les opérations booléennes que j'ai mentionnées ci-dessus?
Transforme là-bas est une bibliothèque impressionnante js juste pour ça: Constructive Solid Geometry:
Chandler Prall a écrit quelques fonctions pratiques pour se connecter CSG with three.js. Donc, avec la bibliothèque CSG et la three.js wrapper for it, vous pouvez simplement faire ceci:
var cylinder = THREE.CSG.toCSG(new THREE.CylinderGeometry(100, 100, 200, 16, 4, false),new THREE.Vector3(0,-100,0));
var sphere = THREE.CSG.toCSG(new THREE.SphereGeometry(100,16,12));
var geometry = cylinder.union(sphere);
var mesh = new THREE.Mesh(THREE.CSG.fromCSG(geometry),new THREE.MeshNormalMaterial());
Ce qui vous donne un bon résultat (pas de problème avec des visages supplémentaires/flipping Normales/etc.):
J'ai mis à jour l'emballage pour TROIS.js r62, vous pouvez le trouver ici: https://github.com/kraag22/csg-wrapper
merci beaucoup –
- 1. Lier deux APK ensemble
- 2. Lier deux fichiers .o ensemble
- 3. C# lier deux propriétés ensemble?
- 4. Comment lier deux transactions ensemble?
- 5. Django deux formes distinctes sous une seule page/url
- 6. Comment lier deux propriétés CSS ensemble?
- 7. Three.js - une seule sphère est visible
- 8. Comment lier ces deux fonctions Haskell ensemble?
- 9. Façon simple de lier deux propriétés différentes ensemble?
- 10. Lier deux sources de données dans une seule grille
- 11. Joindre deux tables ensemble dans une seule base de données
- 12. 2 formes en une seule vue Razor
- 13. C# ScatterView, comment lier deux éléments ensemble pour se comporter comme un seul?
- 14. Deux formes, deux modèles, une vue ROR
- 15. Lier ensemble plusieurs classes?
- 16. Lier deux tables ensemble en utilisant has_many AND has_one?
- 17. Est-il possible de traiter deux lignes comme une seule?
- 18. Problème SQLite sélectionnant deux colonnes comme une seule
- 19. C# -combinant deux formes
- 20. Lier 3 requêtes ensemble
- 21. comment puis-je montrer les deux tableaux de deux formes sous une autre forme comme aperçu
- 22. En feuilletant deux formes
- 23. WinForms: Lier des actions ensemble
- 24. Three.js: formes géométriques du même point de vue
- 25. Fusionner deux formes rails
- 26. CheckBox sous deux formes
- 27. Trouver une similarité de deux formes vectorielles
- 28. Java EE: Lier certaines annotations d'intercepteur à une seule
- 29. Rails 5: Deux formes pour un modèle polymorphe sur une seule vue
- 30. Transformer deux requêtes en une seule
Je suis en train d'essayer toutes ces choses, merci pour les réponses! J'ai posé cette question depuis que j'essaie de créer une fleur en 3D avec un nombre de formes et de textures. Mon but de lier les formes, de sorte que je peux faire pivoter et faire glisser toutes les formes de fleurs et pas toutes les formes ensemble comme une seule forme – BorisD
Semble un peu comme [Bonjour HelloFlower app] (http://helloenjoy.com/helloflower/). Dans ce cas, je dirais, avoir un 'container' Object3D vide en haut, et ensuite 'add()' les pétales, le pistil, etc. pour que vous puissiez manipuler le groupe ensemble. Quelque chose comme la 1ère suggestion, mais au lieu d'ajouter directement à la scène, en ajoutant à un conteneur ('scene.add (conteneur); container.add (flowerPartA); container.add (flowerPartB); // etc.») –
Wow ! c'est génial exemple homme ... pas exactement ce que j'essaye de construire mais il y a des choses semblables. Pour les deux derniers jours j'ai eu un bon progrès. J'espère que mon dernier exemple que je vais poster, aidera à débutant dans Three.js pour résoudre des problèmes de plus en plus petits. Mais il y a encore quelques petites choses que je ne connais pas encore ... Comment puis-je créer quelque chose comme la forme d'un cylindre qui commence au point X et se termine par un point Y ... pour l'instant, la seule chose que je peux faire est un cylindre et le faire tourner? – BorisD