如何使用 three.js 向 Forge Viewer 添加文本?

Posted

技术标签:

【中文标题】如何使用 three.js 向 Forge Viewer 添加文本?【英文标题】:How can you add text to the Forge Viewer with three.js? 【发布时间】:2018-06-29 06:16:38 【问题描述】:

所以,我正在尝试使用 Three.js 将 TextGeometry 添加到查看器。我想知道是否有可能做到这一点,以及你将如何去做。

我查看了文档,但自从 Forge 查看器使用 R71 以来,他们的解决方案似乎都没有工作,而现在使用 three.js,他们的解决方案已经远远超过了。我也尝试从 Github 下载 R71 示例,但我收到一个错误消息,说其中一种字体不存在,即使我在 html 中将它们与脚本标签一起包含在内。

那么,您可以将 TextGeometry 添加到查看器吗?如果是这样,谁能给我一个如何做到这一点的例子。

我也考虑过在查看器上放置一个 2D 画布,但由于场景比查看器画布大,它会造成奇怪的设置,我在技术上不确定如何修复。

这样做的目的是能够通过 javascript 向查看器添加文本,这意味着用户将无法控制文本框,脚本将生成它。

【问题讨论】:

【参考方案1】:

即使 Viewer 版本落后,从 Three.js 的更高版本导入功能也相当简单。我使用了threejs-full-es6 包,它只允许从 Three.js 的版本中导入所需的内容,这样你就不会用两个版本的 lib 来膨胀你的应用程序,还可以防止命名空间冲突。目前正在使用 r89,另一个好消息!

这是我创建的一个简单的 ES6 扩展,它包装了 TextGeometry 创建:

import  Font, TextGeometry  from 'threejs-full-es6'
import FontJson from './helvetiker_bold.typeface.json'

export default class TestExtension
  extends Autodesk.Viewing.Extension 

  constructor (viewer, options) 

    super()

    this.viewer = viewer
  

  load () 

    return true
  

  unload () 

    return true
  

  /////////////////////////////////////////////////////////
  // Adds a color material to the viewer
  //
  /////////////////////////////////////////////////////////
  createColorMaterial (color) 

    const material = new THREE.MeshPhongMaterial(
      specular: new THREE.Color(color),
      side: THREE.DoubleSide,
      reflectivity: 0.0,
      color
    )

    const materials = this.viewer.impl.getMaterials()

    materials.addMaterial(
      color.toString(),
      material,
      true)

    return material
  

  /////////////////////////////////////////////////////////
  // Wraps TextGeometry object and adds a new mesh to  
  // the scene
  /////////////////////////////////////////////////////////
  createText (params) 

    const geometry = new TextGeometry(params.text,
      Object.assign(, 
        font: new Font(FontJson),
        params
      ))

    const material = this.createColorMaterial(
      params.color)

    const text = new THREE.Mesh(
      geometry , material)

    text.position.set(
      params.position.x,
      params.position.y,
      params.position.z)

    this.viewer.impl.scene.add(text)

    this.viewer.impl.sceneUpdated(true)
  


Autodesk.Viewing.theExtensionManager.registerExtension(
  'Viewing.Extension.Test', TestExtension)

要使用它,只需加载扩展并调用createText 方法:

import './Viewing.Extension.Test'

// ...

viewer.loadExtension('Viewing.Extension.Test').then((extension) => 

    extension.createText(
      position: x: -150, y: 50, z: 0,
      bevelEnabled: true,
      curveSegments: 24,
      bevelThickness: 1,
      color: 0xFFA500,
      text: 'Forge!',
      bevelSize: 1,
      height: 1,
      size: 1
    )
)

甜! ;)

【讨论】:

这太棒了!我考虑过引入一个更新的版本,但我不确定它是否会起作用。你用什么来转译这段代码?只是好奇,我正在考虑使用 webpack,因为 chrome 似乎不喜欢 ES6 导入。 Webpack + babel-loader,据我所知最灵活/最强大的配置。如果你喜欢 React,我创建了一个 Forge React 锅炉:github.com/Autodesk-Forge/forge-react-boiler.nodejs。这包含了快速开始使用 ES6、Webpack、Babel 和 Forge Viewer 所需的所有设置(你也可以在没有 React 的情况下使用它) 这很好用!我唯一的问题是,当我更改对象中的 size 属性时,它根本不会更改大小。你试过这个吗? 是的,我不确定 TextGeometry 有什么问题,我没有测试普通 r89 three.js 应用程序中的行为是否不同。应该起作用的一件事是设置添加到场景中的网格对象的比例。 更改网格仍然对我不起作用。你会建议回到 R88 的版本吗?

以上是关于如何使用 three.js 向 Forge Viewer 添加文本?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 forge-viewer 中从最新版本的 three.js 添加几何图形?

如何在 Autodesk Forge 中设置天空盒

Autodesk Forge 三个 JS 版本支持 ShapeBufferGeometry

如何使用 THREE.js 向 collada 文件 (.dae) 添加纹理?

在 Autodesk Forge 查看器中的元素下拾取

如何克服 Autodesk Forge Viewer 中的窗口选择限制?