簡體   English   中英

在偽造查看器中,我可以添加一個新的THREE.Object3D,但無法在查看器中選擇它。

[英]In the forge viewer I can add a new THREE.Object3D, but I can't select it in the viewer.

在Forge Viewer中,我編寫了一個自定義處理程序。 它有一個綁定的雙擊事件,當它與該事件一起觸發時,將計算被單擊的項目

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方法獲取場景中的對象? 還是對象/網格/材質具有可單擊的屬性? 觀眾更新?

此時,您必須創建一個繼承自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 ); 

希望能有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM