如何显示覆盖在 3D 模型上的球体对象的鼠标单击事件的弹出数据(使用 Autodesk Forge)

How to display a pop up data on mouse click event for the sphere objects which is overlayed on the 3D model(using Autodesk forge)

我创建了一个项目来在查看器中显示 3d 模型(使用 Autodesk forge)。在它之上,我添加了一个场景来显示两个球体对象,如 image 中所示 我想为球体对象添加鼠标单击事件——单击球体对象时,我需要弹出数据。作为初学者,我卡在了叠加场景的这个点击事件中。这是我项目的githublink供参考(https://github.com/vennilabalaraman/SphereClick)。如果我为此找到解决方案,那将很有帮助。提前致谢。 这是我的 javascript 和 html 代码

let viewer = null;

function setupViewer(divId, documentId, tokenFetchingUrl, exrtensionArray, AccessToken) {
    console.log('Entered setupViewer');
    let options = {
        env: 'AutodeskProduction',
        getAccessToken: (onGetAccessToken) => {
            fetch(tokenFetchingUrl)
                .then(response => response.json())
                .then(data => {
                    let accessToken = AccessToken;
                    let expireTimeSeconds = data["expires_in"];
                    onGetAccessToken(accessToken, expireTimeSeconds);
                })
        }
    };

    var config3d = {extensions: exrtensionArray};
    Autodesk.Viewing.Initializer(options, () => {
        viewer = new Autodesk.Viewing.GuiViewer3D(document.getElementById(divId), config3d);
        viewer.addEventListener(Autodesk.Viewing.GEOMETRY_LOADED_EVENT,()=>{
     //Create Custom Geometry
     //alert("Under Custom Geom");
     var geom = new THREE.SphereGeometry(0.05, 4, 5);
     var material = new THREE.MeshBasicMaterial({ color: 0xFF0000 });
     var sphereMesh = new THREE.Mesh(geom, material);
     var sphereMesh1 = new THREE.Mesh(geom, material);
     //sphereMesh1.position.set(11, 10, 30);
        sphereMesh.position.x = -5; sphereMesh.position.y = -0.8; sphereMesh.position.z = 1.8;
     sphereMesh1.position.x = -3.5; sphereMesh1.position.y = -1.5; sphereMesh1.position.z = 1.8;
     //Create Overlay scene

     if (!viewer.overlays.hasScene('my_scene')) {
      viewer.overlays.addScene('my_scene');
        }
        viewer.overlays.addMesh([sphereMesh], 'my_scene');
        viewer.overlays.addMesh([sphereMesh1], 'my_scene');
    });
        viewer.start();
        Autodesk.Viewing.Document.load(documentId, onDocumentLoadSuccess, onDocumentLoadFailure);
      });

      function onDocumentLoadSuccess(doc) {
        var viewables = doc.getRoot().getDefaultGeometry();
        viewer.loadDocumentNode(doc, viewables).then(i => {
          // documented loaded, any action?
        });
      }
      
      function onDocumentLoadFailure(viewerErrorCode) {
        console.error('onDocumentLoadFailure() - errorCode:' + viewerErrorCode);
      }
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Example</title>
    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=no"/>
    <meta charset="UTF-8">

    <!-- Autodesk Forge Viewer files -->
    <link rel="stylesheet" href="https://developer.api.autodesk.com/modelderivative/v2/viewers/7.*/style.min.css" type="text/css">
    <script src="https://developer.api.autodesk.com/modelderivative/v2/viewers/7.*/viewer3D.min.js"></script>


    <!-- Developer CSS -->
    <link rel="stylesheet" href="./assets/css/main.css"/>
    <!-- Developer JS -->
    <script src="app.js"></script>
    <script src="./assets/js/extensions/markupExt.js"></script>

</head>

<body>
    <div id="MyViewerDiv"></div>
    <script>
        let divId = "MyViewerDiv";
        let documentId = 'urn:dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6bmlzaGFudF90ZXN0Ml8yMDIwXzA0XzMvZ2F0ZWhvdXNlLm53ZA';
        let tokenFetchingUrl = "https://9irt90dm6j.execute-api.us-east-1.amazonaws.com/prod";
        let extensionArray = ['MarkUp3DExtension'];
        let AccessToken = "";
        setupViewer(divId, documentId, tokenFetchingUrl, extensionArray, AccessToken);
    </script>
</body>
</html>

我没有使用 A​​utodesk Forge 的经验,但使用 Three.js 的经验很多。所以在高层次上你需要:

  1. 订阅 MyViewerDivclick 事件。
  2. 对场景执行光线投射以拾取鼠标光标下方的对象:offial docs, another tutorial
  3. 如果有交集,请使用专用库显示弹出窗口。讨论了一些 in this question

我建议尝试最新的 SceneBuilder API Viewer - 您将能够附加自己的几何图形并享受气泡视图(文档模型)开箱即用的所有功能例如选择、突出显示(翻转)和使用您自己的几何图形隔离等...

const sphereGeometry = new THREE.BufferGeometry().fromGeometry(new THREE.SphereGeometry(5, 8, 8));
const sphereMaterial = new THREE.MeshPhongMaterial({ color: new THREE.Color(0, 1, 0) });
const sphereTransform = new THREE.Matrix4().compose(
  new THREE.Vector3(0, 0, 0),
  new THREE.Quaternion(0, 0, 0, 1),
  new THREE.Vector3(1, 1, 1)
);
const sphereFragId = modelBuilder.addFragment(sphereGeometry, sphereMaterial, sphereTransform);
modelBuilder.changeFragmentsDbId(sphereFragId, 12345); // Use this dbId in Viewer APIs as usual

请参阅本教程here 开始......