📜  verlet 集成代码 - 任何代码示例

📅  最后修改于: 2022-03-11 14:55:04.191000             🧑  作者: Mango

代码示例1
local apart = game.Workspace.AnchorPart;local ppart = game.Workspace.PlanePart;local previousTime = tick(); function cloth(corner, width, height, length)        local points = {};    local constraints = {};    local m = math.sqrt(length^2 + length^2);    for y = 0, height do        for x = 0, width do            points[y] = points[y] or {};            points[y][x] = point.new((corner * CFrame.new(x, y, 0)).p);            if x ~= 0 then                local c = constraint.new(points[y][x], points[y][x-1], length);                c.line.Parent = game.Workspace.CurrentCamera;                table.insert(constraints, c);            end;            if y ~= 0 then                local c = constraint.new(points[y][x], points[y-1][x], length);                c.line.Parent = game.Workspace.CurrentCamera;                table.insert(constraints, c);                --[[                -- structure makes a difference!                if x < width then                    local c = constraint.new(points[y][x], points[y-1][x+1], m);                    c.line.Parent = game.Workspace.CurrentCamera;                    table.insert(constraints, c);                end;                --]]            end;            if y == 0 then                points[y][x].anchored = true;            end;        end;    end;    return points, constraints;    end; local width, height, length = 10, 10, 2;local cpoints, cconstraints = cloth(apart.CFrame, width, height, length); function update()    local delta = tick() - previousTime;    previousTime = tick();    local col = collision.new(ppart);    for i = 0, height do        if i == 0 then            for i2 = 0, width do                local x = cpoints[i][i2];                x.position = (apart.CFrame * CFrame.new(i2 * length, 0, 0)).p;            end;        end;        for i2 = 0, width do            local x = cpoints[i][i2];            x:update(delta, 0.9985);            --[[            -- collision            local lide = col:pointToPlanes(x.position);            if lide then                x.position = lide;            end;            --]]        end;    end;    for i = 1, 15 do        for _, c in ipairs(cconstraints) do            c:solve();        end;    end;    for _, c in ipairs(cconstraints) do        c:draw();    end;end; game:getService("RunService").Stepped:connect(update);