• Jump To … +
    ./demo/canvas-001.js ./demo/canvas-002.js ./demo/canvas-003.js ./demo/canvas-004.js ./demo/canvas-005.js ./demo/canvas-006.js ./demo/canvas-007.js ./demo/canvas-008.js ./demo/canvas-009.js ./demo/canvas-010.js ./demo/canvas-011.js ./demo/canvas-012.js ./demo/canvas-013.js ./demo/canvas-014.js ./demo/canvas-015.js ./demo/canvas-016.js ./demo/canvas-017.js ./demo/canvas-018.js ./demo/canvas-019.js ./demo/canvas-020.js ./demo/canvas-021.js ./demo/canvas-022.js ./demo/canvas-023.js ./demo/canvas-024.js ./demo/canvas-025.js ./demo/canvas-026.js ./demo/canvas-027.js ./demo/canvas-028.js ./demo/canvas-029.js ./demo/canvas-030.js ./demo/canvas-031.js ./demo/canvas-032.js ./demo/canvas-033.js ./demo/canvas-034.js ./demo/canvas-035.js ./demo/canvas-036.js ./demo/canvas-037.js ./demo/canvas-038.js ./demo/canvas-039.js ./demo/canvas-040.js ./demo/canvas-041.js ./demo/canvas-042.js ./demo/canvas-043.js ./demo/canvas-044.js ./demo/canvas-045.js ./demo/canvas-046.js ./demo/canvas-047.js ./demo/component-001.js ./demo/component-002.js ./demo/component-003.js ./demo/component-004.js ./demo/component-005.js ./demo/component-006.js ./demo/component-007.js ./demo/core-001.js ./demo/dom-001.js ./demo/dom-002.js ./demo/dom-003.js ./demo/dom-004.js ./demo/dom-005.js ./demo/dom-006.js ./demo/dom-007.js ./demo/dom-008.js ./demo/dom-009.js ./demo/dom-010.js ./demo/dom-011.js ./demo/dom-012.js ./demo/dom-013.js ./demo/dom-014a.js ./demo/dom-014b.js ./demo/dom-014c.js ./demo/dom-015.js ./demo/dom-016.js ./demo/filters-001.js ./demo/filters-002.js ./demo/filters-003.js ./demo/filters-004.js ./demo/filters-005.js ./demo/filters-006.js ./demo/filters-007.js ./demo/filters-008.js ./demo/filters-009.js ./demo/filters-010.js ./demo/filters-011.js ./demo/filters-012.js ./demo/filters-013.js ./demo/filters-014.js ./demo/filters-015.js ./demo/filters-016.js ./demo/filters-017.js ./demo/filters-018.js ./demo/filters-019.js ./demo/filters-020.js ./demo/filters-501.js ./demo/filters-502.js ./demo/filters-503.js ./demo/filters-504.js ./demo/filters-505.js ./demo/particles-001.js ./demo/particles-002.js ./demo/particles-003.js ./demo/particles-004.js ./demo/particles-005.js ./demo/particles-006.js ./demo/particles-007.js ./demo/particles-008.js ./demo/particles-009.js ./demo/particles-010.js ./demo/particles-011.js ./demo/particles-012.js ./demo/particles-013.js ./demo/particles-014.js ./demo/particles-015.js ./demo/particles-016.js ./demo/temp-001.js ./demo/temp-inkscapeSvgFilters.js
  • ¶

    Demo DOM 008

    3d animated cube

  • ¶

    Run code

    import scrawl from '../source/scrawl.js'
  • ¶

    Scene setup

    let artefact = scrawl.library.artefact,
        stack = artefact.mystack,
        cube = artefact.cube;
  • ¶

    The ‘faces’ Element artefacts are defined in the demo’s html file (they are children of the Stack element). To make controlling them easier, we can create a Group object linked to the Stack and shift them into it.

    let faces = scrawl.makeGroup({
        name: 'faces',
        host: 'mystack',
    }).moveArtefactsIntoGroup('leftface', 'rightface', 'topface', 'bottomface', 'frontface', 'backface');
  • ¶

    Give the Stack element some perspective depth

    stack.set({
        perspectiveX: '50%',
        perspectiveY: '50%',
        perspectiveZ: 1200
    });
  • ¶

    The ‘cube’ Element artefact (also defined in html, but not shifted into our new group) will act as the reference artefact for our ‘faces’ Elements

    cube.set({
        order: 1,
        width: 0,
        height: 0,
        startX: 'center',
        startY: 'center',
        handleX: 'center',
        handleY: 'center',
        lockTo: 'start',
  • ¶

    Give the Element a border, so we can see it

        css: {
            border: '20px solid black',
        },
  • ¶

    Delta animate the cube Element’s rotation:

    • pitch represents rotation along the x-axis
    • yaw represents rotation along the y-axis
    • roll represents rotation along the z-axis

    Values are in degrees, not radians!

        delta: {
            pitch: 0.8,
            yaw: 1.2,
            roll: 0.4,
        },
    });
  • ¶

    Give our ‘faces’ Elements some common values, via their Group

    faces.setArtefacts({
  • ¶

    Make sure the Elements get processed after the reference Element, so that they pick up changes to its positioning

        order: 2,
    
        width: 200,
        height: 200,
        startX: 'center',
        startY: 'center',
        handleX: 'center',
        handleY: 'center',
  • ¶

    Offset each Element from the reference Element

        offsetZ: 100,
  • ¶

    Set each Element to pivot to the reference Element

        lockTo: 'pivot',
        pivot: 'cube',
  • ¶

    Automatically add the reference Element’s rotation values to each Element’s initial rotation value (set below)

        addPivotRotation: true,
  • ¶

    Styling common to all the ‘faces’ Elements

        css: {
            border: '1px solid blue',
            textAlign: 'center',
            backfaceVisibility: 'hidden',
        }
    });
  • ¶

    Give each ‘faces’ Element its own color and initial rotation

    artefact.frontface.set({
        css: { backgroundColor: 'rgba(255, 0, 0, 0.4)' },
    });
    artefact.rightface.set({
        css: { backgroundColor: 'rgba(0, 0, 127, 0.4)' },
        yaw: 90,
    });
    artefact.topface.set({
        css: { backgroundColor: 'rgba(0, 255, 0, 0.4)' },
        pitch: 90,
    });
    artefact.backface.set({
        css: { backgroundColor: 'rgba(127, 0, 0, 0.4)' },
        pitch: 180,
    });
    artefact.leftface.set({
        css: { backgroundColor: 'rgba(0, 0, 255, 0.4)' },
        yaw: 270,
    });
    artefact.bottomface.set({
        css: { backgroundColor: 'rgba(0, 127, 0, 0.4)' },
        pitch: 270,
    });
  • ¶

    User interaction

    Function to check whether mouse cursor is over the Stack element, and lock the cube Element accordingly

    let stackCheck = function () {
    
        let active = false;
    
        return function () {
    
            if (stack.here.active !== active) {
    
                active = stack.here.active;
    
                cube.set({
                    lockTo: (active) ? 'mouse' : 'start'
                });
            }
        };
    }();
  • ¶

    Scene animation

    Function to display frames-per-second data, and other information relevant to the demo

    let report = function () {
    
        let testTicker = Date.now(),
            testTime, testNow, text,
            testMessage = document.querySelector('#reportmessage');
    
        return function () {
    
            testNow = Date.now();
            testTime = testNow - testTicker;
            testTicker = testNow;
    
            testMessage.textContent = `Screen refresh: ${Math.ceil(testTime)}ms; fps: ${Math.floor(1000 / testTime)}`;
        };
    }();
  • ¶

    Create the Display cycle animation

    scrawl.makeRender({
    
        name: 'demo-animation',
        target: stack,
        commence: stackCheck,
        afterShow: report,
    });
  • ¶

    Development and testing

    console.log(scrawl.library);