zdog实现三维蒸汽幽灵房屋效果代码
代码语言:html
所属分类:三维
代码描述:zdog实现三维蒸汽幽灵房屋效果代码,鼠标拖动可切换视角。
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8"> <style> body { background: #1B2838; color: #EEE; } .zdog-canvas { display: block; margin: 0 auto; cursor: move; } </style> </head> <body> <!-- partial:index.partial.html --> <canvas class="zdog-canvas" width="750" height="750"></canvas> <!-- partial --> <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/zdog.dist.js"></script> <script > // namespace window.ZdogSpookyHouse = { wobbling: true, sceneY: 12, hillScale: 0.75, color: { deep: 'hsl(230, 60%, 40%)', dark: 'hsl(230, 60%, 50%)', darker: '#2a3a81', medium: 'hsl(230, 60%, 60%)', light: 'hsl(230, 60%, 70%)', pale: '#6D77AD', highlight: '#FFB', fog: 'hsla(230, 60%, 80%, 0.4)', paintjob: '#d59c55', } }; // ------------------------- bones ------------------------- // ZdogSpookyHouse.addBones = function( options ) { var TAU = Zdog.TAU; var lineX = 2; var color = ZdogSpookyHouse.color.light; var stroke = 1.3; var line = new Zdog.Shape({ addTo: options.addTo, path: [ { x: -lineX }, { x: lineX } ], closed: false, stroke: stroke, color: color, translate: { y: 12, z: -30 }, rotate: { y: TAU/16, z: TAU/16 }, }); var halfFemur = line.copy({ translate: { x: -6, y: 15, z: -28 }, rotate: { y: -TAU/8, z: TAU/8 }, }); var femurEnd = line.copy({ addTo: halfFemur, path: [ { x: 1, y: -1 }, { x: 0, y: 0 }, { x: 1, y: 1 }, ], closed: false, rotate: null, translate: { x: lineX }, }); halfFemur.copyGraph({ translate: { x: 1, y: 6, z: -31 }, rotate: { z: -TAU/8, x: TAU/8 }, scale: 0.75, }); line.copy({ scale: 0.25, translate: { y: 18, z: -26 }, rotate: { z: TAU/8 }, }); var fullFemur = halfFemur.copyGraph({ translate: { x: -9, y: 10, z: -30 }, rotate: { z: -TAU/16 }, }); femurEnd.copy({ addTo: fullFemur, scale: { x: -1 }, translate: { x: -lineX }, }); line.copy({ scale: 0.4, translate: { x: -12, y: 14, z: -28 }, rotate: { z: -TAU/16 }, }); }; // ------------------------- car & road ------------------------- // ZdogSpookyHouse.addCarRoad = function( options ) { var color = ZdogSpookyHouse.color; var TAU = Zdog.TAU; var roadRadius = 120; var roadSegmentCount = 40; var roadSegmentZ = 5; var roadSegmentX = (roadRadius + roadSegmentZ) * TAU / roadSegmentCount / 2; var roadSegmentPath = [ { x: -roadSegmentX + 1, z: roadSegmentZ }, { x: roadSegmentX - 1, z: roadSegmentZ }, { x: roadSegmentX, z: -roadSegmentZ }, { x: -roadSegmentX, z: -roadSegmentZ }, ]; for ( var i = 0; i < roadSegmentCount; i++ ) { var roadAngle = i/roadSegmentCount * TAU; new Zdog.Shape({ addTo: options.addTo, path: roadSegmentPath, translate: { x: Math.cos( roadAngle ) * roadRadius, z: Math.sin( roadAngle ) * roadRadius, }, rotate: { y: roadAngle + TAU/4 }, fill: true, stroke: 2, color: color.deep, }); } // car var bottomY = -1; var middleY = -2.5; var topY = -4.5; var outerZ = 2.5; var innerZ = 1.5; var grillX = -5; var hoodX = -4; var wipersX = -2; var windshieldX = -1; var roofX = 2; var trunkX = 4; var bumperX = 5; var driverPoints = { grill: new Zdog.Vector({ x: grillX, y: bottomY, z: outerZ }), hood: new Zdog.Vector({ x: hoodX, y: middleY, z: outerZ }), wipers: new Zdog.Vector({ x: wipersX, y: middleY, z: outerZ }), windshield: new Zdog.Vector({ x: windshieldX, y: topY, z: innerZ }), roof: new Zdog.Vector({ x: roofX, y: topY, z: innerZ }), trunk: new Zdog.Vector({ x: trunkX, y: middleY, z: outerZ }), bumper: new Zdog.Vector({ x: bumperX, y: bottomY, z: outerZ }), }; // copy to passenger points on other z side var passengerPoints = {}; for ( var pointName in driverPoints ) { var driverPoint = driverPoints[ pointName ]; passengerPoints[ pointName ] = driverPoint.copy().multiply({ z: -1 }); } var carRotor = new Zdog.Anchor({ addTo: options.addTo, }); var carAnchorY = -6; var carAnchor = new Zdog.Group({ addTo: carRotor, translate: { z: roadRadius - 0, y: carAnchorY }, scale: 1.2, updateSort: true, }); var carSide = new Zdog.Shape({ addTo: carAnchor, path: [ driverPoints.grill, driverPoints.hood, driverPoints.wipers, driverPoints.windshield, driverPoints.roof, driverPoints.trunk, driverPoints.bumper ], stroke: 2, fill: true, color: color.paintjob, }); carSide.copy({ scale: { z: -1 }, }); function getCarPanel( pointNameA, pointNameB, color ) { return carSide.copy({ path: [ driverPoints[ pointNameA ], driverPoints[ pointNameB ], passengerPoints[ pointNameB ], passengerPoints[ pointNameA ], ], color: color || carSide.color, }); } getCarPanel( 'grill', 'hood' ); // front grill getCarPanel( 'hood', 'wipers' ); // hood getCarPanel( 'wipers', 'windshield', color.medium ); // windshield getCarPanel( 'windshield', 'roof' ); // roof getCarPanel( 'roof', 'trunk', color.medium ); // back window getCarPanel( 'trunk', 'bumper' ); // back bumper var tireTranslate = new Zdog.Vector({ x: -3.5, z: outerZ, y: bottomY }); var tire = new Zdog.Ellipse({ addTo: carAnchor, diameter: 1.8, translate: tireTranslate, stroke: 2, fill: true, color: color.paintjob, }); tire.copy({ translate: tireTranslate.copy().multiply({ x: -1 }), }); tire.copy({ translate: tireTranslate.copy().multiply({ z: -1 }), }); tire.copy({ translate: tireTranslate.copy().multiply({ x: -1, z: -1 }), }); function animate( progress ) { carRotor.rotate.y = Zdog.easeInOut( progress/4 % 1 ) * TAU + TAU * 3/8; carAnchor.rotate.x = Math.sin( progress * TAU * 2 ) * 0.1; carAnchor.translate.y = Math.sin( progress * TAU * 1.5 ) * 2 + carAnchorY; } return { animate: animate, }; }; // ------------------------- cats ------------------------- // ZdogSpookyHouse.addCats = function( options ) { var TAU = Zdog.TAU; var color = ZdogSpookyHouse.color; var catScale = 1.1; var cat = new Zdog.Anchor({ addTo: options.addTo, translate: { z: -22, x: -28, y: -2 }, scale: catScale, rotate: { y: TAU/8 }, }); new Zdog.Cone({ addTo: cat, diameter: 1, length: 3, rotate: { x: TAU/4 }, stroke: 4 * catScale, color: color.deep, }); var catHead = new Zdog.Shape({ addTo: cat, translate: { y: -4 }, stroke: 5 * catScale, color: color.deep, }); var catEye = new Zdog.Shape({ addTo: catHead, translate: { x: -1, z: 1 }, stroke: 0.9 * catScale, color: color.highlight, }); catEye.copy({ translate: { x: 1, z: 1 }, }); var catEarPointA = { x: -1, y: 1 }; var catEarPointB = { x: -1, y: -1 }; var catEarPointC = { x: 1, y: 1 }; var catEarPointD = { x: 1, y: 1, z: -1 }; var catEar = new Zdog.Anchor({ addTo: catHead, scale: new Zdog.Vector({ x: 1, y: 1, z: 1.25 }), }); var catEarPanel = new Zdog.Shape({ addTo: catEar, path: [ catEarPointA, catEarPointB, catEarPointD ], translate: { x: -0.96, y: -1.5, z: 0 }, stroke: 0.6 * catScale, fill: true, color: color.deep, }); catEarPanel.copy({ path: [ catEarPointB, catEarPointC, catEarPointD ], }); catEar.copyGraph({ scale: catEar.scale.copy().multiply({ x: -1 }), }); // tail new Zdog.Shape({ addTo: cat, path: [ {}, { bezier: [ { x: 4, y: 0, z: -4 }, { x: 0, y: -3, z: 0 }, { x: 3, y: -5, z: -1 }, ]}, ], closed: false, translate: { z: -1 }, stroke: 0 * catScale, color: color.deep, }); cat.copyGraph({ translate: { z: -6, x: -42, y: -15 }, scale: catScale, rotate: { y: TAU/4 }, }); cat.copyGraph({ translate: { z: -30, x: -30, y: -2 }, scale: catScale, rotate: { y: TAU/4 }, }); }; // ------------------------- fogMonster ------------------------- // ZdogSpookyHouse.addFogMonster = function( options ) { var TAU = Zdog.TAU; var color = ZdogSpookyHouse.color; var radius = 54; var rotor = new Zdog.Anchor( options ); // segments var segmentCount = 74; var trailEndAngle = TAU * 4/8; var segments = []; for ( var i = 0; i < segmentCount; i++ ) { var alpha = i / segmentCount; var angle = alpha * trailEndAngle; var segment = new Zdog.Shape({ addTo: rotor, path: [ {}, { x: radius * TAU / segmentCount * 0.8 } ], stroke: 22 + 8 * -Math.cos( TAU/8 * ( 3 + alpha * 5 ) ), translate: { x: Math.sin( angle ) * radius, z: Math.cos( angle ) * radius, y: Math.sin( angle * 4 ) * 6, }, rotate: { y: alpha * -trailEndAngle }, color: color.fog, }); segments.push( segment ); } var monsterEye = new Zdog.Shape({ addTo: segments[0], translate: { x: -10, z: 8 }, color: color.deep, stroke: 3.5, }); monsterEye.copy({ translate: { x: -10, z: -8 }, }); new Zdog.Ellipse({ addTo: segments[0], translate: { x: -10, y: 4 }, quarters: 2, rotate: { z: TAU/4, y: TAU/4 }, closed: true, diameter: 8, stroke: false, fill: true, color: color.deep, }); function animate( progress ) { var rotorRY = rotor.rotate.y = progress * TAU/6; segments.forEach( function( segment, i ) { var alpha = i / segmentCount; var angle = alpha * trailEndAngle; segment.translate.y = Math.sin( (angle - rotorRY) * 4 ) * 6; }); } return { animate: animate, }; }; // ------------------------- addHouse ------------------------- // ZdogSpookyHouse.addHouse = function( options ) { var TAU = Zdog.TAU; var color = ZdogSpookyHouse.color; var eastWestWallRects = []; var southWallRects = []; function addEastWestWallRect( rect ) { eastWestWallRects.push( rect ); } function addSouthWallRect( rect ) { southWallRects.push( rect ); } var house = new Zdog.Anchor({ addTo: options.addTo, translate: { x: 0, y: -8, z: -6 }, }); var wallPanelOptions = { addTo: house, width: 12, height: 12, stroke: options.stroke, fill: true, backface: color.deep, }; var southWallPanelOptions = Object.assign( { color: color.light, }, wallPanelOptions ); // south wall, front door var frontDoorGroup = new Zdog.Group({ addTo: house, translate: { z: 24 }, }); addSouthWallRect( new Zdog.Rect( Object.assign( {}, southWallPanelOptions, { addTo: frontDoorGroup, }) ) ); new Zdog.Rect({ addTo: frontDoorGroup, width: 6, height: 8, translate: { y: 2 }, color: color.dark, fill: true, stroke: false, }); ZdogSpookyHouse.getWallPanel({ // south wall, 2nd floor wall: Object.assign( { translate: { y: -12, z: 24 } }, southWallPanelOptions ), pane: color.medium, wallRectCallback: addSouthWallRect, }); ZdogSpookyHouse.getWallPanel({ // 3rd floor, window on wall: Object.assign( { translate: { y: -24, z: 24 }, }, southWallPanelOptions ), pane: color.highlight, wallRectCallback: addSouthWallRect, }); var eastWallPanelOptions = Object.assign( { color: color.medium, rotate: { y: -TAU/4 }, }, wallPanelOptions ); var westWallPanelOptions = Object.assign( { color: color.medium, rotate: { y: TAU/4 }, }, wallPanelOptions ); // entrance side facing east var eastWallSquare = new Zdog.Rect( Object.assign( {}, eastWallPanelOptions, { translate: { x: 6, z: 18, }, })); addEastWestWallRect( eastWallSquare ); addEastWestWallRect( eastWallSquare.copy({ // 2nd floor translate: { x: 6, y: -12, z: 18, }, }) ); addEastWestWallRect( eastWallSquare.copy({ // 3rd floor translate: { x: 6, y: -24, z: 18, }, }) ); // entrance west var westWallSquare = eastWallSquare.copy({ translate: { x: -6, z: 18, }, rotate: { y: TAU/4 }, }); addEastWestWallRect( westWallSquare ); addEastWestWallRect( westWallSquare.copy({ // 2nd floor translate: { x: -6, y: -12, z: 18, }, }) ); addEastWestWallRect( westWallSquare.copy({ // 3rd floor translate: { x: -6, y: -24, z: 18, }, }) ); // entrance roof var entranceRoof = new Zdog.Anchor({ addTo: house, translate: { y: -36, z: 18 }, }); var entranceRoofPanel = new Zdog.Shape({ addTo: entranceRoof, path: [ { x: -8, y: 6 }, { x: 8, y: 6 }, { x: 4, y: -6, z: -4 }, { x: -4, y: -6, z: -4 }, ], translate: { z: 8 }, stroke: options.stroke, fill: true, color: color.dark, }); entranceRoofPanel.copy({ rotate: { y: TAU/4 }, translate: { x: -8 }, }); entranceRoofPanel.copy({ rotate: { y: TAU/2 }, translate: { z: -8 }, color: color.deep, }); entranceRoofPanel.copy({ rotate: { y: TAU * 3/4 }, translate: { x: 8 }, color: color.deep, }); // roof cap new Zdog.Rect({ addTo: entranceRoof, width: 8, height: 8, rotate: { x: -TAU/4 }, translate: { y: -6 }, stroke: options.stroke, fill: true, color: color.dark, }); // south east ZdogSpookyHouse.getWallPanel({ // 1st floor wall: Object.assign( {}, southWallPanelOptions, { translate: { x: 12, z: 12 }, }), pane: color.medium, wallRectCallback: addSouthWallRect, }); ZdogSpookyHouse.getWallPanel({ // 2nd floor wall: Object.assign( {}, southWallPanelOptions, { translate: { x: 12, y: -12, z: 12 }, }), pane: color.medium, wallRectCallback: addSouthWallRect, }); // south west ZdogSpookyHouse.getWallPanel({ // 1st floor wall: Object.assign( {}, southWallPanelOptions, { translate: { x: -12, z: 12 }, }), pane: color.medium, wallRectCallback: addSouthWallRect, }); ZdogSpookyHouse.getWallPanel({ // 2nd floor wall: Object.assign( {}, southWallPanelOptions, { translate: { x: -12, y: -12, z: 12 }, }), pane: color.medium, wallRectCallback: addSouthWallRect, }); // east side ZdogSpookyHouse.getWallPanel({ // 1st floor wall: Object.assign( {}, eastWallPanelOptions, { translate: { x: 18, z: 6, }, }), pane: color.dark, wallRectCallback: addEastWestWallRect, }); ZdogSpookyHouse.getWallPanel({ // 2nd floor wall: Object.assign( {}, eastWallPanelOptions, { translate: { x: 18, y: -12, z: 6, }, }), pane: color.dark, wallRectCallback: addEastWestWallRect, }); ZdogSpookyHouse.getWallPanel({ // 1st floor wall: Object.assign( {}, eastWallPanelOptions, { translate: { x: 18, z: -6, }, }), pane: color.dark, wallRectCallback: addEastWestWallRect, }); addEastWestWallRect( eastWallSquare.copy({ // 2nd floor, half wall width: 6, translate: { x: 18, y: -12, z: -3, }, }) ); var northWallSquare = eastWallSquare.copy({ width: 6, translate: { x: 15, z: -12, }, rotate: { y: TAU/2 }, color: color.dark, }); var northBigWindowWall = new Zdog.Shape({ addTo: house, path: [ { x: -4, y: 12 }, { x: -4, y: -6 }, { arc: [ { x: -4, y: -10 }, { x: 0, y: -10 }, ]}, { arc: [ { x: 4, y: -10 }, { x: 4, y: -6 }, ]}, { x: 4, y: 12 }, { x: 5, y: 12 }, { x: 5, y: -12 }, { x: -5, y: -12 }, { x: -5, y: 12 }, ], translate: { x: 7, y: -6, z: -12, }, stroke: options.stroke, color: color.dark, fill: true, }); // window division lines new Zdog.Shape({ addTo: northBigWindowWall, path: [ { move: { x: -4, y: -6 } }, { line: { x: 4, y: -6 } }, { move: { x: -4, y: 0 } }, { line: { x: 4, y: 0 } }, { move: { x: -4, y: 6 } }, { line: { x: 4, y: 6 } }, { move: { x: 0, y: -11 } }, { line: { x: 0, y: 12 } .........完整代码请登录后点击上方下载按钮下载查看
网友评论0