Skip to content

jodermo/angular-animation-framework

Repository files navigation

Angular Animation Framework

Demo Animations: 3d.html5-apps.com

• implementation as Angular module
• easy create, animate and do interactions on 3D objects with TypeScript
• attributes based on THREE.js library (docs)
• tweening methods based on TWEEN.js library (website)
• audio analyzer with dynamic frequency data
• 360 Videos
• VR/AR support (still in development)

Frameworks Links
Angular Logo
Angular CLI
Client Side TypeScript App WEBSITE
README
WebGL Logo
Three-js
3D Graphic API WEBSITE
README
TWEEN.js (github.com) Tweening library WEBSITE
README

Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.

© 2020 - Moritz Petzka - petzka.com

For commercial use, contact: info@petzka.com

Main Component:


For implementation in existing Projects, follow the steps in: .../three-animation/README.md

Example

create THREE.js mesh with MeshBasicMaterial and BoxGeometry and let it move:

import { Component, ElementRef, Renderer2 } from '@angular/core'; import { ThreeAnimationComponent } from '../three-animation/three-animation.component'; import { AnimationObject, AnimationObjectOptions } from '../three-animation/classes/animation-object'; @Component({ selector: 'my-animation', templateUrl: '../three-animation/three-animation.component.html', styleUrls: ['../three-animation/three-animation.component.css'] }) export class MyAnimationComponent extends ThreeAnimationComponent { constructor(public elementRef: ElementRef, public _renderer: Renderer2) { super(elementRef, _renderer); } start(){ const box: AnimationObject = this.animation.createObject('mesh', { material: { type: 'MeshBasicMaterial', color: '#ff00ec', transparent: true, opacity: .25 }, geometry: { type: 'BoxGeometry', width: 5, height: 5, depth: 5, }, mesh: { receiveShadow: true, castShadow: true }, position: { x: 10, y: 0, z: 0 } } as AnimationObjectOptions, ()=>{ // stuff after object is successful created }); box.moveTo({x:0, y:0, z:50}, 5000); } }

Documentation

Create THREE.js mesh object

Example:

const box = this.animation.createObject('mesh', { material: { // properties for THREE.js material (more infos below) type: 'MeshBasicMaterial', color: '#ff00ec', transparent: true, opacity: .25 }, geometry: { // properties for THREE.js geometry (examples below) type: 'BoxGeometry', width: 5, height: 5, depth: 5, }, mesh: { // properties for THREE.js mesh object receiveShadow: true, castShadow: true, } });

More infos about THREE.js mesh: https://threejs.org/docs/#api/en/objects/Mesh

AnimationObject (main functions)
/* set attributes directly */ box.setPosition({x:0, y:0, z:50}); box.setRotation({x:0, y:(Math.PI / 2), z:0}); box.setScale({x:1, y:1, z:1}); box.lookAt({x:0, y:0, z:0}); /* tween attributes */ box.moveTo({x:0, y:0, z:50}, 5000, ()=>{ // stuff after tween ended }, 'Linear.None'); box.rotateTo({x:0, y:(Math.PI / 2), z:0}, 5000, ()=>{ // stuff after tween ended }, 'Linear.None'); box.scaleTo({x:0, y:(Math.PI / 2), z:0}, 5000, ()=>{ // stuff after tween ended }, 'Linear.None'); /* more stuff */ box.show(); box.hide(); box.remove(); // clone box const boxClone = box.clone(); // append clone to scene boxClone.appendTo(this.scene); /* mouse events */ box.on('mousemove', (event)=>{}); box.on('mouseover', (event)=>{}); box.on('mouseout', (event)=>{}); box.on('mousedown', (event)=>{}); box.on('mouseup', (event)=>{}); /* collision detection */ box.on('collide', (collisionObject)=>{}); box.on('leave', (collisionObject)=>{});
Easing Types ('Linear.None' is default)
  • Linear.None
  • Quadratic.In
  • Quadratic.Out
  • Quadratic.InOut
  • Cubic.In
  • Cubic.Out
  • Cubic.InOut
  • Quartic.In
  • Quartic.Out
  • Quartic.InOut
  • Quintic.In
  • Quintic.Out
  • Quintic.InOut
  • Sinusoidal.In
  • Sinusoidal.Out
  • Sinusoidal.InOut
  • Exponential.In
  • Exponential.Out
  • Exponential.InOut
  • Back.In
  • Back.Out
  • Back.InOut
  • Bounce.In
  • Bounce.Out
  • Bounce.InOut
more infos: https://sole.github.io/tween.js/examples/03_graphs.html
Available materials

Example:

this.animation.createObject('mesh', { ... material: { // properties for THREE.js material (more infos below) type: 'MeshBasicMaterial', color: '#ff00ec', transparent: true, opacity: .25 }, ...

For more information about material properties, visit: https://threejs.org/docs/#api/en/materials/Material

Available geometries

More infos: https://threejs.org/docs/#api/en/core/Geometry

Example:

this.animation.createObject('mesh', { ..., geometry: { type: 'BoxGeometry', width: 5, height: 5, depth: 5, }, ...
BoxGeometry
geometry: { type: 'BoxGeometry', width: 1, height: 1, depth: 1, widthSegments: 1, heightSegments: 1, depthSegments: 1 }

More infos: https://threejs.org/docs/#api/en/geometries/BoxGeometry

CircleGeometry
geometry: { type: 'CircleGeometry', radius: 1, segments: 8, thetaStart: 0, thetaLength: (Math.PI * 2) }

More infos: https://threejs.org/docs/#api/en/geometries/CircleGeometry

ConeGeometry
geometry: { type: 'ConeGeometry', radius: 1, height: 1, radialSegments: 8, heightSegments: 1, openEnded: false, thetaStart: 0, thetaLength: (Math.PI * 2) }

More infos: https://threejs.org/docs/#api/en/geometries/ConeGeometry

CylinderGeometry
geometry: { type: 'CylinderGeometry', radiusTop: 1, radiusBottom: 1, height: 1, radialSegments: 8, heightSegments: 1, openEnded: false, thetaStart: 0, thetaLength: (Math.PI * 2) }

More infos: https://threejs.org/docs/#api/en/geometries/CylinderGeometry

DodecahedronGeometry
geometry: { type: 'DodecahedronGeometry', radius: 1, detail: 0 }

More infos: https://threejs.org/docs/#api/en/geometries/DodecahedronGeometry

IcosahedronGeometry
geometry: { type: 'IcosahedronGeometry', radius: 1, detail: 0 }

More infos: https://threejs.org/docs/#api/en/geometries/IcosahedronGeometry

IcosahedronGeometry
geometry: { type: 'LatheGeometry', points: [], segments: 12, phiStart: 0, phiLength: (Math.PI * 2) }

More infos: https://threejs.org/docs/#api/en/geometries/LatheGeometry

OctahedronGeometry
geometry: { type: 'OctahedronGeometry', radius: 1, detail: 0 }

More infos: https://threejs.org/docs/#api/en/geometries/OctahedronGeometry

ParametricGeometry
geometry: { type: 'ParametricGeometry', func: () => { }, slices: 25, stacks: 25, } 

More infos: https://threejs.org/docs/#api/en/geometries/ParametricGeometry

PlaneGeometry
geometry: { type: 'PlaneGeometry', width: 1, height: 1, widthSegments: 1, heightSegments: 1 }

More infos: https://threejs.org/docs/#api/en/geometries/PlaneGeometry

PolyhedronGeometry
geometry: { type: 'PolyhedronGeometry', vertices: [ -1, -1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1, -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, ], indices: [ 2, 1, 0, 0, 3, 2, 0, 4, 7, 7, 3, 0, 0, 1, 5, 5, 4, 0, 1, 2, 6, 6, 5, 1, 2, 3, 7, 7, 6, 2, 4, 5, 6, 6, 7, 4 ], radius: 1, detail: 1 }

More infos: https://threejs.org/docs/#api/en/geometries/PolyhedronGeometry

RingGeometry
geometry: { type: 'RingGeometry', innerRadius: 0.5, outerRadius: 1, thetaSegments: 8, phiSegments: 8, thetaStart: 0, thetaLength: (Math.PI * 2) }

More infos: https://threejs.org/docs/#api/en/geometries/RingGeometry

SphereGeometry
geometry: { type: 'SphereGeometry', radius: 1, widthSegments: 8, heightSegments: 6, phiStart: 0, phiLength: (Math.PI * 2), thetaStart: 0, thetaLength: (Math.PI) }

More infos: https://threejs.org/docs/#api/en/geometries/SphereGeometry

TetrahedronGeometry
geometry: { type: 'TetrahedronGeometry', radius: 1, detail: 1 }

More infos: https://threejs.org/docs/#api/en/geometries/TetrahedronGeometry

TextGeometry
geometry: { type: 'TextGeometry', text: 'Text', parameters: { font: null, size: 80, height: 5, curveSegments: 12, bevelEnabled: true, bevelThickness: 10, bevelSize: 8, bevelOffset: 0, bevelSegments: 5 } }

More infos: https://threejs.org/docs/#api/en/geometries/TextGeometry

TorusGeometry
geometry: { type: 'TorusGeometry', radius: 1, tube: .4, radialSegments: 8, tubularSegments: 6, arc: (Math.PI * 2) }

More infos: https://threejs.org/docs/#api/en/geometries/TorusGeometry

TorusKnotGeometry
geometry: { type: 'TorusKnotGeometry', radius: 1, tube: .4, tubularSegments: 64, radialSegments: 8, p: 2, q: 3 }

More infos: https://threejs.org/docs/#api/en/geometries/TorusKnotGeometry

TubeGeometry
geometry: { type: 'TubeGeometry', path: null, tubularSegments: 64, radius: 1, radialSegments: 8, closed: false }

More infos: https://threejs.org/docs/#api/en/geometries/TubeGeometry

Angular Project

This project was generated with Angular CLI version 9.0.5.

Installation

Run npm install -g @angular/cli to install Angular CLI. Run npm install to install dependencies.

Development server

Run ng serve for a dev server. Navigate to http://localhost:4200/. The app will automatically reload if you change any of the source files.

Code scaffolding

Run ng generate component component-name to generate a new component. You can also use ng generate directive|pipe|service|class|guard|interface|enum|module.

Build

Run ng build to build the project. The build artifacts will be stored in the dist/ directory. Use the --prod flag for a production build.

Running unit tests

Run ng test to execute the unit tests via Karma.

Running end-to-end tests

Run ng e2e to execute the end-to-end tests via Protractor.

Further help

To get more help on the Angular CLI use ng help or go check out the Angular CLI README.