Guest User

Untitled

a guest
Jan 22nd, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.10 KB | None | 0 0
  1. from euclid import Vector3, Matrix4
  2.  
  3. def makeFrame(p, u, v, w):
  4. m = Matrix4()
  5. # axis rotation
  6. m.a, m.b, m.c = u.x, v.x, w.x
  7. m.e, m.f, m.g = u.y, v.y, w.y
  8. m.i, m.j, m.k = u.z, v.z, w.z
  9. # translation
  10. m.d, m.h, m.l = p.x, p.y, p.z
  11. return m
  12.  
  13.  
  14. def frenet(points):
  15. p0 = points.next()
  16. p1 = points.next()
  17.  
  18. u0 = p1 - p0
  19. u0.normalize()
  20.  
  21. # choose axis to project onto
  22. maxDot = 0.999
  23. axis = Vector3(1.0, 0.0, 0.0)
  24. if u0.dot(axis) > maxDot:
  25. axis = Vector3(0.0, 1.0, 0.0)
  26. if u0.dot(axis) > maxDot:
  27. axis = Vector3(0.0, 0.0, 1.0)
  28.  
  29. # start frame
  30. rot = Quaternion.new_rotate_axis(0.5*math.pi, axis)
  31. v0 = u0.project(axis)
  32. v0 = rot * v0
  33. w0 = u0.cross(v0)
  34.  
  35. yield makeFrame(p0, v0, w0, u0)
  36. p0 = p1
  37.  
  38. # middle frames
  39. for p in points:
  40. u = p -p0
  41. u.normalize()
  42. v = u0.project(v0)
  43. v.normalize()
  44. if w.dot(w0) < 0.0:
  45. w = -w
  46. yield makeFrame(p0, v0, w0, u0)
  47. p0 = p
  48. u0 = u
  49. v0 = v
  50. w0 = w
  51.  
  52. # final frame
  53. yield makeFrame(p0, v0, w0, u0)
Add Comment
Please, Sign In to add comment