three.jsで多色グラデーション(その2)

three.jsで多色グラデーションの2回目。

前回の記事ではShaderMaterialを使った裏技グラデーションでしたが、今回は正攻法です。
以下は全ソース(html)です。

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>shade test</title>
  <script type="text/javascript" src="three.min.js"></script>
  <script type="text/javascript" src="OrbitControls.js"></script>
  <script type="text/javascript">
    var renderer;
    var camera;
    var controls;
    var scene;
    var container;
    var light;
    var light2;
    var mesh;
    var geometry;
    function shadetest() {
      init_threejs();
      init_scene();
      init_camera();
      init_light();
      init_object();
      reset_position();
      loop();
    }
    function init_threejs() {
      renderer = new THREE.WebGLRenderer({antialias: true});
      renderer.setClearColor(0xffffff, 1);
      renderer.setSize(1, 1);
      container = document.getElementById('canvas3d');
      container.appendChild(renderer.domElement);
    }
    function init_scene() {
      scene = new THREE.Scene();
    }
    function init_camera() {
      camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 100000);
      camera.up.x = 0;
      camera.up.y = 0;
      camera.up.z = 1;
      camera.position.set(0, 0, 5);
      controls = new THREE.OrbitControls(camera, renderer.domElement);
    }
    function init_light() {
      light = new THREE.DirectionalLight(0xcccccc, 1.6);
      light.position = new THREE.Vector3(-100, 500, 800);
      scene.add(light);
      light2 = new THREE.AmbientLight(0x333333);
      scene.add(light2);
    }
    function init_object() {
      var vertexPositions = [
        [-1.0, -1.0, 1.0],
        [0.0, -1.0, 1.0],
        [1.0, -1.0, 1.0],
        [-1.0, 0.0, 1.0],
        [0.0, 0.0, 1.0],
        [1.0, 0.0, 1.0],
        [-1.0, 1.0, 1.0],
        [0.0, 1.0, 1.0],
        [1.0, 1.0, 1.0]
      ];
      var vertexColors = [
        [1.0, 0.0, 0.0],
        [0.0, 1.0, 0.0],
        [0.0, 0.0, 1.0],
        [1.0, 1.0, 0.0],
        [0.0, 1.0, 1.0],
        [1.0, 0.0, 1.0],
        [0.5, 0.5, 0.0],
        [0.0, 0.5, 0.5],
        [0.5, 0.0, 0.5]
      ];
      var indices = [
        [0, 1, 4],
        [1, 2, 4],
        [2, 5, 4],
        [5, 8, 4],
        [8, 7, 4],
        [7, 6, 4],
        [6, 3, 4],
        [3, 0, 4]
      ];
      var geometry = new THREE.Geometry();
      for (var i = 0; i < vertexPositions.length; i++) {
        geometry.vertices.push(new THREE.Vector3(vertexPositions[i][0], vertexPositions[i][1], vertexPositions[i][2]));
      }
      for (var i = 0; i < indices.length; i++) {
        var face = new THREE.Face3(indices[i][0], indices[i][1], indices[i][2]);
        for (var j = 0; j < 3; j++) {
          var idx = indices[i][j];
          face.vertexColors[j] = new THREE.Color(vertexColors[idx][0], vertexColors[idx][1], vertexColors[idx][2]);
        }
        geometry.faces.push(face);
      }
      material = new THREE.MeshBasicMaterial({vertexColors: THREE.FaceColors});
      var mesh = new THREE.Mesh(geometry, material);
      mesh.position.set(0, 0, 0);
      scene.add(mesh);
    }
    function reset_position() {
      var sz = {w:container.offsetWidth, h:container.offsetHeight};
      renderer.setSize(sz.w, sz.h);
      camera.aspect = sz.w / sz.h;
      camera.updateProjectionMatrix();
    }
    function loop() {
      requestAnimationFrame(loop);
      controls.update();
      renderer.clear();
      renderer.render(scene, camera);
    }
  </script>
</head>
<body onload="shadetest();" onresize="reset_position();">
  <div id="canvas3d" style="width:300px;height:300px;">
  </div>
</body>
</html>

faceの頂点(vertexColors)にそれぞれ異なる色を設定するとfaceが多色グラデーションとなる。
face.colorが設定されていてもvertexColorsを優先するが、face.colorを優先したいなら、

face.vertexColors = [];

とすればOKだ。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です