javascript - 使用 Three.js 加载 Maya 模型

标签 javascript html three.js webgl maya

我正在关注 this关于如何使用 Three.js 加载 Maya 模型的教程。

一切都很好,但教程只解释了如何加载具有一种纹理的模型。

这是教程的源代码:

function createScene(geometry, x, y, z, scale, tmap) {
            zmesh = new THREE.Mesh(geometry, new THREE.MeshLambertMaterial({map: THREE.ImageUtils.loadTexture(tmap)}));
            zmesh.position.set(x, y, z);
            zmesh.scale.set(scale, scale, scale);
            meshes.push(zmesh);
            scene.add(zmesh);
        }

完整的 JS Live Link

            var SCREEN_WIDTH = window.innerWidth;
        var SCREEN_HEIGHT = window.innerHeight;

        var container;

        var camera, scene;
        var canvasRenderer, webglRenderer;

        var mesh, zmesh, geometry, materials;

        var windowHalfX = window.innerWidth / 2;
        var windowHalfY = window.innerHeight / 2;

        var meshes = [];

        init();
        animate();

        function init() {

            container = document.createElement('div');
            document.body.appendChild(container);

            camera = new THREE.PerspectiveCamera(75, SCREEN_WIDTH / SCREEN_HEIGHT, 1, 100000);
            camera.position.x = 400;
            camera.position.y = 200;
            camera.position.z = 400;

            scene = new THREE.Scene();

            // LIGHTS
            var ambient = new THREE.AmbientLight(0x666666);
            scene.add(ambient);

            var directionalLight = new THREE.DirectionalLight(0xffeedd);
            directionalLight.position.set(0, 70, 100).normalize();
            scene.add(directionalLight);

            // RENDERER
            webglRenderer = new THREE.WebGLRenderer();
            webglRenderer.setSize(SCREEN_WIDTH, SCREEN_HEIGHT);
            webglRenderer.domElement.style.position = "relative";

            container.appendChild(webglRenderer.domElement);
            var loader = new THREE.JSONLoader(),
                callbackKey = function (geometry, materials) {
                    createScene(geometry, materials, 0, 0, 0, 6);
                };
            loader.load("chameleon.js", callbackKey);

            window.addEventListener('resize', onWindowResize, false);

        }

        function createScene(geometry, materials, x, y, z, scale) {


            zmesh = new THREE.Mesh(geometry, new THREE.MeshFaceMaterial(materials));
            zmesh.position.set(x, y, z);
            zmesh.scale.set(scale, scale, scale);
            meshes.push(zmesh);
            scene.add(zmesh);

        }

        function onWindowResize() {

            windowHalfX = window.innerWidth / 2;
            windowHalfY = window.innerHeight / 2;

            camera.aspect = window.innerWidth / window.innerHeight;
            camera.updateProjectionMatrix();

            webglRenderer.setSize(window.innerWidth, window.innerHeight);
        }

        function animate() {
            for (var i = 0; i < meshes.length; i++) {
                meshes[i].rotation.y += 0.01;
            }
            requestAnimationFrame(animate);
            render();
        }

        function render() {
            camera.lookAt(scene.position);
            webglRenderer.render(scene, camera);
        }

但是我的模型有四个纹理。我应该改变什么来加载所有这些? Live Link

最佳答案

您的后续教程似乎忽略了 JSON 模型格式的 Material ,而只是将几何图形和直接文本引用传递给单个纹理文件,如下所示:

var loader = new THREE.JSONLoader(),
    callbackKey = function(geometry) {createScene(geometry,  0, 0, 0, 15, "chameleon.jpg")};
loader.load("chameleon.js", callbackKey);

JSONLoader 不仅会拉入几何体,还会拉入数组中的所有 Material 。 (参见:https://github.com/mrdoob/three.js/blob/master/src/loaders/JSONLoader.js 第 45 行)然后您可以将此数组传递给 MeshFaceMaterial(arrayOfMaterials),如下所示:

var loader = new THREE.JSONLoader();,
    callbackKey = function(geometry, materials) {createScene(geometry, materials, 0, 0, 0, 15, )};
loader.load("chameleon.js", callbackKey);

然后在您的 createScene 函数中,您将第一行更改为:

zmesh = new THREE.Mesh(geometry, new THREE.MeshFaceMaterial(materials));

编辑:添加有关修复 Maya 导出的详细信息

因此您的模型正在加载但黑色。在这种情况下,问题出在模型文件 chameleon.js 中。查看每种 Material 的 colorAmbientcolorDiffuse 属性。请注意,它们都是 [0.0, 0.0, 0.0]。这是 Maya 中已知的对象导出错误。所以你有 3 个选项来修复它。

1) 打开 chameleon.js 文件并将所有 colorAmbientcolorDiffuse 行更改为类似这样的内容(您需要玩弄值(value)观以使其看起来正确)

"colorAmbient" : [0.8, 0.8, 0.8],
"colorDiffuse" : [0.8, 0.8, 0.8],

2) 在 Maya 中应用漫反射贴图之前,始终确保首先应用默认颜色值。出于某种原因,一旦 map 打开,您就无法再访问颜色属性,导出器使用默认值 0。

3) 从 Maya 导出后,您可以通过更改以下行来更改 OBJ 文件:

Kd 0.00 0.00 0.00

Kd 0.80 0.80 0.80

我已经在家里测试过了,你的模型看起来不错,让我知道进展如何?

关于javascript - 使用 Three.js 加载 Maya 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18607171/

相关文章:

javascript - 三个JS - 如何缩放移动的物体

javascript - 未捕获的语法错误 Three.js FontLoader

javascript - 限制在 jQuery Photowall 中显示的照片数量

javascript - PhoneGap/Cordova 在 Safari 中打开外部链接,而不是在 App 中全屏显示

jquery - 将鼠标悬停在图像上时定位 div/card

html - 如何创建一个 TD 左对齐且其兄弟项右对齐的表?

javascript - 基于球体顶点 ThreeJs 创建形状

javascript - 在异步函数上调用 `bind()` 部分有效

javascript - html5-canvas 在 slider 移动时绘制曲线

javascript访问嵌套标签前的文本