Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from euclid import Vector3, Matrix4
- def makeFrame(p, u, v, w):
- m = Matrix4()
- # axis rotation
- m.a, m.b, m.c = u.x, v.x, w.x
- m.e, m.f, m.g = u.y, v.y, w.y
- m.i, m.j, m.k = u.z, v.z, w.z
- # translation
- m.d, m.h, m.l = p.x, p.y, p.z
- return m
- def frenet(points):
- p0 = points.next()
- p1 = points.next()
- u0 = p1 - p0
- u0.normalize()
- # choose axis to project onto
- maxDot = 0.999
- axis = Vector3(1.0, 0.0, 0.0)
- if u0.dot(axis) > maxDot:
- axis = Vector3(0.0, 1.0, 0.0)
- if u0.dot(axis) > maxDot:
- axis = Vector3(0.0, 0.0, 1.0)
- # start frame
- rot = Quaternion.new_rotate_axis(0.5*math.pi, axis)
- v0 = u0.project(axis)
- v0 = rot * v0
- w0 = u0.cross(v0)
- yield makeFrame(p0, v0, w0, u0)
- p0 = p1
- # middle frames
- for p in points:
- u = p -p0
- u.normalize()
- v = u0.project(v0)
- v.normalize()
- if w.dot(w0) < 0.0:
- w = -w
- yield makeFrame(p0, v0, w0, u0)
- p0 = p
- u0 = u
- v0 = v
- w0 = w
- # final frame
- yield makeFrame(p0, v0, w0, u0)
Add Comment
Please, Sign In to add comment