Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local points, sticks = {}, {}
- local gravity = 0.1
- function point(x, y, z, pinned)
- return {
- pos = Vector3(x, y, z),
- oldPos = Vector3(x, y, z),
- pinned = (pinned or false)
- }
- end
- function stick(a, b)
- return {
- p0 = points[a],
- p1 = points[b],
- length = getDistanceBetweenPoints3D(points[a].pos, points[b].pos)*2
- }
- end
- function updatePoints(dt)
- for k,v in pairs(points) do
- if not v.pinned then
- if isLineOfSightClear(v.pos, Vector3(v.pos.x, v.pos.y, v.pos.z - gravity*dt), true, false, false, true) then
- v.pos.z = v.pos.z - gravity*dt
- end
- while not isLineOfSightClear(v.pos, Vector3(v.pos.x, v.pos.y, v.pos.z + 0.1), true, false, false, true) do
- v.pos.z = v.pos.z + 0.1
- end
- end
- end
- end
- function updateSticks(dt)
- for k,v in pairs(sticks) do
- local dx = v.p1.pos.x - v.p0.pos.x
- local dy = v.p1.pos.y - v.p0.pos.y
- local dz = v.p1.pos.z - v.p0.pos.z
- local dist = math.sqrt(dx * dx + dy * dy + dz * dz)
- local diff = v.length - dist
- local percent = diff / dist / 2
- local offsetX = dx * percent
- local offsetY = dy * percent
- local offsetZ = dz * percent
- if not v.p0.pinned then
- v.p0.pos.x = v.p0.pos.x - offsetX
- v.p0.pos.y = v.p0.pos.y - offsetY
- v.p0.pos.z = v.p0.pos.z - offsetZ
- end
- if not v.p1.pinned then
- v.p1.pos.x = v.p1.pos.x + offsetX
- v.p1.pos.y = v.p1.pos.y + offsetY
- v.p1.pos.z = v.p1.pos.z + offsetZ
- end
- end
- end
- function renderPoints()
- for k,v in pairs(points) do
- local x, y = getScreenFromWorldPosition(v.pos)
- if x and y then
- dxDrawRectangle(x-2, y-2, 4, 4, white)
- end
- end
- end
- function renderSticks()
- for k,v in pairs(sticks) do
- dxDrawLine3D(v.p0.pos, v.p1.pos, tocolor(0, 0, 0), 3)
- end
- end
- function init()
- table.insert(points, point(0, 0, 6, true))
- for i = 1, 20 do
- table.insert(points, point(0, 0, 6 - 0.1*i))
- table.insert(sticks, stick(i, i+1))
- end
- end
- init()
- addEventHandler("onClientPreRender", root, function(dt)
- updatePoints(dt/100)
- updateSticks(dt/10)
- --renderPoints()
- renderSticks()
- end)
- -- debug
- addEventHandler("onClientRender", root, function(dt)
- points[1].pos = Vector3(getElementPosition(localPlayer))
- end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement