Skip to content

Instantly share code, notes, and snippets.

@seantai
Created October 21, 2022 08:18
Show Gist options
  • Save seantai/29d9cb9c6fec73ea9cfc4e8c7bd172e6 to your computer and use it in GitHub Desktop.
Save seantai/29d9cb9c6fec73ea9cfc4e8c7bd172e6 to your computer and use it in GitHub Desktop.
Lorenz Attractor in Blender
# as explained by QuantitativeBytes
# https://youtu.be/iDHWyt1v4T8
import bpy
class Lorenz:
def __init__(self, sceneRef, objName, color, initX, initY, initZ):
self.X, self.Y, self.Z = initX, initY, initZ
self.dt = 0.005
self.a, self.b, self.c = 10, 28, 8/3
self.color = color
self.objName = objName
self.sceneRef = sceneRef
def Step(self):
self.X = self.X + (self.dt * self.a * (self.Y - self.X))
self.Y = self.Y + (self.dt * (self.X * (self.b - self.Z) - self.Y))
self.Z = self.Z + (self.dt * (self.X * self.Y - self.c * self.Z))
def Generate(self):
numPoints = 10000
self.curve = bpy.data.curves.new("LorenzCurve", type='CURVE')
self.curve.dimensions = '3D'
self.curve.bevel_depth = 0.1
attractorPoly = self.curve.splines.new('POLY')
attractorPoly.points.add(numPoints - 1)
for i in range(0, numPoints):
attractorPoly.points[i].co = (self.X, self.Y, self.Z, 1)
self.Step()
self.body = bpy.data.objects.new('curve', self.curve)
self.body.name = self.objName
self.sceneRef.collection.objects.link(self.body)
scene = bpy.context.scene
attractor1 = Lorenz(scene, "attractor1", (0.4, 0.1, 0.1, 1.0), 0.1,0.0,0.0)
attractor1.Generate()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment