2017-04-19 1 views
0

Est-il possible de projeter des rayons depuis la caméra et de savoir si elle croise le modèle? Sur la même note, est-il possible de calculer ainsi les distances aux points d'intersection? Je veux cela afin que je puisse savoir par programme si un mur a une fenêtre ou est plat, s'il a une fenêtre alors il y aura un saut dans les distances des intersections.Rectangle se croisant avec le modèle

Répondre

1

Est-il possible de lancer des rayons de la caméra et du savoir si elle croise le modèle? Il y a plusieurs options que vous pouvez utiliser:

Si vous voulez recouper quoi que ce soit, vous pouvez utiliser la visionneuse intégrée api let posClientCoords = new THREE.Vector3(x, y, 1.0) let result =this.viewer.utilities.viewerImpl.hitTestViewport(posClientCoords , false); if (result !== null && result.fragId >= 0) { // here you go }

Si vous préférez ray jeté une sélection d'objets, vous pouvez utiliser le raycaster Three.js let vray =new THREE.Vector3(ptarget.x - psource.x, ptarget.y - psource.y, ptarget.z - psource.z) vray.normalize() let ray =new THREE.Raycaster(psource, vray, 0, max_dist) let intersectResults = ray.intersectObjects (wallMeshes, true)

wallMeshes est un tableau de graphiques proxy que vous obtenez de la visionneuse viewer.impl.getRenderProxy(viewer.model, fragId), null, null, null)

Sur la même note, est-il possible de calculer les distances aux points d'intersection de cette façon? Chacun de ces API renvoie le point de succès (point d'intersection entre le rayon et l'objet)

Un exemple est affiché here

+0

Qu'est-ce que 'posClientCoords'? La direction du rayon? – shinzou

+0

En outre, comment puis-je obtenir le fragid pertinent pour 'viewer.impl.getRenderProxy' sans cliquer sur un noeud? – shinzou

+0

Jetez un coup d'oeil [ici] (https://github.com/Autodesk-Forge/forge-rcdb.nodejs/blob/master/src/client/viewer.components/Viewer.Extensions/Viewing.Extension.Fader/Viewing. Extension.Fader.Core.js # L201) - posClientCoords est la position de la souris de la toile, et hitTest vous donnera le dbId et fragId. – cyrille

1

C'est absolument le cas. Voici un exemple, ForgeFader, ce qui démontre exactement ce que vous demandez:

http://thebuildingcoder.typepad.com/blog/2017/04/work-half-aks-opener-rvtfader-and-forgefader.html#9

Source sur GitHub:

https://github.com/jeremytammik/forgefader

+0

Est-ce tient toutes les mailles du modèle en mémoire? https://github.com/Autodesk-Forge/forge-rcdb.nodejs/blob/master/src/client/viewer.components/Viewer.Extensions/Viewing.Extension.Fader/Viewing.Extension.Fader.Core.js# L309 Est-ce qu'il y a un moyen d'obtenir les distances sans faire ça? – shinzou