Three.jsのOrbitControlsをオブジェクトの中心で回転させる

OrbitControlsのデフォルトでは、ワールドの中心座標で回転する。
これをオブジェクトの中心で回転させたい。
OrbitControls.jsのソースを見ると、targetという変数がカメラの注視点のようだ。
これをオブジェクトの中心に変えれば良さそう。

やってみた。

<html>
  <head>
    <meta charset="utf-8" />
    <script src="./three.min.js"></script>
    <script src="./OrbitControls.js"></script>
    <script>
      window.addEventListener('load', init);
      function init() {
        const width = 960;
        const height = 540;
        const renderer = new THREE.WebGLRenderer({
          canvas: document.querySelector('#myCanvas')
        });
        renderer.setSize(width, height);
        const scene = new THREE.Scene();
        const camera = new THREE.PerspectiveCamera(45, width / height);
        camera.position.set(0, 0, 1000);
        const controls = new THREE.OrbitControls(camera);
        const mesh = new THREE.Mesh(
          new THREE.BoxGeometry(100, 100, 100),
          new THREE.MeshNormalMaterial()
        );
        mesh.position.set(300, 100, 100);
        scene.add(mesh);

        var axes = new THREE.AxisHelper(500);
        scene.add(axes);

        var add_line = function(obj, end_pos, color) {
          var start_pos = new THREE.Vector3(0, 0, 0);
          var g = new THREE.Geometry();
          g.vertices.push(start_pos);
          g.vertices.push(end_pos);
          var material = new THREE.LineBasicMaterial({linewidth: 4, color: color});
          var line = new THREE.Line(g, material);
          obj.add(line);
        }
        var cube_size = 100;
        var grid_count = 10;
        var grid_size = grid_count * cube_size;
        var grid = new THREE.GridHelper(grid_size, grid_count);
        grid.material.color = new THREE.Color(0xaaaaaa);
        scene.add(grid); 
        var grid_half = grid_size / 2;
        add_line(grid, new THREE.Vector3( grid_half, 0, 0 ), "#ff0000");
        add_line(grid, new THREE.Vector3( 0, grid_half, 0 ), "#00ff00");
        add_line(grid, new THREE.Vector3( 0, 0, grid_half ), "#0000ff");

        document.addEventListener("keydown", function(event) {
          if(event.code == 'Escape') {
            if(controls.target.x == controls.target0.x &&
               controls.target.y == controls.target0.y &&
               controls.target.z == controls.target0.z) {
              controls.target.set(300, 100, 100);
              controls.update();
            } else {
              controls.target.copy(controls.target0);
              controls.update();
            }
          }
        });
        tick();
        function tick() {
          renderer.render(scene, camera);
          requestAnimationFrame(tick);
        }
      }
    </script>
  </head>
  <body>
    <canvas id="myCanvas"></canvas>
  </body>
</html>

keydownでOrbitControlsの注視点を切り替える。
target0はtargetの初期状態だ。

サンプルの再生
※ESCキーで「ワールドの中心座標」と「オブジェクトの中心」がトグルします。

コメントを残す

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