2017-08-11 8 views
0

Forge Viewerでは、カスタムハンドラを作成しました。それが結合したダブルクリックして、イベントを発生させたときに、OK働く通常のオブジェクト/メッシュ/材料については、偽のビューアでは、新しいTHREE.Object3Dを追加できますが、ビューアでは選択できません。

const hitTest = this.viewer.clientToWorld(event.canvasX, event.canvasY, true); 

でクリックされたアイテムを計算し、hitTest.dbIdが返された場合に、さらに、hitTest.pointオブジェクトは、3D空間内でクリックした場所を示します。その場所を使ってマテリアル、メッシュ、オブジェクトを作成し、シーンに追加します。 (いくつかの小さなステップはスキップされました)

var material_orange = new THREE.MeshLambertMaterial({color: 0xFEBD17}); 
this.viewer.impl.matman().addMaterial('SBD-Material-' + 'orange', material_orange, true); 
var sphereMesh = 
     new THREE.Mesh(
       new THREE.SphereGeometry(niceRadius, 20), 
       material_orange); 
var sphereModel = new THREE.Object3D(); 
sphereModel.add(sphereMesh); 
sphereModel.position.set(atPoint.x, atPoint.y, atPoint.z); 

this.viewer.impl.scene.add(sphereModel); 
this.viewer.impl.invalidate(true); 

すべては素晴らしいです。球が私のモデルに追加されます。 (それは黒ですが、私はまだ理由を理解できません...)しかし、最大の問題は、私が球をクリックすることができないということです。これをクリックすると、モデル内の基礎となるオブジェクト、通常は壁または床が選択されます。

シーン内のオブジェクトを取得するには、RayTraceメソッドを使用する必要がありますか?またはオブジェクト/メッシュ/マテリアルにクリック可能にするプロパティがありますか?ビューアの更新?

答えて

2

この時点でAutodesk.Viewing.ToolInterfaceを継承し、クリックするロジックをhandleSingleClick関数に入れて所有するツールを作成する必要があります。ここでは、この場合の例である:

  1. カスタムツール:

    class CustomTool extends Autodesk.Viewing.ToolInterface { 
        constructor(viewer) { 
         super(); 
         this._viewer = viewer; 
         this._active = false; 
         this._names = [ 'CustomTool' ]; 
        } 
    
        get viewer() { 
         return this._viewer; 
        } 
    
        isActive() { 
         return this._active; 
        } 
    
        handleSingleClick(event, button) { 
         const _viewer = this.viewer; 
         const intersectObjects = (function() { 
          const pointerVector = new THREE.Vector3(); 
          const pointerDir = new THREE.Vector3(); 
          const ray = new THREE.Raycaster(); 
          const camera = _viewer.impl.camera; 
    
          return function(pointer, objects, recursive) { 
           const rect = _viewer.impl.canvas.getBoundingClientRect(); 
           const x = ((pointer.clientX - rect.left)/rect.width) * 2 - 1; 
           const y = - ((pointer.clientY - rect.top)/rect.height) * 2 + 1; 
    
           if (camera.isPerspective) { 
            pointerVector.set(x, y, 0.5); 
            pointerVector.unproject(camera); 
            ray.set(camera.position, pointerVector.sub(camera.position).normalize()); 
           } else { 
            pointerVector.set(x, y, -1); 
            pointerVector.unproject(camera); 
            pointerDir.set(0, 0, -1); 
            ray.set(pointerVector, pointerDir.transformDirection(camera.matrixWorld)); 
           } 
    
           const intersections = ray.intersectObjects(objects, recursive); 
           return intersections[0] ? intersections[0] : null; 
          }; 
         })(); 
    
         const pointer = event.pointers ? event.pointers[ 0 ] : event; 
         // Intersect objects in the scene 
         const result = intersectObjects(pointer, _viewer.impl.scene.children); 
    
         if(result && result.object) { 
          const mesh = result.object; 
          // Change object color 
          let curColor = mesh.material.color; 
          curColor = (curColor.getHex() == 0xff0000 ? 0x00ff00 : 0xff0000); 
          mesh.material.color.setHex(curColor); 
    
          // Refreah viewport 
          this.viewer.impl.invalidate(false, true, true); 
         } 
    
         return false; 
        } 
    } 
    
  2. ビューア拡張機能は、このカスタムツールを管理:

    class CustomToolExtension extends Autodesk.Viewing.Extension { 
        constructor(viewer, options) { 
         super(viewer, options); 
         this._tool = undefined; 
        } 
    
        load() { 
         // Construct an custom Tool instance 
         this._tool = new CustomTool(this.viewer); 
         // Register custom Tool into viewer.toolController 
         this.viewer.toolController.registerTool(this._tool); 
         // Activate the Tool 
         this.viewer.toolController.activateTool('CustomTool'); 
    
         return true; 
        } 
    
        unload() { 
         // If tool has been activated, deactivate the tool. 
         if(this._tool.isActive()) { 
          this.viewer.toolController.deactivateTool('CustomTool'); 
         } 
         // Deregister custom Tool 
         this.viewer.toolController.deregisterTool(this._tool); 
    
         return true; 
        } 
    } 
    
    Autodesk.Viewing.theExtensionManager.registerExtension('Autodesk.ADN.Sample.CustomToolExtension', CustomToolExtension); 
    

このヘルプを願っています。

関連する問題