【问题标题】:Three.js project, keeping camera centered on object in top down viewThree.js 项目,在自上而下的视图中保持相机以对象为中心
【发布时间】:2018-11-28 00:33:58
【问题描述】:

我正在用Three.js 编写一个自上而下的游戏,像Frogger 或其他经典街机游戏一样具有单方移动。当它移动时,我正在努力保持相机以主角为中心。现在我正在使用MapControls.js 进行按键控制,但是平移将相机移动了一定数量的像素,并且角色通过在z 或x 方向中设置它的位置+-10 来移动,而他们没有t 总是匹配的,所以当你在一个方向到达棋盘的尽头时,角色几乎离开了屏幕并且相机已经移动得太远了。我可以在保持平移效果移动的同时以某种方式连接向下看 y 轴的相机吗?

【问题讨论】:

  • 不是答案:考虑让角色和相机保持静止,然后平移棋盘。在这种情况下,您将不会使用 MapControls。

标签: javascript three.js


【解决方案1】:

为什么不直接将玩家的 x 和 z 复制到相机的呢?或者,每帧复制一部分。

 camera.position.lerp(player.position, 0.03);

示例。运行它,点击它,然后使用箭头键

'use strict';

/* global THREE */

function main() {
  const canvas = document.querySelector('#c');
  const renderer = new THREE.WebGLRenderer({canvas: canvas});

  const fov = 45;
  const aspect = 2;  // the canvas default
  const near = 0.1;
  const far = 100;
  const camera = new THREE.PerspectiveCamera(fov, aspect, near, far);
  // make the camera look down
  camera.position.set(0, 10, 0);
  camera.up.set(0, 0, -1);
  camera.lookAt(0, 0, 0);
  
  const scene = new THREE.Scene();
  scene.background = new THREE.Color('black');

  scene.add(new THREE.GridHelper(40, 40));
     
  let player;
  {
    const cubeSize = 1;
    const cubeGeo = new THREE.BoxBufferGeometry(cubeSize, cubeSize, cubeSize);
    const cubeMat = new THREE.MeshBasicMaterial({color: 'red'});
    player = new THREE.Mesh(cubeGeo, cubeMat);
    player.position.set(.5, .5, .5);
    scene.add(player);
  }

  function resizeRendererToDisplaySize(renderer) {
    const canvas = renderer.domElement;
    const width = canvas.clientWidth;
    const height = canvas.clientHeight;
    const needResize = canvas.width !== width || canvas.height !== height;
    if (needResize) {
      renderer.setSize(width, height, false);
    }
    return needResize;
  }

  function render() {

    if (resizeRendererToDisplaySize(renderer)) {
      const canvas = renderer.domElement;
      camera.aspect = canvas.clientWidth / canvas.clientHeight;
      camera.updateProjectionMatrix();
    }
    
    camera.position.lerp(player.position, 0.03);
    camera.position.y = 10; // keep the elevation;

    renderer.render(scene, camera);

    requestAnimationFrame(render);
  }

  requestAnimationFrame(render);
  
  window.addEventListener('keydown', (e) => {
    e.preventDefault();
    switch (e.keyCode) {
      case 38: // up
        player.position.z -= 1;
        break;
      case 40: // down
        player.position.z += 1;
        break;
      case 37: // left
        player.position.x -= 1;
        break;
      case 39: // right
        player.position.x += 1;
        break;
    }
  });
}

main();
html, body {
  margin: 0;
  height: 100%;
}
#c {
  width: 100%;
  height: 100%;
  display: block;
}
<canvas id="c"></canvas>
<script src="https://threejsfundamentals.org/threejs/resources/threejs/r98/three.min.js"></script>

将 0.03 增大到一个较大的数字,以使相机更快地追上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    相关资源
    最近更新 更多