我如何将我的对象与它的固有纹理从Blender导入到ThreeJS
How can I Import my object with it's inherent textures from Blender to ThreeJS?
我已经使用STL Loader for threejs将我的对象从Blender导入到threejs中,但由于某种原因,纹理没有出现。我认为它与对象的MeshBasicMaterial有关。我试着把它改成Phong,但是对象变成了黑色。
然后我意识到,而不是改变材料从基本到phong,为什么我不能保持固有的特征/纹理从Blender当我加载对象从STL加载到三个ejs?有办法保持口感吗?有我可以遵循的教程吗?
谢谢!
编辑:这是我的代码片段,我把我的Blender对象和纹理导出到一个threejs .js文件。对象在我的查看器中加载,但它是黑色的,没有纹理。我不知道怎么解决这个问题。我遵循了另一个使用客栈作为纹理的例子(因此得名)。还没改名字)。
var Viewport = function ( signals ) {
var container = new UI.Panel( 'absolute' );
container.setBackgroundColor( '#aaa' );
var clock = new THREE.Clock();
// settings
var enableHelpersFog = true;
// helpers
var objects = [];
var INTERSECTED;
var sceneHelpers = new THREE.Scene();
//the grid that appears at the beginning.
var size = 500, step = 25;
var geometry = new THREE.Geometry();
var material = new THREE.LineBasicMaterial( { vertexColors: THREE.VertexColors } );
var color1 = new THREE.Color( 0x444444 ), color2 = new THREE.Color( 0x888888 );
for ( var i = - size; i <= size; i += step ) {
geometry.vertices.push( new THREE.Vector3( -size, 0, i ) );
geometry.vertices.push( new THREE.Vector3( size, 0, i ) );
geometry.vertices.push( new THREE.Vector3( i, 0, -size ) );
geometry.vertices.push( new THREE.Vector3( i, 0, size ) );
var color = i === 0 ? color1 : color2;
geometry.colors.push( color, color, color, color );
}
var grid = new THREE.Line( geometry, material, THREE.LinePieces );
sceneHelpers.add( grid );
///Objects stuff
var objectshapes = [];
//stl files
group = new THREE.Object3D();
var loader_slotted_disk = new THREE.STLLoader();
loader_slotted_disk.addEventListener( 'load', function ( event ) {
var geometry = event.content;
console.log(geometry);
var material = new THREE.MeshBasicMaterial( { color: Math.random() * 0xffffff, opacity: 0.5 });
var mesh1 = new THREE.Mesh( geometry, material );
mesh1.name='slotted disk';
mesh1.castShadow = true;
mesh1.receiveShadow = true;
sceneHelpers.add( mesh1 );
objectshapes.push( mesh1 );
} );
loader_slotted_disk.load( 'js/ui/assests/slotted_disk.stl' );
var loader_left_bronchus = new THREE.STLLoader();
loader_left_bronchus.addEventListener( 'load', function ( event ) {
var geometry = event.content;
console.log(geometry);
var material = new THREE.MeshBasicMaterial( { color: Math.random() * 0xffffff, opacity: 0.5 });
var mesh1 = new THREE.Mesh( geometry, material );
mesh1.name='left bronchus';
mesh1.castShadow = true;
mesh1.receiveShadow = true;
mesh1.position.x = Math.random() * 200 - 50;
mesh1.position.y = Math.random() * 200 - 50;
mesh1.position.z = Math.random() * 200 - 50;
sceneHelpers.add( mesh1 );
objectshapes.push( mesh1 );
} );
loader_left_bronchus.load( 'js/ui/assests/left_bronchus.stl' );
var loader_parenchyma = new THREE.STLLoader();
loader_parenchyma.addEventListener( 'load', function ( event ) {
var geometry = event.content;
console.log(geometry);
var material = new THREE.MeshBasicMaterial( { color: Math.random() * 0xffffff, opacity: 0.5 });
var mesh2 = new THREE.Mesh( geometry, material );
mesh2.name='parenchyma';
mesh2.castShadow = true;
mesh2.receiveShadow = true;
sceneHelpers.add( mesh2 );
objectshapes.push( mesh2 );
} );
//loader_parenchyma.load( 'js/ui/assests/parenchyma.stl' );
//group.rotation.x = Math.PI* 3/2
////////////
// CUSTOM //
////////////
var inn_loader = new THREE.JSONLoader(); inn_loader.load("js/reducedandcoloredmodel[Conflict].js", function(geo, material) { var materials = new THREE.MeshFaceMaterial(material); inn = new THREE.Mesh(geo, materials); scene.add(inn); }); //
///stl files added
var geometry = new THREE.CubeGeometry( 50, 50, 50 );
var geometry2 = new THREE.SphereGeometry( 50, 10, 10);
var object = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial( { color: Math.random() * 0xffffff, opacity: 0.5 } ) );
object.name = "cube";
object.position.x = Math.random() * 200 - 50;
object.position.y = Math.random() * 200 - 50;
object.position.z = Math.random() * 200 - 50;
object.rotation.x = Math.random() * 2 * Math.PI;
object.rotation.y = Math.random() * 2 * Math.PI;
object.rotation.z = Math.random() * 2 * Math.PI;
sceneHelpers.add( object );
objectshapes.push( object );
var object2 = new THREE.Mesh( geometry2, new THREE.MeshBasicMaterial( { color: Math.random() * 0xffffff, opacity: 0.5 } ) );
object2.name = "sphere";
object2.position.x = Math.random() * 200 - 50;
object2.position.y = Math.random() * 200 - 50;
object2.position.z = Math.random() * 200 - 50;
object2.rotation.x = Math.random() * 2 * Math.PI;
object2.rotation.y = Math.random() * 2 * Math.PI;
object2.rotation.z = Math.random() * 2 * Math.PI;
sceneHelpers.add( object2 );
objectshapes.push( object2 );
console.log(objectshapes);
///box around object
var selectionBox = new THREE.Mesh( new THREE.CubeGeometry( 1, 1, 1 ), new THREE.MeshBasicMaterial( { color: 0xffff00, wireframe: true, fog: false } ) );
selectionBox.matrixAutoUpdate = false;
selectionBox.visible = false;
sceneHelpers.add( selectionBox );
///axis
var selectionAxis = new THREE.AxisHelper( 100 );
selectionAxis.material.depthTest = false;
selectionAxis.material.transparent = true;
selectionAxis.matrixAutoUpdate = false;
selectionAxis.visible = false;
sceneHelpers.add( selectionAxis );
// default dummy scene and camera
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera( 50, 1, 1, 5000 );;
// fog
var oldFogType = "None";
var oldFogColor = 0xaaaaaa;
var oldFogNear = 1;
var oldFogFar = 5000;
var oldFogDensity = 0.00025;
// object picking
var intersectionPlane = new THREE.Mesh( new THREE.PlaneGeometry( 10000, 10000, 8, 8 ) );
intersectionPlane.visible = false;
sceneHelpers.add( intersectionPlane );
var ray = new THREE.Raycaster();
var projector = new THREE.Projector();
var offset = new THREE.Vector3();
var cameraChanged = false;
var helpersVisible = true;
//by default the selected scene object is the camera.
var picked = null;
var selected = camera;
mr doob已经指出STL不指定颜色或纹理,它是纯粹的几何。我建议用three.js导出器从blender中导出一些琐碎的东西(比如带有纹理的立方体),以了解发生了什么。我在threejs-and-blender上有示例代码。查看这三个ejs演示的源代码,并查看哪些文件被拉入,您也应该找到对图像的引用。
一旦你有了这个工作,找出更复杂的模型变得更容易。另外,如果你不想共享你的原始模型,你应该没有问题共享一个简单的立方体用于调试。
虽然我没有使用JSON Loader,但我尝试使用Collada Loader(因为我的模型在Webgl Loader Collada示例中导入时保留了离线纹理),并且在当前的3d查看器中,我的模型仍然是黑色的。然而,在添加光之后,纹理就显示出来了。
基本上,我假设与JSON Loader一样,我需要在我的3-D查看器中添加一盏灯,以显示模型的外部。
我在使用Blender v 2.68a时遇到了同样的问题。这个问题在Blender 2.71中得到了解决。
我导入,使用Blender 2.71,之前在WebGl上显示为黑色的。stl文件,然后导出它,不改变默认的。stl导出菜单中的任何设置参数。我用WebGl重新加载了这个文件,它就是全彩的了!
- 在threejs中使用纹理网格和线框网格
- ThreeJS将画布中的文本渲染为纹理,然后应用于平面
- 无法在obj+mtl文件中加载纹理
- 加载collada纹理数据(.jpg本身)时对其进行操作
- webgl在一个正方形上操纵两个纹理
- 如何在pixi.js多边形上放置纹理
- 如何在three.js中为三角形添加纹理
- Three.js CanvasRenderer,在将图像纹理设置为平面时出现问题
- 显示纹理-maya到three.js
- 如何将纹理打包器与纯javascript结合使用
- WebGL多纹理多维数据集
- 有没有一种方法可以在three.js中自定义纹理之间的转换
- 永远都不知道如何在twgl中进行纹理工作
- 加载 .dae 模型时不显示纹理
- 三.js - 没有纹理绑定到单元 0 错误
- 如何将多个 Blender JSON 模型合并到一个 Three.js Object3D 对象中
- 更新纹理的正确方法(三.JS)
- 将模型从Blender导出到Three.js时没有纹理
- 基于图像的纹理没有像预期的那样在从blender加载的网格上渲染
- 我如何将我的对象与它的固有纹理从Blender导入到ThreeJS