Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import bpy
- from math import sqrt
- from mathutils import Vector
- from random import random
- class ModalTimerOperator(bpy.types.Operator):
- """Operator which runs its self from a timer"""
- bl_idname = "wm.orbitsim"
- bl_label = "Orbit visualiser"
- _obj = None
- _dt = None
- _p = None
- _v = None
- _mu = None
- def modal(self, context, event):
- if event.type in {'RIGHTMOUSE', 'ESC'}:
- print("Stopping script")
- return {'CANCELLED'}
- if event.type == 'TIMER':
- a = -self._mu/self._p.magnitude**3*self._p
- self._p = self._p + self._v*self._dt + 0.5*a*self._dt**2
- self._v = self._v + a*self._dt
- self._obj.location = self._p
- return {'PASS_THROUGH'}
- def execute(self, context):
- print("NEW RUN")
- self._dt = 0.04
- self._mu = 5
- wm = context.window_manager
- self._timer = wm.event_timer_add(self._dt, window=context.window)
- wm.modal_handler_add(self)
- self._p = Vector((10,0,0))
- #Circular orbit:
- #self._v = sqrt(self._mu/self._p.magnitude)*Vector((random(),random(),random())).cross(self._p).normalized()
- #Elliptic orbit:
- semi_major = (random()+0.6)*self._p.magnitude
- self._v = sqrt(self._mu*(2/self._p.magnitude-1/semi_major))*Vector((random(),random(),random())).cross(self._p).normalized()
- self._obj = bpy.data.objects['Cube']
- self._obj.location = self._p
- return {'RUNNING_MODAL'}
- def cancel(self, context):
- wm = context.window_manager
- wm.event_timer_remove(self._timer)
- def register():
- bpy.utils.register_class(ModalTimerOperator)
- def unregister():
- bpy.utils.unregister_class(ModalTimerOperator)
- if __name__ == "__main__":
- register()
- bpy.ops.wm.orbitsim()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement