【问题标题】:How to change the color of a cube with Three.js如何使用 Three.js 更改立方体的颜色
【发布时间】:2015-11-22 00:05:55
【问题描述】:

我想根据单选按钮选择来更改立方体的颜色。如何通过平稳过渡实现这一目标?

单选按钮

<input id="black" type="radio" data-color="black" name="color" value="" checked="checked">
<input id="white" type="radio" data-color="white" name="color" value="">
<input id="blue" type="radio" data-color="chamois" name="color" value="">

材质

var color = {

    "black": new THREE.MeshPhongMaterial({
        color: 0x222222
    }),
    "white": new THREE.MeshPhongMaterial({
        color: 0xffffff
    }),
    "chamois": new THREE.MeshPhongMaterial({
        color: 0xEDE6D4
    })

}

几何

var geometry= new THREE.BoxGeometry(2,2,2);
var mesh = new THREE.Mesh(geometry, color [ "black" ]);
scene.add(mesh );

【问题讨论】:

    标签: javascript jquery three.js


    【解决方案1】:

    我发现材质的颜色可以直接补间!

    var targetColor = new THREE.Color(0xafe2f3);
    TweenMax.to( object.material.color, 2, {
                    r: targetColor.r,
                    g: targetColor.g,
                    b: targetColor.b
    });
    

    【讨论】:

      【解决方案2】:

      幸运的是,我不久前实现了一个解决方案 - 只要你不介意使用补间库(我使用 GSAP),这段代码就可以很好地工作。

      这里只是颜色补间代码(为简洁起见):

      function colorTo (target, value){
          var target = scene.getObjectByName(target);
          var initial = new THREE.Color(target.material.color.getHex());
          var value = new THREE.Color(value.color.getHex());
      
          TweenLite.to(initial, 1, {     //This syntax is relevant to GSAP's TweenLite, I'll provide a link to the docs
              r: value.r,
              g: value.g,
              b: value.b,
              ease: Cubic.easeInOut,
              onUpdate: function() { target.material.color = initial; }
          });
      }
      

      Link to full code in fiddle

      记住,这个小提琴起作用的原因是因为我链接到两个外部库:

      1. three.min.js
      2. TweenMax.min.js

      如果您有任何问题,请给我留言,我一定会回答的!

      Link to the GSAP TweenLite docs


      编辑

      我已更新答案以包含使用单选按钮触发补间的功能。重要的是,当您创建网格时,您实例化 new THREE.Material() 而不是 引用已经在 color 数组中的材质。像这样:

      var mesh = new THREE.Mesh(geometry, new THREE.MeshBasicMaterial({ color: 0x222222})); 
      

      然后将它链接到无线电控件完全没有问题:

      $("#inputs input").change(function(event){
          if ($(this).prop("checked")) {
              var targetColor = $(this).data("color");
              colorTo("box", color[targetColor]);
          }
      });
      

      编辑 2

      在前面的示例中,我使用了一个超轻量级补间插件 (&lt; 340 B),不幸的是(我不知道)它正在等待退役。此后,我更新了示例,使用了一个更通用、因此更重的库,称为 GSAP - 尽管如此,它仍然是一个令人难以置信 能力和闪电般快速的库,所以我会毫不犹豫地使用它。

      最后一次(希望如此),编码愉快!

      【讨论】:

      • 酷。感谢分享!您知道如何将其与单选按钮连接吗?因此,如果选中第二个单选按钮,则该框为白色。
      • @AlexanderHein 正在研究解决方案 - 目前它在两种颜色之间进行补间,但没有变回黑色。 Here's my progress
      • @AlexanderHein 查看我的编辑,全部完成!
      • 你太棒了乔纳森·布鲁克斯!谢谢。
      • 您有更新整个材料的解决方案吗? jsfiddle.net/dz9zbk7d
      猜你喜欢
      • 1970-01-01
      • 2012-12-20
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      • 2013-02-02
      • 1970-01-01
      • 2017-01-18
      • 2019-10-22
      相关资源
      最近更新 更多