開車

by FatHomebody

HTML

<div id="info">
  hw1 開車<br/>
  Home啟動引擎,上下鍵加減速,左右鍵控制方向,空白鍵煞車,z鍵切換視角<br/>
  <button id="toggle" style="margin-top:10px;font-size:18px;">切換視角</button><br/>
  車速: <span id='curCarPower'></span>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/84/three.min.js"></script>
<script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>
<script src="https://jyunming-chen.github.io/tutsplus/js/KeyboardState.js"></script>
<script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>

CSS

#info {
  position: absolute;
  top: 2%;
  width: 100%;
  padding: 10px;
  text-align: center;
  color: #ffff00
}

body {
  overflow: hidden;
}

JavaScript

var scene, renderer;
var curCamera, camera1, camera2; //camera1:上帝視角,camera2:第三人稱視角
var keyboard = new KeyboardState();
var clock;
var cameraStatus = true;

var myCar;
var carStatus = false;
var pos = new THREE.Vector3(); //位移
var vel = new THREE.Vector3(); //速度
var force = new THREE.Vector3(); //阻力
var power, angle;

//使速度永遠介於min跟max之間
(function() {
  Math.clamp = function(val, min, max) {
    return Math.min(Math.max(val, min), max);
  }
})();

init();
animate();
//切換視角
$("#toggle").click(
  function() {
    cameraStatus = !cameraStatus;
  }
);

function init() {
  clock = new THREE.Clock();
  renderer = new THREE.WebGLRenderer({
    antialias: true
  });
  renderer.setSize(window.innerWidth, window.innerHeight);
  renderer.setClearColor(0x888888);
  document.body.appendChild(renderer.domElement);

  scene = new THREE.Scene();

  camera1 = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 1, 1000);
  camera1.position.set(0, 270, 200);
  camera1.lookAt(new THREE.Vector3())

  camera2 = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 1, 1000);

  //let controls = new THREE.OrbitControls(camera1, renderer.domElement);
  //controls.enableKeys = false;

  /*建立車子模型*********************************************/
  let geometry = new THREE.Geometry();
  geometry.vertices.push(new THREE.Vector3(30, 0, 0))
  geometry.vertices.push(new THREE.Vector3(-5, 0, -10))
  geometry.vertices.push(new THREE.Vector3(0, 10, 0))
  geometry.vertices.push(new THREE.Vector3(-5, 0, 10))

  geometry.faces.push(new THREE.Face3(0, 1, 2))
  geometry.faces.push(new THREE.Face3(0, 2, 3))
  geometry.faces.push(new THREE.Face3(1, 3, 2))
  geometry.faces.push(new THREE.Face3(0, 3, 1))

  geometry.computeBoundingSphere();
  geometry.computeFaceNormals();
  geometry.computeVertexNormals();

  myCar = new THREE.Mesh(geometry, new THREE.MeshNormalMaterial())
  scene.add(myCar);
  myCar.position.set(-50, 0, 50)
  myCar.rotation.y = Math.PI * 1 / 4;

 ...