【问题标题】:Three.js Normal Mapping forcing mesh to not renderThree.js 法线贴图强制网格不渲染
【发布时间】:2014-01-09 04:26:42
【问题描述】:

我正在使用 Three.js (r64) 来渲染一些模型。我正在使用包含的 THREE.OBJMTLLoader。我正在尝试通过向加载程序提供 .obj 和 .mtl 来渲染椅子。我还有一个法线贴图的 png 我想应用到它。下面是我正在经历的两个屏幕截图。

如果未应用法线贴图,则模型的屏幕截图,请注意颜色与预期一致,但由于未应用法线贴图而显示低分辨率质量:

如果将法线贴图应用于材质的“贴图”字段,则为模型的屏幕截图。请注意,它现在看起来很高分辨率,但颜色不对,可能是因为我将纹理应用于材质:

如果我将纹理应用到材质的“法线贴图”字段,模型就会消失。

下面是我用来渲染模型的代码的 sn-p:

 var chairNormalMap = THREE.ImageUtils.loadTexture('../Models/BanquetChair/BanquetChairNormalMap.png');

        loader.load('../Models/BanquetChair/BanquetChair.obj', '../Models/BanquetChair/BanquetChair.mtl', function (object) {

            materials.push.apply(materials, object.children);

            object.traverse(function (child) {

                if (child instanceof THREE.Mesh) {

                    var chairNormalMaterial = new THREE.MeshPhongMaterial();

                    // if this line is applied, the model will disappear
                    chairNormalMaterial.normalMap = chairNormalMap;

                    // if this line is applied, the normals look great but then the chair is the color of the normal map
                    chairNormalMaterial.map = chairNormalMap;

                    child.material = chairNormalMaterial;

                }

            });

            object.position.y = -80;
            object.receiveShadow = true;
            scene.add(object);

        });

我希望我已经很好地解释了我的尝试,我希望它就像在材料中使用不同的属性一样简单。欢迎任何建议。谢谢!

【问题讨论】:

  • 控制台有错误吗?
  • 唯一的错误如下: WEBGL11095: INVALID_OPERATION: clearStencil: Method not current support 但是,无论在任何情况下,我都会收到此错误,因此可能与此特定问题无关。跨度>
  • 你能提供一个简单的活生生的例子吗? -- 不是你的整个项目。
  • 嗨 WestLangley,我的道歉我应该首先这样做。请看下面的jsfiddlejsfiddle.net/g96F3左边的模型是在没有法线贴图的情况下渲染的,右边的模型是用法线贴图作为实际纹理来渲染的。请原谅我的术语,对 3D 来说还是很陌生。

标签: 3d three.js


【解决方案1】:

您需要为场景添加灯光,并确保使用回调加载纹理。

var ambientLight = new THREE.AmbientLight( 0x222222 );
scene.add( ambientLight );

var light = new THREE.PointLight( 0xffffff, 1 );
light.position = camera.position;
scene.add( light );

var loader = new THREE.OBJMTLLoader();

var chairNormalMap = THREE.ImageUtils.loadTexture('...png', undefined, function() {

    loader.load('...obj', '...mtl', function ( object ) {

        object.traverse( function ( child ) {

            if (child instanceof THREE.Mesh && child.material instanceof THREE.MeshPhongMaterial ) {

                child.material.normalMap = chairNormalMap;
            }

        });

        object.position.set( 30, 0, 0 );
        scene.add( object );

    });

});

three.js r.64

【讨论】:

  • 非常感谢您对此的帮助。我为任何感兴趣的人更新了 jsfiddle。 jsfiddle.net/g96F3/1 所以我猜当我加载纹理时它会流式传输,这就是为什么当我应用法线贴图时它会消失,因为纹理没有完全加载到内存中。我的另一个问题是,当我只有环境光时,为什么法线贴图的细节不显示,点光使它工作的原因是什么?再次感谢!
  • 你需要学习基础知识。见stackoverflow.com/questions/11966779/…
  • 感谢您提供该链接,我认为从头开始以获得全面理解是一个好主意。附带说明一下,似乎当我在 chrome 上运行示例 jsfiddle.net/g96F3/1 时,效果很好。在 IE 11 上,模型不显示。我是否可以采取一种可能的解决方法来与这两种浏览器兼容,或者在 IE 方面我对法线映射不走运?再次感谢!
  • 如果您有新问题,您需要发布新帖子,以便了解该浏览器的人可以帮助您。
  • @mvcNewbie 任何机会你可以更新你的小提琴,我想看看这个
猜你喜欢
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
  • 2016-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多