3d-force-graph 节点标题的行为类似于(单个)可点击 url link

3d-force-graph node caption behave like a (single) clickable url link

我尝试让字幕在点击时表现得像 hyperlinks。 我遵循了堆栈溢出中给出的答案:

Attach link to 3d-force-graph node

但它只适用于双击,标题看起来不像 link(不是下划线),而且只有节点球体是可点击的,而不是节点标题。 总而言之,用户很难分辨它不是 read-only 网络。

那么,有什么方法可以满足这 3 个要求吗?

  1. 单击(短)重定向
  2. link 在节点标题上 (node.id) 而不是在节点球体上
  3. 悬停时样式节点标题(下划线或颜色变化)?

这是我的 html 文件:

<head>
    <script src="//unpkg.com/three"></script>
    <script src="//unpkg.com/three/examples/js/renderers/CSS2DRenderer.js"></script>
    <script src="//unpkg.com/3d-force-graph"></script>
    <!--  <script src="../../dist/3d-force-graph.js"></script>-->
</head>

<body>
    <div id="3d-graph"></div>

    <script>
        const Graph = ForceGraph3D({
            extraRenderers: [new THREE.CSS2DRenderer()]
        })
       (document.getElementById('3d-graph'))
           .jsonUrl('./datasets/data.json')
           .nodeThreeObject(node => {
               const nodeEl = document.createElement('div');
               nodeEl.textContent = node.id;
               nodeEl.style.color = 'white';
               nodeEl.className = 'node-label';
               return new THREE.CSS2DObject(nodeEl);
           })
          .nodeThreeObjectExtend(true)
          .onNodeClick(function(node){
              window.location.href = node.link;
          });
    </script>
</body>

数据集的结构如下:

{
    "nodes": [
        {"id": "Math", "group": 1,"link": "test1.html"},
        {"id": "Algebra", "group": 1,"link": "test2.html"},
         ....
    ],
    "links": [
        {"source": "Math", "target": 'Algebra',"value": "2"},
         ....
    ]
}

为了更改 node.link(node.id 而不是节点球体)的目标,我最后尝试的是使用“node.id”作为 onNodeCLick 函数的参数但后来我得到一个例外。

并且为了设置标题的样式(下划线或颜色变化),我给容器 (".node-label:hover") 添加了 class 并尝试使用 [= 设置样式50=] 但它也不起作用。

对于单击,我完全没有头绪。

感谢您的帮助。

可能有点晚了,但由于我遇到了类似的问题并找到了解决方案(至少对于第二个问题)我想分享它。

所有 CSS2DObejects 都存在于带有样式标签“pointer-events:none”的 div 中。我认为这是启用相机移动所必需的,但会阻止我们与节点进行交互。

为了能够使用指针事件,您需要通过“pointer-events:all”在 CSS2DOBEJCTS 上启用它们。

.nodeThreeObject(node => {
           const nodeEl = document.createElement('div');
           nodeEl.textContent = node.id;
           nodeEl.style.color = 'white';
           nodeEl.style.pointer-events= 'all';
           nodeEl.className = 'node-label';
           nodeEl.addEventListener('pointerdown', event => console.log( event ))

           return new THREE.CSS2DObject(nodeEl);
       })

现在您可以添加事件侦听器,如上所示。