tuo-three2的ui拓展接口机制

目前我们准备为tuo-three2项目添加ui拓展接口,以满足未来更多灵活插件的应用。很多计划中的插件,例如visibility, meshInspect, transform, measure等插件都需要向外沿伸出ui接口,用以触发一些事件的发生。例如,visibility需要一个按钮,来触发对被选中物体的可视化调整,meshInspect插件需要好几个按钮,来触发对mesh对象的不同检测方案。transform和measure这类需要对物体做移动,或测量的插件更需要有按钮来触发一些操作。

另一方面,我们还需要tuo-three2的插件能够对ui的内容具备一定的控制能力,所以现在我们需要规范一套与tuo-three2兼容的ui接口机制。

此规范规定与tuo-three2插件相交互的两类接口,第一类需要与TuoView的operations对接。它提供一些工具类型的交互接口,它只支持事件触发型的交互。第二类需要监听TuoView发布的“applyDialog”事件,并且能够根据“applyDialog”发布的窗口类型响应出不同类型的对话窗口。这些对话窗口最终与TuoView中内容的交互也主要是基于tuo-three2的事件机制,由其自由的交互。

基于TuoView.operations的交互机制

  1. 每一个ui接口都与一个TuoView实例所绑定。
  2. ui接口需要能够监听与之所绑定的TuoView实例的‘operationsUpdated’事件(TuoView.addEventListener('operationsUpdated', <uiHandle>)), 当ui接口监听到此事件则触发其对ui界面的一次更新。ui接口的更新方式将会参照此TuoView实例的operations属性。
  3. 我们规定2中提到的TuoView.operations是一个Array对象。这个Array对象中的值有如下两种类型的结构:TuoView.operations = [<TypeA_or_TypeB>, ...]
TypeA:
{
  displayName: String,
  eventType: String,
  icon: <Svg_Url>
}
TypeB:
{
  displayName: String,
  icon: <Svg_Url>,
  sub: [<TypeA_or_TypeB>, ...]
}

4. ui界面需要提供不同的接口让每个TypeA所对应的event被与此ui界面所绑定的TuoView实例触发。 即TuoView.dispatchEvent('event')

基于'applyDialog'事件机制的交互

  1. TuoView会发布如下格式的事件:
TuoView.dispatchEvent({
  type: 'applyDialog',
  payload: {
    dialog: <dialog_type>,
    data: <data_needed_by_dialog>
  }
})

2. 与TuoView绑定的ui模块,需要监听这个消息,并响应这些消息弹出相对应的对话框。如果此对话框,需要触发TuoView的事件,可以自由访问此TuoView的实例,并调用TuoView.dispatchEvent或者TuoView.scene.dispatchEvent函数来发布事件。

selector插件

selector插件负责监听'visibilityChanged',‘hoverObject’, 'unhoverObject', 'clickObject'等消息来管理被选中对象的队列。在综合管理被选中对象队列的时候,它还要负责对被选中的对象的根对象发布"unhover", "hover", "selected", 和"deselected"消息。除此以外,它还能够被使能对被选中的直接对象做视觉属性的设置。

selector还能兼容被合并的对象,支持被合并的对象的拆分选择。

raycaster插件

负责实现射线投射,管理射线投射的目标,精度与时机,并向系统发布相应的通知消息。其发布的消息包括hoverObject, unhoverObject与clickObject。

配置参数

toggleMode: 用来控制触发射线投射算法的时机,它可以取两个值,"move"和"click"。默认值为"move"。此值取"move"的时候,它会在每次鼠标移动时,触发射线投射算法,每次投射算法运算时检测到目标时就会发布"hoverObject"消息,否则,则会发布"unhoverObject"消息。当此值取"click"的时候,射线投射算法只有鼠标发生点击事件时才会被触发。此模式下,如果射线投射算法检测到物体,至少会同时发布"hoverObject"和"clickObject"两个消息,如果在触发之前,hover属性不为空,则还会在触发上两个消息前,还会发布"unhoverObject"消息。如果射线投射算法没有发现物体,则会发布"unhoverObject"消息。

