function update_cb(){ robot_calc(); track_calc(); m_trans.set_translation(carcass, robot.geom.x*sys.scale, robot.geom.z*sys.scale, -robot.geom.y*sys.scale); m_trans.set_rotation_euler(carcass, 0, -robot.geom.a, 0); var al = robot.track.left/robot.wheel.R; var ar = robot.track.right/robot.wheel.R; m_trans.set_rotation_euler_rel(wheel_FL, -al, 0, 0); m_trans.set_rotation_euler_rel(wheel_BL, -al, 0, 0); m_trans.set_rotation_euler_rel(wheel_FR, -ar, 0, 0); m_trans.set_rotation_euler_rel(wheel_BR, -ar, 0, 0); for(var i=0;i<robot.track.count*2;i++){ var track=tracks[i]; m_trans.set_rotation_euler(track, robot.track.pos[i].a, -robot.geom.a, 0); m_trans.set_translation_obj_rel(track, robot.track.pos[i].z*sys.scale, robot.track.pos[i].x*sys.scale, robot.track.pos[i].y*sys.scale, carcass); } //dt+=0.1; //m_lights.set_day_time(dt); //var dmin = 7+robot.move*5; //var dmax = dmin+robot.move*5; //m_cons.append_follow(camobj, carcass, dmin, dmax) }
function MouseRot(event) { mouseX = event.clientX - windowHalfX; mouseY = event.clientY - windowHalfY; var rotAtoR = mouseX * (Math.PI/180) * 0.025; var TyreFL = m_scs.get_object_by_name("TyreFL"); var TyreFR = m_scs.get_object_by_name("TyreFR"); m_trans.set_rotation_euler(TyreFL, 0, rotAtoR, 0); m_trans.set_rotation_euler(TyreFR, 0, Math.PI + rotAtoR, 0); }
function tyreRot() { var rotAtoR = mouseX * (Math.PI/180) * 0.025; var curTime = Date.now(); console.log(curTime); var TyreFL = m_scs.get_object_by_name("TyreFL"); var TyreFR = m_scs.get_object_by_name("TyreFR"); m_trans.set_rotation_euler(TyreFL, curTime, rotAtoR, 0); m_trans.set_rotation_euler(TyreFR, curTime, Math.PI + rotAtoR, 0); }
function update_cb(){ robot_calc(); track_calc(); m_trans.set_translation(carcass, robot.geom.x*sys.scale, robot.geom.z*sys.scale, -robot.geom.y*sys.scale); m_trans.set_rotation_euler(carcass, 0, -robot.geom.a, 0); var al = robot.track.left/robot.wheel.R; var ar = robot.track.right/robot.wheel.R; m_trans.set_rotation_euler_rel(wheel_FL, -al, 0, 0); m_trans.set_rotation_euler_rel(wheel_BL, -al, 0, 0); m_trans.set_rotation_euler_rel(wheel_FR, -ar, 0, 0); m_trans.set_rotation_euler_rel(wheel_BR, -ar, 0, 0); for(var i=0;i<robot.track.count*2;i++){ var track=tracks[i]; m_trans.set_rotation_euler(track, robot.track.pos[i].a, -robot.geom.a, 0); m_trans.set_translation_obj_rel(track, robot.track.pos[i].z*sys.scale, robot.track.pos[i].x*sys.scale, robot.track.pos[i].y*sys.scale, carcass); } }
function makeTyreCopy() { var TyreFL = m_scs.get_object_by_name("TyreFL"); var TyreFtoB = m_obj.copy(TyreFL, "TyreBL", false); var TyreFtoR = m_obj.copy(TyreFL, "TyreFR", false); var TyreRtoB = m_obj.copy(TyreFL, "TyreRB", false); m_trans.move_local(TyreFtoB, 0, 0, -18); m_trans.move_local(TyreFtoR, -10, 0, 0); m_trans.set_rotation_euler(TyreFtoR, 0, Math.PI, 0); m_trans.move_local(TyreRtoB, -10, 0, -18); m_trans.set_rotation_euler(TyreRtoB, 0, Math.PI, 0); m_scs.append_object(TyreFtoB); m_scs.append_object(TyreFtoR); m_scs.append_object(TyreRtoB); }
/** * Clones the "Sphere" object to designated empty objects. Responsible for * generating random seeds used for rotation and rotation animation, * ensuring minimum scale culling attribute. */ function setup_spheres(){ for (var i = 0; i < sphere_empties.length; i++) { var empty = sphere_empties[i]; var emptyLocation = m_trans.get_translation(empty); var currentObject = m_obj.copy(sphere, "Sphere"+i, false); currentObject.random1 = Math.random(); currentObject.random2 = Math.random(); currentObject.random3 = Math.random(); currentObject.isAdded = false; m_trans.set_translation(currentObject, emptyLocation[0],emptyLocation[1],emptyLocation[2]); m_trans.set_rotation_euler(currentObject, Math.random()*180,Math.random()*180,Math.random()*180); var candid_scale = currentObject.random1*currentObject.random2; if (candid_scale < sphere_scale_min){ candid_scale = sphere_scale_min; } m_trans.set_scale(currentObject, candid_scale); sphere_objects.push(currentObject); } }
/** * Updates the current frame, and performs Camera-Range-Based-Culling. * If there is a change in frame will run through a series of conditionals * defining animation behaviors based on dynamic (baked-audio driven) or * hard-coded values. * @param {Object3D} obj [Object 3D, or null to denote the global object] * @param {String} id [Sensor's ID] * @param {Number} pulse [Additional callback condition, +1 or -1] */ function anim_cb(obj, id, pulse) { get_frame(); append_to_scene(); if (frame != prev_frame){ m_geom.set_shape_key_value(sphere, "dispOne", prop(0)); m_geom.set_shape_key_value(sphere, "dispFour", prop(3)); m_geom.set_shape_key_value(sphere, "defTwo", prop(2)); m_geom.set_shape_key_value(sphere, "defThree", prop(1)+prop(7)); m_geom.set_shape_key_value(sphere, "pacif", prop(4)); for (var i = 0; i < sphere_objects.length; i++){ var currObj = sphere_objects[i]; var d1 = degree(currObj.random1); var d2 = degree(currObj.random2); var d3 = degree(currObj.random3); var prop1 = prop_channel(currObj.random1); var prop2 = prop_channel(currObj.random2); var prop3 = prop_channel(currObj.random3); m_trans.set_rotation_euler(currObj, d1 + prop(prop1), d2 + prop(prop2),d3 + prop(prop3)); } if (frame < 5){ m_obj.set_nodemat_value(tunnel, ["Tunnel", "sky_hue"], 0); m_obj.set_nodemat_value(sphere, ["Sphere", "alpha_value"], 0); m_obj.set_nodemat_value(tunnel, ["Tunnel", "alpha_value"], 0); m_obj.set_nodemat_value(tunnel, ["Tunnel", "skin_tone"], 0); m_obj.set_nodemat_value(tunnel, ["Tunnel", "wire_orig"], 1); } if (frame > 787 && frame < 1312) { m_obj.set_nodemat_value(sphere, ["Sphere", "alpha_value"], prop(2)); } if (frame > 1313 && frame < 2355) { if (prop(3) > 1) { m_obj.set_nodemat_value(tunnel, ["Tunnel", "alpha_value"], 1); } else { m_obj.set_nodemat_value(tunnel, ["Tunnel", "alpha_value"], 0); } } if (frame > 2356 && frame < 3411) { m_obj.set_nodemat_value(tunnel, ["Tunnel", "sky_hue"], prop(0)); m_scene.set_mb_params({mb_factor: prop(6), mb_decay_threshold: prop(6)}); if (prop(6) > 0.3) m_obj.set_nodemat_value(tunnel, ["Tunnel", "wire_orig"], 1); else m_obj.set_nodemat_value(tunnel, ["Tunnel", "wire_orig"], 0); } if (frame == 2356){ m_obj.set_nodemat_value(tunnel, ["Tunnel", "alpha_value"], 1); } if (frame>4200) { m_obj.set_nodemat_value(tunnel, ["Tunnel", "skin_tone"], (frame-4200)/(4584-4200)); m_obj.set_nodemat_value(sphere, ["Sphere", "alpha_value"], (4584 - frame)/(4584-4200)); } if (frame > 4436) { if (prop(7) > 0.245) { m_obj.set_nodemat_value(tunnel, ["Tunnel", "wire_orig"], 0); } else { m_obj.set_nodemat_value(tunnel, ["Tunnel", "wire_orig"], 1); m_obj.set_nodemat_value(tunnel, ["Tunnel", "sky_hue"], 0); } } prev_frame = frame; } }
/** * Data loaded callback. Executed when the data loading process has been completed. * @param {Number} data_id [Data ID] */ function load_cb(data_id) { m_app.enable_camera_controls(); camera = m_scene.get_active_camera(); if (is_vr != null) { var fov = 200; m_cam.set_hmd_fov(camera, [fov, fov, fov, fov], [fov, fov, fov, fov]) } // Set Oculus parameters if (is_vr == 0) { m_scene.set_hmd_params({ enable_hmd_stereo: true, distortion_scale: 1, inter_lens_dist: 0.064, base_line_dist: 0.035, screen_to_lens_dist: 0.039, distortion_coefs : [0.22, 0.28], chromatic_aberration_coefs : [-0.015, 0.02, 0.025, 0.02] }); } // Set Cardboard V1 parameters if (is_vr == 1) { m_scene.set_hmd_params({ enable_hmd_stereo: true, distortion_scale: 1, inter_lens_dist: 0.060, base_line_dist: 0.035, screen_to_lens_dist: 0.042, distortion_coefs: [0.441, 0.156], chromatic_aberration_coefs : [0.0, 0.0, 0.0, 0.0] }); } // Set Cardboard V2 parameters if (is_vr == 2) { m_scene.set_hmd_params({ enable_hmd_stereo: true, distortion_scale: 1, inter_lens_dist: 0.064, base_line_dist: 0.035, screen_to_lens_dist: 0.039, distortion_coefs: [0.34, 0.55], chromatic_aberration_coefs : [0.0, 0.0, 0.0, 0.0] }); } // Create rotation sensors and reset camera rotation if device is mobile and supports gyroscope if (is_mobile && m_inp.can_use_device(m_inp.DEVICE_GYRO)){ create_rotation_sensors(); m_trans.set_rotation_euler(camera, 0,0,0); } // Setup camera/mouse relationship if regular experience requested if (!is_mobile && is_vr == null) { var canvas_elem = m_cont.get_canvas(); canvas_elem.addEventListener("mouseup", function(e) { m_mouse.request_pointerlock(canvas_elem, null, null, null, null, rot_cb); $(".regular-controls").hide(); }, false); m_mouse.set_plock_smooth_factor(camera_smooth_fact); } // Initialize root objects properties = m_scene.get_object_by_name("audio_baked"); tunnel = m_scene.get_object_by_name("mesh_tunnel"); shrub = m_scene.get_object_by_name("mesh_shrub"); sphere = m_scene.get_object_by_name("mesh_sphere"); sphere.random1 = Math.random(); sphere.random2 = Math.random(); sphere.random3 = Math.random(); spheres_parent = m_scene.get_object_by_name("parent_sphere"); sphere_empties = m_scene.get_object_children(spheres_parent); shrub_parent = m_scene.get_object_by_name("parent_plants"); shrub_empties = m_scene.get_object_children(shrub_parent); setup_scene(); // Setup eventListeners to allow for quality change window.addEventListener("keydown", function(e){ if(e.keyCode === 49 || e.keyCode === 97 && document.activeElement !== 'text') { _url = "/?quality=low&start=true"; window.location.assign(_url); } if(e.keyCode === 50 || e.keyCode === 98 && document.activeElement !== 'text') { _url = "/?quality=high&start=true"; window.location.assign(_url); } if(e.keyCode === 51 || e.keyCode === 99 && document.activeElement !== 'text') { _url = "/?quality=ultra&start=true"; window.location.assign(_url); } }); }