gameProgramming_hw4

by chaiche

HTML

<div id="info">
  steer<br>
  當target被追到時會自動從新的位置開始<br>
  按下space change group steer<br>
  按下enter 停止group steer
</div>
<div id="which_steer">
Group steer: no
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r70/three.min.js"></script>
<script src="https://dl.dropboxusercontent.com/u/3587259/Code/Threejs/OrbitControls.js"></script>
<script src="https://jyunming-chen.github.io/tutsplus/js/KeyboardState.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/dat-gui/0.5/dat.gui.min.js"></script>

CSS

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

body {
  overflow: hidden;
}

JavaScript

var camera, scene, renderer, controls;
var keyboard = new KeyboardState();
var cylinder;

var reset_num = 0;
//ob
var obCen = new THREE.Vector3();
var obRad = 20;
var obs = [];

// steer related
var target = new THREE.Vector3 (0,0,-100);
var maxSpeed = 40;
var maxForce = 40;
var targetMesh;
var which_steer = 0;


//var power;
var mass=1;
var clock = new THREE.Clock();

var raycaster;
var mouse = new THREE.Vector2();
var pickables = [];

var models = [];

var ob_name =0;
var model_name = 1;
var Ob = function(rad){
	this.name = ob_name++;
	this.obRad = rad;
	this.mesh = new THREE.Mesh (new THREE.CircleGeometry (this.obRad,20));
  this.mesh.rotation.x = -Math.PI/2;
}

var Model = function(){
	this.name = "model : "+(model_name++);
	this.geometry = new THREE.BoxGeometry(15, 2, 5);
  this.material = new THREE.MeshBasicMaterial();
  this.mesh = new THREE.Mesh(this.geometry, this.material);
  
  this.pos = new THREE.Vector3();
  this.vel = new THREE.Vector3(10,0,0);
  this.force = new THREE.Vector3();
  this.maxSpeed = 60;
  this.maxForce = 60;
  
  this.angle;
  
  this.computeForce = function(){
    var ff = target.clone().sub (this.pos).setLength (this.maxSpeed).sub (this.vel);
    if (ff.length() > this.maxForce)
      ff.setLength (this.maxForce);
    this.force.copy (ff);
  }
}

Model.prototype.setPosition = function(x,y,z){
	this.pos = new THREE.Vector3(x,y,z);
}
Model.prototype.update = function(dt){
  
  this.computeForce();
  
  if(obs.length>0){
    var tmp_ob;
    var min=100000;
    for(var i =0;i<obs.length;i++){	if(this.pos.distanceTo(obs[i].mesh.position)+obs[i].obRad<min){
       tmp_ob = obs[i];
       min = this.pos.distanceTo(obs[i].mesh.position);
      }
    }
    var tmp = tmp_ob.mesh.position.clone().sub(this.pos);
    var tmpProj = tmp.clone().projectOnVector(this.vel);
    
    if (tmp.dot(this.vel) > 0) {
      if (tmpProj.clone().sub(tmp).length() < tmp_ob.obRad + 3) {
        if (tmpProj.length() < 5 *this.vel.length()) {
         ...