发布消息

hoverObject: hoverObject消息的发布时机会受到toggleMode的配置影响,总体来说,每当触发射线投射算法,如果发现物体则一定会触发一次"hoverObject"消息的发布。

{
type: 'hoverObject',
object: intersectObject
}

unhoverObject: 每当射线投射算法执行完后,如果发现的物体与先前的物体不同,或者是没有发现物体且先前发现过物体(hover !== undefined)则会触发"unhoverObject"消息的发布。

{
type: 'unhoverObject',
object: intersectObject
}

clickObject: 每当发生鼠标点击事件时,必触发此消息的发布,无论在鼠标点击时是否有hover住物体。此消息的发布的内容格式为:

{
type: 'clickObject'
object: intersectObject || undefined,
isCtrl: Bool,
}

tuo-three2项目里程记录

2020年9月16日,项目过时,进入准备废弃的流程,其继承项目tuo-scene启动

2020年7月13日,新增cubic插件,能提供更好的视角导航和提示。

2020年6月26日,重新迭代了wireframe插件,并应用了最新采用的“幻象”机制。

2020年6月23日,重新迭代了transform和meshAnalysis插件,让其适应新的3D辅助对象标准。

2020年6月22日,添加完成了stack插件。

2020年6月19日,添加了transform插件,实现了transform插件中的objectTransform和pointTransform两个功能模块。

2020年6月18日,添加了inspect插件,并实现了ui标准定义的dialog应用。

2020年6月16日,添加了meshAnalysis插件,并为此插件添加“网格点”分析的模块。

2020年6月16日,添加了visibility插件,并引入了operations相关ui标准的应用。

2020年6月13日,添加了objectSelector插件。

2020年5月28日,添加对被合并3D对象的selector, raycaster, overlayOutline等支持。为了提升webgl的性能,将多个3D对象合并是常用的技术手段。而本次tuo-three2对被合并对象的支持,包括区分被合并对象当中的个体。也就是,交互需要拆分,而显示需要合并。本次tuo-three2的升级,能既保证3D合并的显示性能,又能保证3D拆分的交互功能。

2020年4月25日,添加overlayOutline插件。移除了backsideOutline插件

2020年4月24日,对核心模块之一的TuoView模块,引入层的概念。渲染层和控制层分离。以便于更多后处理方案以及图像合成的应用。

2020年4月22日,添加backsideOutline插件。

2020年4月20日 ,添加postprocessing插件,tuo-three2开始能够使用各种后处理特效

2019年12月, 添加adjustor插件,tuo-three2开始能够支持更好的3D交互功能

2019年11月, 添加完成最基本的一些插件和示例程序,这些插件包括trackball, cgEffect, shadowMesh, fakeMirror, selector, anotator, autoShow

2019年10月, 从tuo-three项目提取原始代码,按照全新架构创建tuo-three2项目。创建完成了core模块和plugin系统。

tuo-three2项目简介

tuo-three2是本公司历史最悠久的项目之一,从2017年最开始的react-three-renderer库开始,我们一直在研发更好的库来调用three.js,兼容react,并提供更好的3D建模交互api。项目名称经过了react-three-renderer, tuo-react-three, tuo-three, 直到tuo-three2经过了好几次整体性的迭代(几乎全部推倒重来),tuo-three2的框架才慢慢成形。

如今tuo-three2是一个功能丰富,拓展性很强的一个工程。它包括了一个灵活的插件系统,一个整体上可配置可灵活调整的参数系统,以及自带多种产生酷炫效果的shader库。

围绕tuo-three2我们已经开发了数个功能强大的插件,从相机操作,对象选择,倒影,变形动画,表演动画,动画标注到假阴影,3D调整器等,丰富多样。