Code:
c3dl.addMainCallBack(canvasMain, "gamewindow");
c3dl.addModel("models/us_soldier/us_soldier.dae");
var cam = new c3dl.FreeCamera();
var diffuse = new c3dl.PositionalLight();
var xcord = new c3dl.Line();
var ycord = new c3dl.Line();
var zcord = new c3dl.Line();
var speed = .1;
var speedCurrent = 0;
var speedMax = .1;
var acceleration = .05;
var decay = .4;
var piOver180 = Math.PI / 180;
var pos = [0,0,0]
var playerX = 0;
var playerZ = 0;
var viewportCoords = [0,0];
var worldCoords = [0,0,0];
var selEndWorldCoords = [0,0];
var mouse_left = false;
var mouse_right = false;
var destinationX = 0;
var destinationZ = 0;
var radians = Math.atan2(destinationZ, destinationX);
var degrees = radians / (Math.PI / 180);
var radians2 = degrees * (Math.PI / 180);
var oldyaw = 0;
var player = new c3dl.Collada();
function canvasMain(canvasName){
scn = new c3dl.Scene();
scn.setCanvasTag(canvasName);
renderer = new c3dl.WebGL();
renderer.createRenderer(this);
scn.setRenderer(renderer);
scn.init(canvasName);
scn.setBackgroundColor([0,0,0,0]);
scn.setAmbientLight([0,0,0,0]);
xcord.setColors([0,1,0],[0,1,0]);
xcord.setCoordinates([0,0,0], [50,0,0]);
xcord.setWidth(2);
ycord.setColors([0,0,1],[0,0,1]);
ycord.setCoordinates([0,0,0], [0,50,0]);
ycord.setWidth(2);
zcord.setColors([1,0,0],[1,0,0]);
zcord.setCoordinates([0,0,0], [0,0,50]);
zcord.setWidth(2);
player.init("models/us_soldier/us_soldier.dae");
cam.setPosition([150.0, 300.0, 150.0]);
cam.setLookAtPoint([0.0, 50.0, 0.0]);
diffuse.setName('diffuse');
diffuse.setPosition([50,100,50]);
diffuse.setDiffuse([0.8,0.8,0.8,1]);
diffuse.setOn(true);
if(renderer.isReady() ) {
scn.addObjectToScene(xcord);
scn.addObjectToScene(ycord);
scn.addObjectToScene(zcord);
scn.addObjectToScene(player);
scn.setCamera(cam);
scn.setUpdateCallback(update);
scn.addLight(diffuse);
scn.setMouseCallback(mouseUp, mouseDown, mouseMove, mouseWheel);
scn.startScene();
}
}
function update() {
pos = player.getPosition();
destinationX = worldCoords[0];
destinationZ = worldCoords[2];
if (lastTime != 0) {
elapsed = timeNow - lastTime;
if (speedCurrent < speedMax) speedCurrent += acceleration;
if ((destinationX-pos[0]) >> 0.000001) playerX += ((destinationX-pos[0]) * piOver180) * speedCurrent * elapsed;
if ((destinationZ-pos[2]) >> 0.000001) playerZ += ((destinationZ-pos[2]) * piOver180) * speedCurrent * elapsed;
if (mouse_left) {
radians = Math.atan2((destinationZ-pos[2]), (destinationX-pos[0]));
degrees = (radians / (Math.PI / 180));
radians2 = (degrees * (Math.PI / 180));
}
}
PlayerMovement();
PlayerRotation();
}
function PlayerMovement() {
if (speedCurrent != 0) {
player.setPosition([playerX,0,playerZ]);
cam.setPosition([playerX+150,300,playerZ+150]);
cam.setLookAtPoint([playerX, 50.0, playerZ]);
diffuse.setPosition([playerX+50,100,playerZ+50]);
}
}
function PlayerRotation() {
if (radians!=oldyaw) {
player.yaw((oldyaw-radians2));
oldyaw=radians;
}
}
function mouseUp(e) {
switch(e.button) {
case 0: //left
mouse_left = false;
case 1: //middle
case 2: //right
mouse_right = false;
}
}
function mouseDown(e) {
switch(e.button) {
case 0: //left
mouse_left = true;
viewportCoords = getClickedCoords(e);
worldCoords = getWorldCoords(viewportCoords[0], viewportCoords[1]);
case 1: //middle
case 2: //right
mouse_right = true;
}
}
function mouseMove(e) {
if (mouse_left) {
viewportCoords = getClickedCoords(e);
worldCoords = getWorldCoords(viewportCoords[0], viewportCoords[1]);
}
}
function getClickedCoords(e){
var canvasPosition = c3dl.getObjectPosition(scn.getCanvas());
var X = e.clientX - canvasPosition[0];
var Y = e.clientY - canvasPosition[1];
return [X,Y];
}
function getWorldCoords(mmx, mmy) {
if (mmx != null && mmy != null) {
var normalizedDeviceCoords = [(2 * mmx / $("#gamewindow").width()) - 1, -((2 * mmy / $("#gamewindow").height()) - 1), 1, 1];
if (c3dl.isValidMatrix(scn.getProjectionMatrix())) {
var iproj = c3dl.inverseMatrix(scn.getProjectionMatrix());
var clipCoords = c3dl.multiplyMatrixByVector(iproj, normalizedDeviceCoords);
clipCoords[0] /= clipCoords[3];
clipCoords[1] /= clipCoords[3];
clipCoords[2] /= clipCoords[3];
clipCoords[2] = -clipCoords[2];
var rayInitialPoint = cam.getPosition();
var x = clipCoords[0];
var y = clipCoords[1];
var z = clipCoords[2];
var kludge = c3dl.multiplyVector(cam.getLeft(), -1);
var viewMatrix = c3dl.makePoseMatrix(kludge, cam.getUp(), cam.getDir(), cam.getPosition());
var rayTerminalPoint = c3dl.multiplyMatrixByVector(viewMatrix, [x, y, z, 0]);
var rayDir = c3dl.normalizeVector(rayTerminalPoint);
var angle = Math.acos(-1 * rayDir[1]);
var camHeight = rayInitialPoint[1];
var hyp = camHeight / Math.cos(angle);
selEndWorldCoords[0] = hyp * rayDir[0] + rayInitialPoint[0];
selEndWorldCoords[1] = hyp * rayDir[2] + rayInitialPoint[2];
return [selEndWorldCoords[0], hyp * rayDir[1], selEndWorldCoords[1]];
}
else return false;
}
else return false;
}
Bookmarks