javascript - 如何在更改顶点颜色后更新颜色?

标签 javascript three.js

我将整个(短)html 文件复制并粘贴到此处以说明问题。基本上,我创建了一个简单的三 Angular 形几何体作为全局变量。当您单击“红色”按钮时,将调用函数 red() 将三 Angular 形渲染为红色。问题是如果三 Angular 形已经呈现为红色,则单击“绿色”不会将其呈现为绿色。

<html>
    <body>
        <div id="container"></div>
        <button onclick="red()">Red</button>
        <button onclick="green()">Green</button>

        <script src="http://threejs.org/build/three.js"></script>
        <script>
        //Boilerplate stuff
        var w=300;
        var h=300;
        var renderer = new THREE.WebGLRenderer({antialias: true});
        renderer.setSize(w, h);
        document.getElementById('container').appendChild( renderer.domElement );

        var scene = new THREE.Scene();
        var light = new THREE.DirectionalLight(0xffffff);
        light.position.z = 10;
        scene.add(light);

        var camera = new THREE.PerspectiveCamera( 20, w / h, 1, 1000 );
        camera.position.z = 10;

        var materials = [new THREE.MeshPhongMaterial( { color: 0xffffff, shading: THREE.FlatShading, vertexColors: THREE.VertexColors, shininess: 0 } )];

        //Make a geometry        
        var shape = new THREE.Shape();
        shape.moveTo( 0,0 );
        shape.lineTo( 0, 1 );
        shape.lineTo( 1, 0);
        var geometry = new THREE.ShapeGeometry([shape]);
        var obj =  THREE.SceneUtils.createMultiMaterialObject(geometry, materials); 
        scene.add(obj);

        //
        function red()
        {
            change_color(new THREE.Color(0xff0000));
            renderer.render(scene, camera);
        }
        //
        function green()
        {
            change_color(new THREE.Color(0x00ff00));
            renderer.render(scene, camera);
        }
        //
        function change_color(color)
        {
            geometry.colorsNeedUpdate = true;
            for(var i=0;i<geometry.faces.length;i++)
            {
                if(geometry.faces[i].vertexColors[0]==undefined)
                {
                    geometry.faces[i].vertexColors[0]=color;
                }
                else
                {
                    geometry.faces[i].vertexColors[0].copy(color);
                }

                if(geometry.faces[i].vertexColors[1]==undefined)
                {
                    geometry.faces[i].vertexColors[1]=color ;
                }
                else
                {
                    geometry.faces[i].vertexColors[1].copy(color);
                }

                if(geometry.faces[i].vertexColors[2]==undefined)
                {
                    geometry.faces[i].vertexColors[2]=color;
                }
                else
                {
                    geometry.faces[i].vertexColors[2].copy(color);
                }
            }
        }

        </script>

    </body>
</html>

最佳答案

您在第一次渲染网格后更改顶点颜色。

目前,一旦对象至少被渲染一次,您就不能在 three.js 中使用以下模式。

geometry.faces[ i ].vertexColors[ 0 ] = color; // assigning a Color object

你必须改用这个模式:

geometry.faces[ i ].vertexColors[ 0 ].copy( color ); // or use set()

当顶点颜色更改时,您还必须设置 needsUpdate 标志。

geometry.colorsNeedUpdate = true;

因此,在您的程序中,您需要在创建几何体时为其添加顶点颜色。然后只需更改颜色值即可。

three.js r.77

关于javascript - 如何在更改顶点颜色后更新颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37358419/

相关文章:

javascript - 将下拉列表值传递给谷歌地图javascript

javascript - 如何在 THREE.js 中将自定义着色器应用于 Sprite

javascript - 模型使用 MeshBasicMaterial 但不使用 MeshPhongMaterial 进行渲染

javascript - 第一人称射击游戏用 three.js 控制

javascript - Jscrollpane 分页

javascript - 单击图标后编辑信息

javascript - 显示/隐藏从一个页面重定向到另一页面的内容

javascript - SASS child rule setting inside based on parent 下?

Three.js 带有触摸和/或滑动事件示例

javascript - 如何从 Canvas 合成渲染大比例图像