Alexander Deplov

Spirograph movement with copies

Spirograph movement with copies

Code

<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Paper.js</title>
<link rel="stylesheet" href="./../PaperJSEngine/style.css" />
<script type="text/javascript" src="./../PaperJSEngine/paper-full.js"></script>
<script type="text/paperscript" canvas="canvas">

var clones = 10
var angle = 360/clones
var group = new Group()
var fadeOutTiming = 3000

var bg = new Path.Rectangle({
	size: view.size,
	fillColor: 'black'
})

for (var i = 0; i < clones; i++){
	var path = new Path.Rectangle({
	size: 5,
	radius: 5,
	fillColor: 'orange',
	strokeWidth: 0.2,
	strokeColor: 'blue',
	position: view.center + [0, 120],
	opacity: 0
})

path.rotate(angle * i, view.center)
group.addChild(path)

}

var obj1 = new Path.Rectangle({
size: [100],
position: view.center,
radius: 35,
applyMatrix: false,
rotation: 45
})

var objectsGroup = new Group()

var allObjectsArray = []

var time = 0

function onFrame(event){
time += 0.05

group.rotate(0.5)
        objectsGroup.rotate(-0.03)
        group.position.x = view.center.x + Math.cos(event.count * 0.02) * 30

        //TURN OFF, ALSO COOL:
        group.position.y = view.center.y + Math.sin(event.count * 0.02) * 30

        obj1.fillColor = 'yellow'
        objectsGroup.addChild(obj1)
        obj1.rotate(Math.sin(event.count * 0.05) * 1.2 + Math.cos(event.count * 0.15))
        objectsGroup.position.x += Math.sin(event.count * 0.01) * 2

        group.children.map(function(object, i){
            var object = group.children[i]
            obj1.position = object.position
            obj1.fillColor.hue -= event.count * 0.1
        })

        var objAround = obj1.clone()
        allObjectsArray.push(objAround)
        objAround.position = obj1.position
        objAround.scale(3.5)
        objAround.fillColor = 'transparent'
        objAround.strokeColor = 'yellow'
        objAround.strokeColor.hue -= event.count * 0.35
        objAround.strokeColor.saturation = 2
        objAround.strokeColor.lightness = 0.5
        objAround.strokeWidth = 0.7
        objAround.opacity = 0.3 // 0.3
        objAround.applyMatrix = false

        objAround.tweenTo({
            opacity: 0,
        }, fadeOutTiming)

        objAround.segments.map(function(object, i){
            object.point.x += Math.sin(event.count * 0.1) * 2
    
            if (event.count % 10 >= 0){
            objAround.strokeWidth = 2
        } else{
            objAround.strokeWidth = 0
        }
        })

        if (objectsGroup.children.length > 180){
            objectsGroup.children[0].remove()
        }

        var objAround2 = objAround.clone()
        objAround2.scale(1.02)
        objAround2.blendMode = 'multiply'
        objAround2.rotate(Math.sin(event.count * 0.02) * 0.5 + Math.cos(event.count * 0.2) * 2)
        objAround2.strokeColor = 'green'
        objAround2.strokeColor.hue -= event.count * 3.25
        objAround2.position.y += Math.sin(event.count * 0.1) * 10
        objAround2.tweenTo({
            opacity: 0,
            rotation: 180,
        }, fadeOutTiming * 0.5)

        var scalingPath = objAround.clone()
        scalingPath.applyMatrix = false
        scalingPath.scale(0.98)
        scalingPath.strokeColor = 'yellow'
        scalingPath.blendMode = 'overlay'
        scalingPath.scale(1.02)
        scalingPath.blendMode = 'screen'
        scalingPath.rotate(Math.sin(event.count * 0.02) * 0.5 + Math.cos(event.count * 0.2) * 2)
        scalingPath.strokeColor = 'green'
        scalingPath.strokeColor.hue -= event.count * 3.25
        scalingPath.position.y += Math.sin(event.count * 0.1) * 10
        scalingPath.tweenTo({
            opacity: 0,
            }, fadeOutTiming * 0.2)

        }

</script>
</head>
<body>
<canvas id="canvas" hidpi="off" resize style="background: black">
</canvas>
</body>
</html>