【问题标题】:Three.js Canvas renderer, Objectloader with a Blender JSON file, transparency on object overlap?Three.js Canvas 渲染器,带有 Blender JSON 文件的 Objectloader,对象重叠的透明度?
【发布时间】:2018-03-09 05:20:21
【问题描述】:

我正在使用 Three.JS 来渲染导出为场景的 Blender 对象,因此它使用的是 ObjectLoader,而不是 Json Loader。我也在使用 CanvasRendering 引擎。当对象重叠时会出现此问题;它正在对材质进行半透明效果。

我使用哪种类型的搅拌机出口并不重要;我已经选择并导出了其他 Blender 文件,无论设置如何,它们都会产生这种效果。

以下是我用来放置对象和材质的代码。

var loader = new THREE.ObjectLoader();
            loader.load("../js/lights.json", function(object) {

                   var material = new THREE.MeshToonMaterial( { color: 0x3f3f3f, alphaTest: 0.5 } );
                   object.traverse( function ( child ) {
                    if ( child instanceof THREE.Mesh ) {
                        child.material = material;
                        child.drawMode = THREE.TrianglesDrawMode;
                    };  
                   });
                   object.scale.set(3, 3, 3);
                   object.position.x = 1;
                   object.position.y = 1;
                   object.position.z = 1;
                   object.rotation.set( 25, 25, 25 );
                   scene.add( object );
                }   
            );

我使用过从 Lambert 到 Phong 的材质类型,但我仍然遇到这种重叠透明度问题。我错过了什么?谢谢!

编辑:在 cmets 之后,我进行了请求的更改。现在使用 WebGL 渲染器代替 Canvas。这就是我现在所拥有的,模型现在根本没有出现,但我的控制台中没有错误。

var loader = new THREE.ObjectLoader();
            loader.load("../js/lights.json", function(object) {

                   var material = new THREE.MeshBasicMaterial( { color: 0x333333 } );
                   object.traverse( function ( child ) {
                    if ( child instanceof THREE.Mesh ) {
                        child.material = material;
                        child.geometry.computeFaceNormals();
                        child.material.overdraw = 0.5
                    };  
                   });
                   object.scale.set(3, 3, 3);
                   object.position.x = 1;
                   object.position.y = 1;
                   object.position.z = 1;
                   object.rotation.set( 25, 25, 25 );
                   scene.add( object );
                }   
            );

【问题讨论】:

  • 看起来您的三角形法线并非都指向同一个方向。尝试使用 computeVertexNormals() 调用并使用 webgl 渲染器以获得更好的结果。还可以使用您说您已经尝试过的 Lambert 或 phong 材料,并使用默认的drawMode
  • 我刚刚做了你推荐的更改,屏幕变黑了。
  • 场景中是否定义了灯光?
  • 是的。 ' 函数 initLights() { var light = new THREE.AmbientLight(0xffffff); light.position.set(50, 50, 50);场景。添加(灯光); }'
  • 我通过添加:renderer.setClearColor (0xffffff, 1); 重新打开了灯,但对象根本没有加载,也没有 js 错误。

标签: canvas three.js textures


【解决方案1】:

您的模型在您的视口之外,这就是您看不到它的原因。在https://codepen.io/anon/pen/qPmyPz?editors=0010 中加载你的模型,你可以看到它很好。现在注释第 80-82 行(这是默认行为)并重新加载您的模型。你再也看不到它了。

这些行将controls 转为您可以看到模型:

var bb = new THREE.Box3()
bb.setFromObject(scene);
bb.center(controls.target);

【讨论】:

  • 谢谢!一个问题,我忘了提,我正在做一个取决于鼠标移动的微妙移动。这似乎与来自 codepin 的控制命令不一致。我给你看相关代码:pastebin.com/KfmmVDP5
  • 这只是一个例子。这并不意味着您必须逐字使用它。获得上述功能的另一种方法是使用摄像头lookAt()并将其指向bb.center
  • 谢谢!标记为已解决!你一直很有耐心,很好。
猜你喜欢
  • 2011-01-17
  • 2019-10-01
  • 2018-01-27
  • 2014-08-07
  • 2012-10-24
  • 2015-12-17
  • 1970-01-01
  • 2013-07-05
  • 1970-01-01
相关资源
最近更新 更多