Créez CANNON.RigidBody à partir de THREE.Mesh ou THREE.Geometry

Je crée un objet THREE.Mesh aide d'un objet THREE.JSONLoader comme ceci:

 // Create castle. loader.load('/Meshes/CastleTower.js', function(geometry, materials) { var tmp_material = new THREE.MeshLambertMaterial(); THREE.ColorUtils.adjustHSV(tmp_material.color, 0, 0, 0.9); var castle = new THREE.Mesh(geometry, tmp_material); castle.scale.set(0.2, 0.2, 0.2); castle.rotation.setX(-Math.PI/2); scene.add(castle); }); 

Est-il possible de créer un CANNON.RigidBody partir de l'objet THREE.Mesh ( var castle ) ou THREE.Geometry ( var geometry )? Une autre façon de lire ceci est: Comment faites-vous un THREE.Mesh personnalisé "solide"?

Mettre à jour

J'ai utilisé Blender, créé un nouveau château à partir de boîtes, et l'ai exporté au format Three.js. Si vous définissez la masse à 0 d'une CANNON.Body , elle reste statique. Cela s'est bien passé …

Bien, cela dépend de la précision de la représentation physique de votre modèle. Je ne suis pas très familier avec cannon.js, mais voici quelques options que je connais:

  • Utilisez "computeBoundingBox" et sur votre tour et créez une boîte canon.js avec ces limites
  • Utiliser "computeBoundingSphere" de manière similaire
  • Utiliser la physique pour un maillage concave (c'est-à-dire arbitraire). C'est la manière la plus performante. Cannon.js a un exemple ici: http://schteppe.github.io/cannon.js/demos/bunny.html

Une approche non axée sur le cannon.js serait, par exemple, utiliser Refast. La refonte charge votre fichier .obj pour vous et créez un maillage de navigation selon vos paramètres. Ensuite, vous pouvez vous promener là-bas (absolument génial si vous avez un RTS Birdview comme un jeu, ou des bots en cours d'exécution). Un port javascript retrait peut être trouvé ici: https://github.com/vincent/recast.js

J'espère que cela t'aides!

J'ai eu un problème similaire et j'ai créé les "points" et les "visages" nécessaires (comme décrit dans les docs Cannon) à partir de la THREE.Geometry (appelée geometry ici) avec ces deux fonctions:

 cannonPoints = geometry.vertices.map(function(v) { return new CANNON.Vec3( vx, vy, vz ) }) cannonFaces = geometry.faces.map(function(f) { return [fa, fb, fc] })