Aframe:模型尺寸

Aframe: size of model

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

啊,明白了。

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>

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

我发现模型在 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>

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}
    }