Newer
Older
2022-yuya / test / js / index.js
window.addEventListener('DOMContentLoaded', init);

function init() {
    // レンダラーを作成
  
    const renderer = new THREE.WebGLRenderer({
        canvas: document.querySelector('#canvas'),
        alpha: true,
    });
    // ウィンドウサイズ設定
    width = document.getElementById('main_canvas').getBoundingClientRect().width;
    height = document.getElementById('main_canvas').getBoundingClientRect().height;
    renderer.setPixelRatio(1);
    renderer.setSize(width, height);
    console.log(window.devicePixelRatio);
    console.log(width + ", " + height);
    
    
    // シーンを作成
    const scene = new THREE.Scene();
    scene.background = new THREE.Color( 0x87B8C0 ); // 背景色

// 座標軸を表示
const axes = new THREE.AxesHelper(400);
scene.add(axes)

    // カメラ設定
const camera = new THREE.PerspectiveCamera(60, width / height);
const controls = new THREE.PointerLockControls(camera,renderer.domElement);
controls.getObject().position.y = 10
// canvasクリックでポインタロック
scene.add(controls.getObject());
document.getElementById('main_canvas').addEventListener('click', function() {
  controls.lock(); 
});

let move = (function() {

  const SPEED = 60.0;

  let moveForward  = false;
  let moveBackward = false;
  let moveLeft     = false;
  let moveRight    = false;
  let prevTime     = performance.now();

  // キーダウンイベント設定
  document.addEventListener( 'keydown', function(e) {
    switch ( e.keyCode ) {
      case 87: // w
        moveForward = true;
        break;
      case 65: // a
        moveLeft = true;
        break;
      case 83: // s
        moveBackward = true;
        break;
      case 68: // d
        moveRight = true;
        break;
    }
  }, false );

  // キーアップイベント設定
  document.addEventListener( 'keyup', function(e) {
    switch ( e.keyCode ) {
      case 87: // w
        moveForward = false;
        break;
      case 65: // a
        moveLeft = false;
        break;
      case 83: // s
        moveBackward = false;
        break;
      case 68: // d
        moveRight = false;
        break;
    }
  }, false );

  return {
    getVelocity() {
      let time = performance.now();
      let delta = ( time - prevTime ) / 1000;
      let directionX = Number( moveLeft ) - Number( moveRight );
      let directionZ = Number( moveForward ) - Number( moveBackward );
      let velocity = new THREE.Vector3();
      velocity.x -= directionX * SPEED * delta;
      velocity.z -= directionZ * SPEED * delta;
      prevTime = time;
      return velocity;
    }
  }

})();

    // Load GLTF or GLB
    
    // フィールド作成
const geometry = new THREE.BoxGeometry(512, 8, 512, 10, 10, 1);
const material = new THREE.MeshPhongMaterial({color: 0xe29676});
const field = new THREE.Mesh(geometry, material);
field.position.y = -5;
scene.add(field);
// オブジェクト作成
scene.add(createBox(16, 16, 16, {x: -128, z: -128, y: 8}, 0x6c9bd2));
scene.add(createBox(16, 16, 16, {x: 128, z: -128, y: 8}, 0x9cbb1c));
scene.add(createBox(16, 16, 16, {x: -128, z: 128, y: 8}, 0x9cbb1c));
scene.add(createBox(16, 16, 16, {x: 128, z: 128, y: 8}, 0x6c9bd2));

// ボックスオブジェクトの生成関数
function createBox(x, y, z, position, color) {
  const geometry = new THREE.BoxGeometry(x, y, z);
  const material = new THREE.MeshPhongMaterial({color: color});
  const box = new THREE.Mesh(geometry, material);
  box.position.x = position.x;
  box.position.z = position.z;
  box.position.y = position.y;
  return box;
}
    renderer.outputEncoding = true;
    renderer.gammaFactor = 2.2;


    // 平行光源
    const light = new THREE.DirectionalLight(0xFFFFFF);
    light.intensity = 1; // 光の強さ
    light.position.set(3, 10, 1);
    // シーンに追加
    scene.add(light);


    //環境光源(アンビエントライト):すべてを均等に照らす、影のない、全体を明るくするライト
    const ambient = new THREE.AmbientLight(0xf8f8ff, 0.7);
    scene.add(ambient); //シーンにアンビエントライトを追加

    // 初回実行
   function tick() {
  let v = move.getVelocity();
  controls.getObject().translateX(v.x);
  controls.getObject().translateZ(v.z);
  renderer.render(scene, camera); // レンダリング

  requestAnimationFrame(tick);
}
}