UNPKG

use-on-demand

Version:
206 lines 8.15 kB
// 'use strict'; var THREE = require('three'); // 85版本、95版本 import { xX_MyThree_Util } from './utils'; var xX_Car = /** @class */ (function () { function xX_Car(color) { var colors = [0x2cbab2, 0x47a700, 0xd60000, 0x087f87, 0x37ad0e, 0x4d4d4d, 0xce7e00, 0xe0a213, 0x87bcde]; var index = Math.floor(Math.random() * colors.length); this.color = color || colors[index]; this.mesh = new THREE.Object3D(); this.wheels = []; this.startAngle = 0; this.addBody(); // 车身 this.addWindows(); // 车窗 this.addLights(); // 灯光 this.addWheels(); // 车轮 } xX_Car.prototype.createWheel = function () { var wheel = new THREE.Object3D(); var wheelOuterGeometry = new THREE.CylinderGeometry(3, 3, 3, 32); wheelOuterGeometry.rotateX(0.5 * Math.PI); var wheelOuter = xX_MyThree_Util.makeMesh('lambert', wheelOuterGeometry, 0x000000); wheel.add(wheelOuter); var wheelInner = xX_MyThree_Util.makeMesh('lambert', wheelOuterGeometry, 0xdddddd); wheelInner.castShadow = false; wheelInner.scale.set(0.8, 0.8, 1.1); wheel.add(wheelInner); var wheelCenterGeometry = new THREE.CylinderGeometry(1, 1, 3.6, 4); wheelCenterGeometry.rotateX(0.5 * Math.PI); var wheelCenter = xX_MyThree_Util.makeMesh('lambert', wheelCenterGeometry, 0xa7a7a7); wheelCenter.castShadow = false; wheel.add(wheelCenter); return wheel; }; xX_Car.prototype.addWheels = function () { var wheelFrontLeft = this.createWheel(); wheelFrontLeft.position.set(8, 3, -6); this.wheels.push(wheelFrontLeft); this.mesh.add(wheelFrontLeft); var wheelFrontRight = this.createWheel(); wheelFrontRight.position.set(8, 3, 6); this.wheels.push(wheelFrontRight); this.mesh.add(wheelFrontRight); var wheelBackLeft = this.createWheel(); wheelBackLeft.position.set(-8, 3, 6); this.wheels.push(wheelBackLeft); this.mesh.add(wheelBackLeft); var wheelBackRight = this.createWheel(); wheelBackRight.position.set(-8, 3, -6); this.wheels.push(wheelBackRight); this.mesh.add(wheelBackRight); }; xX_Car.prototype.addLights = function () { var carLightsGeometry = new THREE.Geometry(); var carLigetGeometry = new THREE.BoxGeometry(2, 2, 2); var carLightsPosition = [ [12.5, 7.1, 6.1], [12.5, 7.1, -6.1], [-14, 7.1, 6.1], [-14, 7.1, -6.1], ]; carLightsPosition.forEach(function (elem) { var x = elem[0], y = elem[1], z = elem[2]; var geometry = carLigetGeometry.clone(); geometry.translate(x, y, z); carLightsGeometry.merge(geometry); }); var carLightFrontGeometry = carLigetGeometry.clone(); carLightFrontGeometry.scale(1, 1.3, 7.1); carLightFrontGeometry.translate(12.1, 3.3, 0); carLightsGeometry.merge(carLightFrontGeometry); var carLightBackGeometry = carLightFrontGeometry.clone(); carLightBackGeometry.translate(-26, 0, 0); carLightsGeometry.merge(carLightBackGeometry); carLightsGeometry = new THREE.BufferGeometry().fromGeometry(carLightsGeometry); var carLights = xX_MyThree_Util.makeMesh('phong', carLightsGeometry, 0xffffff); this.mesh.add(carLights); }; xX_Car.prototype.addWindows = function () { var carWindows = new THREE.Object3D(); var carWindowLeft = new THREE.Object3D(); var carWindowLeftFrontCoords = [ [-2, 8], [4, 8], [2.5, 12], [-2, 12], ]; var carWindowLeftFront = this.makeWindow(carWindowLeftFrontCoords); carWindowLeft.add(carWindowLeftFront); var carWindowLeftBackCoords = [ [-9, 8], [-3, 8], [-3, 12], [-7.5, 12], ]; var carWindowLeftBack = this.makeWindow(carWindowLeftBackCoords); carWindowLeft.add(carWindowLeftBack); carWindowLeft.position.z = 7.1; carWindows.add(carWindowLeft); var carWindowRight = carWindowLeft.clone(); carWindowRight.position.z = -7.1; carWindows.add(carWindowRight); var carWindowFrontGeometry = new THREE.CubeGeometry(0.1, 5, 12); carWindowFrontGeometry.rotateZ(0.12 * Math.PI); carWindowFrontGeometry.translate(4.2, 10, 0); var carWindowFront = xX_MyThree_Util.makeMesh('phong', carWindowFrontGeometry, 0x000000); carWindows.add(carWindowFront); var carWindowBack = carWindowFront.clone(); carWindowBack.rotation.z = -0.24 * Math.PI; carWindowBack.position.x = -19; carWindowBack.position.y = 6; // carWindowFrontGeometry.translate(4.2,10,7) carWindows.add(carWindowBack); this.mesh.add(carWindows); }; xX_Car.prototype.addBody = function () { var carBodyCoords = [ [-13, 2], [13, 2], [13, 8], [5, 8], [3, 13], [-8, 13], [-10, 8], [-13, 8], [-13, 2], ]; var carBodyShape = xX_MyThree_Util.makeShape(carBodyCoords); var carBodyGeometry = xX_MyThree_Util.makeExtrudeGeometry(carBodyShape, 14); carBodyGeometry.translate(0, -7, 0); carBodyGeometry.rotateX(0.5 * Math.PI); var carBody = xX_MyThree_Util.makeMesh('phong', carBodyGeometry, this.color); this.mesh.add(carBody); }; xX_Car.prototype.makeWindow = function (coords) { var windowColor = 0x000000; var shape = xX_MyThree_Util.makeShape(coords); var geometry = xX_MyThree_Util.makeExtrudeGeometry(shape, 0.1); geometry.rotateX(0.5 * Math.PI); var mesh = xX_MyThree_Util.makeMesh('phong', geometry, windowColor); mesh.castShadow = false; return mesh; }; // // // xX_Car.prototype.setPosition = function (x, y, z) { this.mesh.position.set(x, y, z); }; xX_Car.prototype.forward = function (speed) { speed = speed || 1; this._moving(speed, true); }; xX_Car.prototype.backward = function (speed) { speed = speed || 1; this._moving(speed, false); }; xX_Car.prototype.turnLeft = function (angle, speed) { this._turn(angle, true, speed); }; xX_Car.prototype.turnRight = function (angle, speed) { this._turn(angle, false, speed); }; xX_Car.prototype._turn = function (angle, direction, speed) { var __direction = direction ? 1 : -1; if (speed) { if (this.startAngle < angle) { this.mesh.rotation.y += speed; this.startAngle += speed; if (angle - this.startAngle < speed) { var originAngle = this.mesh.rotation.y - this.startAngle; this.mesh.rotation.y = originAngle + angle; this.startAngle = 0; return; } } } else { this.mesh.rotation.y += angle * __direction; } }; xX_Car.prototype._moving = function (speed, direction) { var rotation = this.mesh.rotation.y; var __direction = direction ? 1 : -1; var xLength = speed * Math.cos(rotation) * __direction, zLength = speed * Math.sin(rotation) * __direction; this.mesh.position.x += xLength; this.mesh.position.z -= zLength; this._rotateWheels(speed); }; xX_Car.prototype._rotateWheels = function (speed) { this.wheels.forEach(function (elem) { elem.rotation.z -= 0.1 * speed; }); }; return xX_Car; }()); export default xX_Car; // // // // // // // // // //# sourceMappingURL=Car.js.map