代码之家  ›  专栏  ›  技术社区  ›  Huskie69

使用gui.dat更改three.js网格的颜色

  •  0
  • Huskie69  · 技术社区  · 7 年前

    我从STL文件加载了一个three.js网格:

        var loader = new THREE.STLLoader();         
        var materialmodel = new THREE.MeshPhongMaterial( 
            { 
                color: 0xFF0000, 
                specular: 0x222222, 
                shininess: 75 
            } 
            );
    
        function model()    
            {
    
                loader.load( 'models/stl/binary/model.stl', function ( geometry ) {
                    var meshMaterial = materialmodel;
                    var model = new THREE.Mesh( geometry, meshMaterial );
                    model.scale.set( 0.02, 0.02, 0.02 );        
                    model.castShadow = true;
                    model.receiveShadow = true;
                    model.geometry.center();                            
                    scene.add(model);
                    render();
                } );
            }
        model();
    

    我想用 dat.gui

    我的第一个实验是改变模型的颜色。

    我使用的代码是:

                var params = {
                    modelcolor: 0xff0000,  //RED
                };
    
                var gui = new dat.GUI();
                var folder = gui.addFolder( 'Model Colour' );
                folder.addColor( params, 'modelcolor' )
                    .name('Model Color')
                    .listen()
                    .onChange( function() { materialmodel.MeshPhongMaterial.color.set( params.modelcolor); } );                  
                folder.open();
    

    materialmodel.MeshPhongMaterial.color.set( params.modelcolor); (我尝试过不同的方法,但运气不好)。

    我看到一个帖子 here (答案之一)他们在哪里用 model.material.color.set(params.color)

    1 回复  |  直到 7 年前
        1
  •  4
  •   prisoner849    7 年前

    我不明白你为什么用这个 .listen()

    .onUpdate 你正在使用的函数 materialmodel ,这是一个材料本身,然后你设置 .MeshPhongMaterial 不存在的属性。看来你只是忽略了。

    下面是一个工作示例:

    var scene = new THREE.Scene();
    var camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 1, 1000);
    camera.position.set(0, 0, 10);
    var renderer = new THREE.WebGLRenderer();
    renderer.setSize(window.innerWidth, window.innerHeight);
    document.body.appendChild(renderer.domElement);
    
    var light = new THREE.DirectionalLight(0xffffff, 0.5);
    light.position.setScalar(10);
    scene.add(light);
    scene.add(new THREE.AmbientLight(0xffffff, 0.5));
    
    var materialmodel = new THREE.MeshPhongMaterial({
      color: 0xFF0000,
      specular: 0x222222,
      shininess: 75
    });
    var geometrymodel = new THREE.SphereBufferGeometry(5, 32, 16);
    
    var model = new THREE.Mesh(geometrymodel, materialmodel);
    scene.add(model);
    
    var params = {
      modelcolor: "#ff0000"
    };
    
    var gui = new dat.GUI();
    var folder = gui.addFolder('Model Colour');
    folder.addColor(params, 'modelcolor')
      .name('Model Color')
      .onChange(function() {
        materialmodel.color.set(params.modelcolor);
      });
    folder.open();
    
    
    render();
    
    function render() {
      requestAnimationFrame(render);
      renderer.render(scene, camera);
    }
    body {
      overflow: hidden;
      margin: 0;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/96/three.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/dat-gui/0.7.2/dat.gui.min.js"></script>