Advertisement
eea

physics

eea
Aug 21st, 2022 (edited)
1,011
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.24 KB | Source Code | 0 0
  1. local part = Instance.new("Part", script)
  2. part.Size = Vector3.new(10, 6, .1)
  3. part.Position = Vector3.new(-10, 5, -10)
  4. part.Anchored = true
  5. part.Material = "Glass"
  6. part.Transparency = .5
  7.  
  8. local sf = Instance.new("SurfaceGui", part)
  9. sf.Face = "Front"
  10. sf.ClipsDescendants = false
  11. local backg = Instance.new("Frame", sf)
  12. backg.Size = UDim2.new(1, 0, 1, 0)
  13. backg.BackgroundColor3 = Color3.new()
  14. s_size = backg.AbsoluteSize
  15.  
  16. local t_back = Instance.new("TextBox", sf)
  17. t_back.Position = UDim2.new(1, 0, 0, 0)
  18. t_back.Size = UDim2.new(0, 400, 1, 0)
  19. t_back.BackgroundColor3 = Color3.new(.2, .2, .2)
  20. t_back.TextScaled = true
  21. t_back.TextXAlignment = 0
  22. t_back.TextYAlignment = 0
  23.  
  24. -- the
  25.  
  26. local s = [[
  27.  
  28. local sf = script.Parent.SurfaceGui
  29. local s_size = sf.Frame.AbsoluteSize
  30. -- settings
  31.  
  32. settings = {}
  33. settings.g = Vector2.new(0, 0)
  34. settings.fps = 60
  35. settings.wrapx = false
  36. settings.wrapy = false
  37. settings.boundx = true
  38. settings.boundy = true
  39.  
  40. -- physics functions
  41.  
  42. function addforce(ob, f)
  43.     ob.acc += f/ob.mass
  44. end
  45.  
  46. function grav(one, two, g)
  47.     local the = two.pos - one.pos
  48.     local g_force = one.mass*two.mass*g/the.Magnitude^2
  49.     local forc = the / the.Magnitude * g_force
  50.     addforce(one, forc)
  51. end
  52.  
  53. function upd(ob, dt)
  54.     dt = dt or 1
  55.     addforce(ob, settings.g)
  56.     ob.vel += ob.acc*dt
  57.     ob.pos += ob.vel*dt
  58.     if settings.wrapx then
  59.         ob.pos = Vector2.new(ob.pos.X % s_size.X, ob.pos.Y)
  60.     end
  61.     if settings.wrapy then
  62.         ob.pos = Vector2.new(ob.pos.X, ob.pos.Y % s_size.Y)
  63.     end
  64.     if settings.boundx then
  65.         ob.pos = ob.pos:Max(Vector2.new(ob.size.X/2, -math.huge))
  66.         ob.pos = ob.pos:Min(Vector2.new(s_size.X - ob.size.X/2, math.huge))
  67.     end
  68.     if settings.boundy then
  69.         ob.pos = ob.pos:Max(Vector2.new(-math.huge, ob.size.Y/2))
  70.         ob.pos = ob.pos:Min(Vector2.new(math.huge, s_size.Y - ob.size.Y/2))
  71.     end
  72.     ob.acc = Vector2.new()
  73. end
  74.  
  75. function show(ob)
  76.     ob.vis.Position = UDim2.new(0, ob.pos.X, 0, ob.pos.Y)
  77.     ob.vis.Rotation = ob.angle
  78.     ob.vis.Size = UDim2.new(0, ob.size.X, 0, ob.size.Y)
  79. end
  80.  
  81. function obj(x, y, s, a, m, v, ac)
  82.     m = m or 1
  83.     x = x or 0
  84.     y = y or 0
  85.     s = s or Vector2.new(20, 20)
  86.     a = a or 0
  87.     v = v or Vector2.new(0, 0)
  88.     ac = ac or Vector2.new()
  89.     local p = {}
  90.     p.pos = Vector2.new(x, y)
  91.     p.size = s
  92.     p.angle = a
  93.     p.mass = m
  94.     p.vel = v
  95.     p.acc = ac
  96.     local vis = Instance.new("Frame", sf)
  97.     vis.AnchorPoint = Vector2.new(.5, .5)
  98.     vis.BackgroundColor3 = Color3.new(1,1,1)
  99.     p.vis = vis
  100.     return p
  101. end
  102. ]]
  103.  
  104. local e = [[
  105.  
  106. load()
  107.  
  108. while true do
  109.     update(task.wait(1/settings.fps))
  110. end
  111. ]]
  112.  
  113. -- main stuff
  114. local real = [[
  115. local test1
  116. local test2
  117. local info
  118.  
  119. function checktouchedwall(ob)
  120.     if ob.pos.X == ob.size.X/2 then
  121.         return Vector2.new(1, 0)
  122.     end
  123.     if ob.pos.X == s_size.X - ob.size.X/2 then
  124.         return Vector2.new(-1, 0)
  125.     end
  126.     if ob.pos.Y == ob.size.Y/2 then
  127.         return Vector2.new(0, 1)
  128.     end
  129.     if ob.pos.Y == s_size.Y - ob.size.Y/2 then
  130.         return Vector2.new(0, -1)
  131.     end
  132. end
  133.  
  134. function load()
  135.     settings.boundx = true
  136.     settings.boundy = true
  137.   --obj(x, y, s, a, m, v, ac)
  138.     test1 = obj(s_size.X/2, s_size.Y/2, false, false, false, false)
  139.     test2 = obj(250, 350, false, false, false, false, false)
  140.     test2.vel = Vector2.new(10, 40)
  141.     info = Instance.new("TextBox", sf)
  142.     info.Size = UDim2.new(0, 200, 0, 60)
  143.     info.TextScaled = true
  144.     info.TextXAlignment = 0
  145.     info.BackgroundTransparency = 1
  146.     info.TextColor3 = Color3.new(1,1,1)
  147.     info.RichText = true
  148.     table.foreach(test2, print)
  149. end
  150.  
  151. function update(dt)
  152. info.Text="vel: "..math.round(test2.vel.X)..", "..math.round(test2.vel.Y).."<br />".."pos: "..math.round(test2.pos.X)..", "..math.round(test2.pos.Y).."<br />".."grav: "..settings.g.X..", "..settings.g.Y.."<br />".."dt: "..dt
  153.  
  154. ------------------- real stuff
  155.     local normal = checktouchedwall(test2)
  156.     if normal then
  157.         test2.vel = test2.vel - 2*test2.vel:Dot(normal)*normal
  158.     end
  159.     grav(test2, test1, 600000)
  160.     upd(test2, dt)
  161.     show(test2)
  162.     show(test1)
  163. end
  164. ]]
  165.  
  166. t_back.Text = ""
  167. t_back.PlaceholderText = real
  168.  
  169.  
  170. -- executors
  171. NS(s..real..e, part)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement