tuo-three2引入幻象概念

基于好几种客观存在的需求,我们有必要对3D对象的可视性做一个重新定义。用以区分渲染层面上的可视性和应用上的可视性。例如,当我们引入“渲染代理”概念的时候,当使用“替代3D辅助对象“的时候,我们都需要将主3D对象设置为“不可见”。但对于其它操作,却都是可见的,因为此时此刻的该对象可能有了一个“代理”,有了一个“替身”,或者说“幻象”。我们出于各种目的,给一个3D对象设置了“幻象”。这有可能是为了节省渲染资源,有可能为了突出该对象的某个方式的渲染特效(例如动态变形,实体线框),这时候,它的“幻象”就是用户真正看到的图像。

“幻象”的实现方式类似“3D辅助对象”,相比于“3D辅助对象”,它主要是应用场景不一样。“3D辅助对象”主要是附加在3D主对象上,而“幻象”是替换掉了3D主对象来执行渲染运算。“幻象”对象的设计规范相比于“3D辅助对象”多出来几条规定。

3D渲染代理(幻象)对象设计规范

  1. 所有幻象对象都会配置一个isVirtual标志。即object.isVirtual = true。
  2. 系统通过utils.util.getReal函数提供获取真实对象的方法。此函数参照第3条规定做检索算法。
  3. 幻象对象可以通过以下规则来检索到其相对应的主对象,第一,通过其realObject的属性值。第二,如果第一条失效,则通过冒泡算法迭代的检索其父对象,直到找到一个有配置realObject属性的对象,或者一个非辅助对象为止(object.isVirtual === undefined)。
  4. 幻象对象需要自己定义在被选中时传递给主对象被选中位置的方法。此方法定义在函数object.convertRaycaster中。此函数接受THREE.Raycaster.intersectObject函数的返回值的单位元素为参数,然后返回一个新的类THREE.Raycaster.intersect函数返回值的对象。如果辅助对象不存在convertRaycaster函数,则被认为此辅助对象不响应主raycaster插件的检测,并被直接无视掉。即主raycaster插件不会发布hoverObject消息。
  5. 幻象对象每次被渲染的时候,都会检查主对象的一些属性的值,然后根据这些值来对自身的属性做一些调整。
  6. 与幻象对应的主对象用一个新的属性名tuoVisible来标识可视性。幻象对象可以通过监控这个属性来决定自身的可视性。因此,对于tuo-three2中的主对象有一个这样的规定:如果该对象的tuoVisible定义了,那么需要根据tuoVisible的值来判断其可视性。否则,按该对向的visible属性来判断。即
    realVisible = object.tuoVisible === undefined ? object.visible : object.tuoVisible
    与此同时,要真正的把某个对象置为不可见,也需要首先查看该对象是否存在tuoVisible属性。即,如果该对象的tuoVisible !== undefined, 则需要设置此属性的值,然后再判断其是否存在幻象,来判断是否需要继续设置visible的值。
  7. 存在幻象的主对象的virtualStack存在且长度大于零。即Array.isArray(object.virtualStack) === true && object.virtualStack.length > 0。6中,可以通过主对象的此属性来判断其是否存在幻象。
  8. virtualStack是用来管理一个主对象存在多个幻象的情况而存在的。我们规定,每一个主对象在同一时间只能激活一个幻象。而且每次被激活的幻象都是virtualStack中最新加入的幻象。
  9. 当一个幻象被移除时,需要首先检查主对象的virtualStack中是否还存在幻象,如果存在则使用上一个最新加入的幻象。如果没有则以主对象的“本象”来显示。
  10. 创建新幻象时,需要通过继承/core/VirtualObject来创建。并且需要定义里面的attach函数和detach函数。这两个函数分别定义幻象3D对象的创建和移除方法。实现新的VirtualObject的定义后,再通过VirtualObject.link函数为主对象添加幻象。在需要移除幻象时,可以通过VirtualObject.unlink函数来实现。
  11. 本系统在需要直接配置一个Group对象的可视性时。除了对该Group对象可视性进行设置外,还需要遍历其子结点,然后单独对每一个对象的可视性进行配置。这么做的目的是为了减少幻象对象可视性系统的复杂度。

注意1:幻象对象与3D辅助对象的主要差别是,一个主对象的幻象一旦存在,则该对象一定为渲染性的不可见。即object.visible === false为真。

注意2:幻象对象的生命周期由插件来管理。某个插件处于某个目的为主对象创建了幻象,那么当幻象需要移除时,也由该插件定义移除方法。

发表评论

邮箱地址不会被公开。 必填项已用*标注