Blender 导出到 Three.js

Posted

技术标签:

【中文标题】Blender 导出到 Three.js【英文标题】:Blender export to Three.js 【发布时间】:2012-04-04 17:20:44 【问题描述】:

我刚刚使用 Blender 创建了一个随机网格,我想将其导出以通过 Three.js 在 html5 中使用。我还没有看到任何体面的教程来展示如何做到这一点。谁能帮我解决这个问题?我只希望 3D Mesh 在网络中显示,不包括动画。谢谢!

【问题讨论】:

查看这篇博文:kadrmasconcepts.com/blog/2011/06/06/three-js-blender-2-5-ftw 这里是一个简单的three.js和blender教程youtube.com/watch?v=d41Fw_CIxHA> 【参考方案1】:

经过多次搜索和反复试验,我发现最简单的方法是Three.ColladaLoader。将.dae 文件放在/root 目录中名为models 的文件夹中。我发现 Blender JSON 导出器不太可靠。从 init() 函数中调用 PinaCollada 函数,如下所示:

function init()
    scene = new THREE.scene;
    ...
    var object1 = new PinaCollada('model1', 1);
    scene.add(object1); 
    var object2 = new PinaCollada('model2', 2);
    scene.add(object2); 
    ...


function PinaCollada(modelname, scale) 
    var loader = new THREE.ColladaLoader();
    var localObject;
    loader.options.convertUpAxis = true;
    loader.load( 'models/'+modelname+'.dae', function colladaReady( collada ) 
        localObject = collada.scene;
        localObject.scale.x = localObject.scale.y = localObject.scale.z = scale;
        localObject.updateMatrix();
     );
    return localObject;

【讨论】:

您需要在回调中返回 localObject 变量,并删除函数上的 'colladaReady' 名称。【参考方案2】:

您需要 threejs 搅拌机导出器:read this

【讨论】:

我没有广泛尝试过 ColladaLoader,但我倾向于同意 ThreeJS Blender Exporter 及其 json 输出将是首选,只要它是“官方”ThreeJS 格式和至少在时间上,应该是 Blender 最受支持和最稳定的管道。我只是推测,所以我可能是错的...... 值得一提的是,这个导出器很久很久以前就从 Three.js 中删除了,所以它不再是一个可行的解决方案了。【参考方案3】:
var loader = new THREE.JSONLoader(true);
loader.load(
    model: "model.js",
    callback: function(geometry) 
        mesh = new THREE.Mesh(geometry,new THREE.MeshFaceMaterial);
        mesh.position.set(0,0,0);
        mesh.scale.set(20,20,20);
        scene.add(mesh);
        renderer.render(scene, camera);
    
);

是 THREE.JS 的基本 json 加载器; 您还需要调查:

如何设置画布、场景、灯光和相机(如果您还没有使用搅拌器)

morphTargets(如果您正在制作动画)

材料(如果你想调整)

【讨论】:

【参考方案4】:

选择的答案不返回承诺或回调,所以你不知道什么时候可以设置。我添加了一个小类,它会展示你如何使用它。它包装了 collada loader。

var ColladaLoaderBubbleWrapper = function() 
    this.file = null;
    this.loader = new THREE.ColladaLoader();
    this.resolve = null;
    this.reject = null;

    this.colladaLoadedNotifier = this.colladaLoadedNotifier.bind(this);
    this.onLoad = this.onLoad.bind(this);
;

ColladaLoaderBubbleWrapper.prototype.loadCollada = function(file) 
    this.loader.load(file, this.onLoad, this.onDownloadProgress);
    return new Promise(this.colladaLoadedNotifier);
;

ColladaLoaderBubbleWrapper.prototype.colladaLoadedNotifier = function(resolve, reject) 
    this.resolve = resolve;
    this.reject = reject;
;

ColladaLoaderBubbleWrapper.prototype.onLoad = function(collada) 
    this.resolve(collada);
;

ColladaLoaderBubbleWrapper.prototype.onDownloadProgress = function(xhr) 
    console.log( (xhr.loaded / xhr.total * 100) + '% loaded' );
;

然后使用它包括 collada 加载器:

<script src="js/loaders/ColladaLoader2.js"></script>
<script src="js/blender/colladaBubbleWrap.js"></script>

在你的主 js 中

var colladaLoader = new ColladaLoaderBubbleWrapper();
var colladaLoaded = colladaLoader.loadCollada('colladas/brick/brick.dae');
colladaLoaded.then(function(collada) 
    scene.add( collada.scene );
);

【讨论】:

【参考方案5】:

我使用了: Blender3d ver 2.78,在three.js实用程序文件夹中找到的导出脚本插件 使用 three.js 版本 60,我将此脚本添加到 Blender 的附加组件文件夹中 设置搅拌机程序的地方。在 Sketchup 中建模,我导出为 model.dae ( Collada 文件),将其导入 Blender3d 版本 2.78 运行设置 附加导出器,将 Blender3d 导出为 Three.js 文件。我保存的这个 json 文件 作为 .js ( javascript-object ) 而不是 .json (JavaScript Notation 对象)

那个对象,(纹理正确)是这样运行的:

///// GROUND CHERRY MESH    

var myShaderMaterial = new THREE.MeshPhongMaterial( 
          // ADDING TEXTURE 
    map: THREE.ImageUtils.loadTexture('models/MyBistro/ShelfTextures/ground_cherryTEX_001a1.png'),
    specular: 0xFFFFFF,
    shininess: 80,
);         
          // ADDING MODEL OBJ  
var loader = new THREE.ObjectLoader( manager );
loader.load( 'models/MyBistro/ShelfTextures/MyShader1aTEST_TWO.js',  function ( object )       
    object.traverse( function ( child ) 
        if ( child instanceof THREE.Mesh ) 
            var geometry = child.geometry;
            object = new THREE.Mesh(geometry,  myShaderMaterial);
            object.scale.set(1.60, 1.60, 1.60);         
            object.position.x =  + 22.10;           
            object.position.y =  - 84.0;            
            object.position.z =  - 4.0;                     
            object.rotation.y = Math.PI / 0.10;                     
            object.castShadow = true;
            object.receiveShadow = true;            
            child.material.map = myShaderMaterial;
            child.material.needsUpdate = true;          
               
    ); 
  scene.add( object );  
);

【讨论】:

【参考方案6】:

对于那些在 2021 年阅读这篇文章的人,希望以后也能阅读,我想详细说明所提供的答案和 cmets,它们通常都很棒。

首先,Three-to-Blender 导出器不再是有效选项,因为它已从 Three.js 代码库中删除。

其次,COLLADA 也不可行,因为这种格式有太多的极端情况,没有很好地针对 Web 进行优化。

所以现在推荐的方法是使用 Blender 的 glTF 2.0 导出器和 Three.js GLTFLoader 类。用法见this tutorial。

【讨论】:

以上是关于Blender 导出到 Three.js的主要内容,如果未能解决你的问题,请参考以下文章

Blender 2.79 材料导出到 gltf 失去光泽

THREE.js 学习笔记

如何从 Blender 导出到 unity3d

将变形目标从 Blender 导出到 Three.js

Blender 导出到 Three.js

Blender 导出fbx模型到 untiy