Thressjs开发笔记之八创建、加载高级网格和几何体

组合对象

也就是把几个物体捆绑在一起,方便对整体做出统一的操作

sphere = createMesh(new THREE.SphereGeometry(5, 10, 10));
cube = createMesh(new THREE.BoxGeometry(6, 6, 6));

sphere.position.set(;
cube.position.set();

group = new THREE.Group();
group.add(sphere);
group.add(cube);

scene.add(group);

高性能捆绑组合体

意思就是:单独去旋转每个物体会很耗性能,如果把他组合在一起,一起操作就快很多。(将多个网络合并成一个网络)。
通过THREE.GeometryUtils.merge函数可以将多个几何体合并在起来,创建一个联合体。

var geometry = new THREE.Geometry();

geometry.merge(geometry, childCube);

scene.add(new THREE.Mesh(geometry, cubeMaterial));
//缺点对单个物体的控制不是太方便,对单个物体的材质可以用MeshFaceMaterial来解决。

外部加载几何体

常用的模型格式
Json(THREEjd自己的格式),OBJ/MTL(网络/材质)
其他格式
Collada,STL,CTM,VTK,PDB,PLY

JSON格式

内部物体的save&load 保存到了浏览器缓存里与读出

//save
var knot = createMesh(new THREE.TorusKnotGeometry(10, 1, 64, 8, 2, 3, 1));

var result = knot.toJSON();
localStorage.setItem("json", JSON.stringify(result));
//load
var json = localStorage.getItem("json");

if (json) {
       var loadedGeometry = JSON.parse(json);
       var loader = new THREE.ObjectLoader();

       loadedMesh = loader.parse(loadedGeometry);
       loadedMesh.position.x -= 50;
       scene.add(loadedMesh);
}

内部场景的exporter &load

//导出
var exporter = new THREE.SceneExporter();
var sceneJson = JSON.stringify(exporter.parse(scene));
localStorage.setItem('scene', sceneJson);

//导入
var json = (localStorage.getItem('scene'));
var sceneLoader = new THREE.SceneLoader();
sceneLoader.parse(JSON.parse(json), function (e) {
scene = e.scene;
}, '.');

外部JSON导入(Blender)

1.给Blender安装Threejs的导出器
把THREEjs的\three.js-master\utils\exporters\blender\addons复制到Blender的Blender\2.78\scripts\addons里
2.激活导出器
File-》UserPreference-》addone-》搜索three-》打钩-》左下角save setting

导入代码

 var loader = new THREE.JSONLoader();
loader.load('../assets/models/misc_chair01.js', function (geometry, mat) {
            mesh = new THREE.Mesh(geometry, mat[0]);

            mesh.scale.x = 15;
            mesh.scale.y = 15;
            mesh.scale.z = 15;

            scene.add(mesh);

}, '../assets/models/');

加载OBJ/MIT文件

//obj需要obj加载器
 var mesh;
var loader = new THREE.OBJLoader();//初始化加载器
loader.load('../assets/models/pinecone.obj', function (loadedMesh) {
var material = new THREE.MeshLambertMaterial({color: 0x5C3A21});


    loadedMesh.children.forEach(function (child) {
            child.material = material;
            child.geometry.computeFaceNormals();
            child.geometry.computeVertexNormals();
    });

    mesh = loadedMesh;
    loadedMesh.scale.set(100, 100, 100);
    loadedMesh.rotation.x = -0.3;
    scene.add(loadedMesh);
});
//obj并mtl直接赋予材质.
 var mesh;

var loader = new THREE.OBJMTLLoader();

loader.load('../assets/models/butterfly.obj', '../assets/models/butterfly.mtl', function (object) {

            // configure the wings
            var wing2 = object.children[5].children[0];
            var wing1 = object.children[4].children[0];

            wing1.material.opacity = 0.6;
            wing1.material.transparent = true;
            wing1.material.depthTest = false;
            wing1.material.side = THREE.DoubleSide;

            wing2.material.opacity = 0.6;
            wing2.material.depthTest = false;
            wing2.material.transparent = true;
            wing2.material.side = THREE.DoubleSide;

            object.scale.set(140, 140, 140);
            mesh = object;
            scene.add(mesh);

            object.rotation.x = 0.2;
            object.rotation.y = -1.3;
});
posted @ 2017-09-03 14:27  keivnyau  阅读(397)  评论(0编辑  收藏  举报