【问题标题】:Loading Maya model with Three.js使用 Three.js 加载 Maya 模型
【发布时间】:2013-09-07 13:36:20
【问题描述】:

我正在关注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);
        }

完整的JSLive 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

【问题讨论】:

    标签: javascript html three.js webgl maya


    【解决方案1】:

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

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

    JSONLoader 不仅会拉入几何体,还会拉入数组中的所有材质。 (参见: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 中。查看每种材料的 colorAmbientcolorDiffuse 属性。请注意,它们都是 [0.0, 0.0, 0.0]。这是 Maya 中一个已知的 obj 导出错误。所以你有 3 个选项来修复它。

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

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

    2) 在 Maya 中应用漫反射贴图之前,请务必先应用默认颜色值。出于某种原因,一旦地图打开,您将无法再访问颜色属性,并且导出器使用默认值 0。

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

    Kd 0.00 0.00 0.00
    

    Kd 0.80 0.80 0.80
    

    我已经在家里进行了测试,您的模型看起来不错,请告诉我情况如何?

    【讨论】:

    • #Darryl_Lehmann Live Link。我已经做了你建议我做的事。但模型上没有纹理,只有黑色。我错过了什么 ?请帮忙!
    • 不用担心,它工作正常。看看我编辑的答案,看看如何修复模型文件以正确显示。
    • #Darryl_Lehmann 有没有我可以换那种型号的布料?
    • 是的,这取决于您的最终目标,但是是的。如果你只是想改变面料的颜色,那就改变相关的纹理。如果你想改变整个服装,那么一些 3D 建模技巧就会发挥作用。否则,您可以在代码中逐个顶点更改几何顶点,但每次都会对性能造成相当大的影响(更改几何会导致转储并重建模型的整个存储结构)。希望有所帮助。
    • 我想改变纹理。我不想只改变整个模型的纹理。你能给我一些示例链接吗? my problem's link
    猜你喜欢
    • 1970-01-01
    • 2012-08-11
    • 2015-01-14
    • 2020-08-24
    • 1970-01-01
    • 2012-10-06
    • 2013-05-28
    • 2021-12-15
    • 2013-04-04
    相关资源
    最近更新 更多