glTF 添加数据属性(extras)

本文探讨了如何在3D模型中使用glTF的extras功能存储OPCUA节点ID等信息,并将其与Three.JS的userData相整合,以及在SolidWorksVisualize、Blender和SketchUp等3D编辑器中添加和编辑extras的支持情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 使用3D 模型作为可视化界面的一个关键是要能够在3D模型中添加额外的数据属性,利用这些数据属性能够与后台的信息模型建立对应关系,例如后台信息模型是opcua 信息模型的话,在3D模型中要能够包含OPC UA 的NodeId,BrowserName  等基本信息。

  glTF 是一种流行的3D 模型的标准,它使用JSON 语言描述3D模型。其中可以包含所谓的extras 。

        另一方面,Three.JS 的object能够包含userData ,也是为了定义数据属性。通过GLTFLoader能够将extras 转换成为Three 的userData。

        网络上介绍glTF的extras和ThreeJS 的userData 都比较零散。自己做了各种尝试,将结果分享给读者。

glTF 2.0 导出的内容

  • Meshes(网 格)

  • Materials 材质(Principled BSDF) and Shadeless (Unlit)

  • Textures纹理

  • Cameras相机

  • Punctual lights准点灯 (point, spot, and directional)

  • Extensions扩展 (listed below)

  • Extras附加功能 (custom properties自定义属性)

  • Animation动画 (keyframe, shape key, and skinning关键帧、形状关键帧和外观)

glTF extras 数据的插入

   我尝试使用solidworks visualize 导出glTF 。但是,在solidworks visualize 没有插入extras 的方法。而且objects 的名称是渲染的名称(例如blue high gloss plastic)。这是难以使用的。

于是我尝试在glTF 的JSON 文档中手工插入extras。每一个mesh都对应Three 的object ,所以,每个mesh 中都应该添加extras.

extras 的json格式

"extras": {
"opc":{
"BrowserName":"Cube1" 
}
}

 注意,他不能定义为:

"extras": {"BrowserName":"Cube1" }

extras 中的成员是对象。 

glTF 中extras 的定义(mesh)


"nodes" : [
    {
      "mesh" : 0,
      "extras": {
          "opc": { 
              "BrowserName": "Cube1"
          }
      }
    }
  ],

也可以使用Three editor 在线编辑器添加

https://threejs.org/editor/

在Three 中定义object 的userData

在下面的代码中,为地板添加的userData,格式与extras 类似

 var plane = new THREE.Mesh(planeGeometry,planeMaterial);
 plane.name="Ground"
 plane.userData={
   opc:{
     BrowserName:"Plane"
   }
 }

 scene.add(plane);

 点击对象,显示userData

function onClick() {
  event.preventDefault();
  const mouse = new THREE.Vector2();
  const rect = screenDom.value.getBoundingClientRect()
  mouse.x = ((event.clientX+rect.left) / window.innerWidth) * 2 - 1;
  mouse.y = -((event.clientY+rect.top)/ window.innerHeight) * 2 + 1;
  console.log("x:"+mouse.x,"y:"+mouse.y);
  const raycaster = new THREE.Raycaster();
  raycaster.setFromCamera(mouse, camera);
  var intersects = raycaster.intersectObjects(scene.children,true); //
  if (intersects.length > 0) {
    var selectedObject = intersects[0];
  SelectObject.value.innerHTML=selectedObject.object.userData.opc.BrowserName
    console.log(selectedObject.object.userData)

selectedObject.object.userData.opc.BrowserName 引用了opc 中的BrowserName值。SelectObject.value.innerHTML是网页<div >

结束语

   哪一个glTF 编辑器(sketchups,blender)支持extras 的添加和编辑呢?有了解的读者请推荐。

遗憾的是solidworks 没有这一功能 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值