【问题标题】:Aframe: size of modelAframe:模型大小
【发布时间】:2018-12-25 03:06:47
【问题描述】:

当使用模型作为实体的来源时,比如 gltf,有没有办法知道原始大小?由于scale 属性适用于相对大小,因此将模型拟合到我们想要的大小似乎是一个尝试错误。我尝试使用模型网格的geometry.getComputingBox(),但它返回null。想知道是否有可用的组件可以让我们以绝对值指定比例。

【问题讨论】:

    标签: three.js aframe


    【解决方案1】:

    啊,想通了。

    var model = this.el.object3D;
    var box = new THREE.Box3().setFromObject( model );
    var size = box.getSize();
    

    给你大小。然后使用上述任何所需的大小可以设置。

    创建了一个可以方便使用的简单组件

    AFRAME.registerComponent('resize', {
      schema: {
        axis: {
          type: 'string',
          default: 'x'
        },
        value: {
          type: 'number',
          default: 1
        }
      },
      init: function() {
        var el = this.el;
        var data = this.data;
        var model = el.object3D;
        el.addEventListener('model-loaded', function(e) {
          var box = new THREE.Box3().setFromObject( model );
          var size = box.getSize();
          var x = size.x;
          var y = size.y;
          var z = size.z;
          if(data.axis === 'x') {
            var scale = data.value / x;
          }
          else if(data.axis === 'y') {
            var scale = data.value / y;
          }
          else {
            var scale = data.value / z;
          }
          el.setAttribute('scale', scale + ' ' + scale + ' ' + scale);
        });
      }
    });
    

    并且可以用来按比例调整x轴长度为0.5的模型

    <a-entity resize='axis:x; value:0.5' gltf-model='#model`></a-entity>
    

    【讨论】:

      【解决方案2】:

      (这本来是作为评论出现的,但由于我没有足够的代表点数,所以这是作为答案出现的。)

      我发现模型在model-loaded 事件侦听器之后没有直接大小,因此我从update 方法触发了重新缩放。有趣的是,如果您没有 model-loaded 事件侦听器,那么即使在第一个 update 被触发后,模型的大小也会为 0。 这是我上面代码的变体,不同之处在于尺寸以米为单位:

      const AFRAME = window.AFRAME;
      
      /*
      * Scales the object proportionally to a set value given in meters.
      */
      
      AFRAME.registerComponent('natural-size', {
        schema: {
          width: {
            type: "number",
            default: undefined // meters
          },
          height: {
            type: "number",
            default: undefined // meters
          },
          depth: {
            type: "number",
            default: undefined // meters
          }
        },
      
        init() {
          this.el.addEventListener('model-loaded', this.rescale.bind(this));
        },
      
        update() {
          this.rescale();
        },
      
        rescale() {
      
          const el = this.el;
          const data = this.data;
          const model = el.object3D;
      
          const box = new THREE.Box3().setFromObject(model);
          const size = box.getSize();
      
          if ( !size.x && !size.y && !size.z ) {
            return;
          }
      
          let scale = 1;
      
          if ( data.width ) {
            scale = data.width / size.x;
          } else if( data.height ) {
            scale = data.height ( size.y);
          } else if( data.depth ) {
            scale = data.depth / size.y;
          }
      
          el.setAttribute('scale', `${scale} ${scale} ${scale}`);
      
        },
      
        remove() {
          this.el.removeEventListener('model-loaded', this.rescale);
        }
      
      });
      

      然后:

      <a-entity natural-size='width:0.72' gltf-model='#model`></a-entity>
      

      【讨论】:

        【解决方案3】:

        box.getSize 发生了变化,我将在这里找到的内容与在另一个答案中找到的内容结合起来,并在控制台中发现了一个更简约的答案,只是为了确定模型本身的大小:

            getDimensions(object3d) {
                // e.g., object3d = document.querySelector('#goban').object3D
                var box = new THREE.Box3().setFromObject( object3d );
                var x = box.max.x - box.min.x 
                var y = box.max.y - box.min.y 
                var z = box.max.z - box.min.z 
        
                return {x,y,z}
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-06
          • 1970-01-01
          相关资源
          最近更新 更多