在three.js中创建一个新对象

时间:2017-10-14 12:44:22

标签: javascript three.js aframe

我目前正在开发一个项目,该项目涉及基于数据库在Threejs中制作3D对象。

我已经有了连接等,但是当我尝试创建一个新对象时它仍然失败。

    this.type = 'CustomObject';
    let shape = new THREE.Shape();
    const maxSize = coords.reduce((prev, current) => (Math.abs(prev.value) > Math.abs(current.value)) ? prev : current); // max Size but Abs
    // console.log("Max size before check : "+ maxSize.value);
    //Check weither maxSize is positive or negative.
    let height = Math.abs(maxSize.value);

    shape.moveTo(0, 0);
    for (let i = 0; i < coords.length; i++) {
        // console.log(coords[i]);
        shape.lineTo(coords[i].id, coords[i].value);
    }

    shape.lineTo(coords[coords.length - 1].id, -height - 3);
    shape.lineTo(0, -height - 3);
    shape.lineTo(0, 0);
    // let geometry = new THREE.ExtrudeGeometry( shape, extrudeSettings );
    let extrudeSettings = {
        steps: 4,
        amount: 20,
        bevelEnabled: false,
        bevelThickness: 1,
        bevelSize: 1,
        bevelSegments: 1
    };
    this.geometry = new THREE.ExtrudeGeometry(shape, extrudeSettings);
    this.material = new THREE.MeshBasicMaterial({color: 0xCbcbcb});
    let object = new THREE.Mesh( this.geometry, this.material );
    this.createdGraph = object;
    console.log(this.createdGraph.Object3D);
    this.scene.add(this.createdGraph);
}

这只是代码的一部分,我知道它不是最好的。但是我想在清理它之前先做它。 它是用ES6写的。

问题在于,如果你执行代码,它确实会创建我想拥有的数字。

由代码创建的对象的屏幕抓取。
A screengrab of the object created by the code.

但是如果我尝试将它添加到A-Frame(因为我之前已经使用它),它会一直给我错误,我不能在没有Object3D的情况下将对象添加到场景或'this.updateMorphTargets不是一个功能'。

有人有什么想法吗?

PS我也尝试了这个https://stackoverflow.com/a/31924233的想法,但是回来时'this.updateMorphTargets不是函数'错误。

谢谢:)

1 个答案:

答案 0 :(得分:1)

我不确定哪些部分会给你错误,
我已将你的代码复制到一个小提琴中,添加了3个coords,它是working

根据你的代码判断,你的场景参考不好,在一个框架中

this.el.sceneEl

假设this是任何实体,this.scene不引用场景。
此外,将three.js对象称为object3D,而不是Object3D

<小时/> 我只将三个.js对象创建放在一个aframe组件中:

AFRAME.registerComponent("foo",{
  init:function(){
  //Your code here
  }
});

并放置一个实体:

<a-entity foo> </a-entity>

<小时/> 在添加:

之前,我还通过获取场景参考来放置对象
this.el.sceneEl.object3D.add(object)