LINUX.ORG.RU

Ответ на: комментарий от zg

возникает рычаг, на который давит кинетическая энергия падения звена… Неподвижный край звена продолжать падение не может и становится опорой

Что то мне это напоминает. Фильм был прекрасный, там кто то собак растворял? Вот ведь склероз проклятый;-(

@thunar Вы как то цитировали.

AntonI ★★★★
()
Последнее исправление: AntonI (всего исправлений: 1)
Ответ на: комментарий от AntonI

Симуляка готова


Реализация

  • Жмак 1 фокус удался
  • Жмак 2 фокус не удался

Подготовка и запуск

mkdir simulaka && cd simulaka
touch main.lua
#copy-paste-code
love .

Симулякоходники

local world = { }
local objects = { }

local function reset_scene(minlen,maxlen)
    love.physics.setMeter(64)
    world = love.physics.newWorld(0, 0.81*64, true)
    ---
    objects.ground = { }
    objects.ground.body = love.physics.newBody(world, 200, 800)
    ---
    objects.ground.shape = love.physics.newRectangleShape(400, 50)
    objects.ground.fixture =
    love.physics.newFixture(objects.ground.body, objects.ground.shape)

    local start = -2000
    for i=1,12 do
        objects['l_plank_'..i] = { }
        objects['l_plank_'..i].body  = love.physics.newBody(world,200,start+maxlen*i,'dynamic')
        objects['l_plank_'..i].shape = love.physics.newRectangleShape(200,5)
        love.physics.newFixture(objects['l_plank_'..i].body,
                                objects['l_plank_'..i].shape)
    end
    local cnt = 1
    local l , r = minlen,maxlen
    for i=1,11 do
        objects['l_joint_'..cnt+0] =
        love.physics.newRopeJoint(objects['l_plank_'..i+0].body,
                                  objects['l_plank_'..i+1].body,
                                  100,(start+maxlen*i),100,(start+maxlen*(i+1)),l,true)
        objects['l_joint_'..cnt+1] =
        love.physics.newRopeJoint(objects['l_plank_'..i+0].body,
                                  objects['l_plank_'..i+1].body,
                                  300,(start+maxlen*i),300,(start+maxlen*(i+1)),r,true)
        cnt = cnt + 2
        l , r = r, l
    end
    ---
    for i=1,12 do
        objects['r_plank_'..i] = { }
        objects['r_plank_'..i].body  = love.physics.newBody(world,600,start+maxlen*i,'dynamic')
        objects['r_plank_'..i].shape = love.physics.newRectangleShape(200,5)
        love.physics.newFixture(objects['r_plank_'..i].body,
                                objects['r_plank_'..i].shape)
    end
    ---
    local cnt = 1
    local l , r = maxlen, minlen
    for i=1,11 do
        objects['r_joint_'..cnt+0] =
        love.physics.newRopeJoint(objects['r_plank_'..i+0].body,
                                  objects['r_plank_'..i+1].body,
                                  500,(start+maxlen*i),500,(start+maxlen*(i+1)),l,true)
        objects['r_joint_'..cnt+1] =
        love.physics.newRopeJoint(objects['r_plank_'..i+0].body,
                                  objects['r_plank_'..i+1].body,
                                  700,(start+maxlen*i),700,(start+maxlen*(i+1)),r,true)
        cnt = cnt + 2
        l , r = r, l
    end

end

function love.load()
    love.window.setTitle('#####')
    love.window.setMode(800,1000)
    ---
    reset_scene(50,200)
    love.graphics.setLineWidth(1)
end

function love.update(dt)
    world:update(dt)

end

function love.keypressed(key)
    if key == '1' then
       reset_scene(50,200)
    end
    if key == '2' then
       reset_scene(200,200)
    end
end


function love.draw()
     love.graphics.polygon("fill",
     objects.ground.body:getWorldPoints(objects.ground.shape:getPoints()))
     for i=1,12 do
         love.graphics.polygon("fill",
         objects['l_plank_'..i].body:
         getWorldPoints(objects['l_plank_'..i].shape:getPoints()))
     end

     for i=1,12 do
         love.graphics.polygon("fill",
         objects['r_plank_'..i].body:
         getWorldPoints(objects['r_plank_'..i].shape:getPoints()))
     end
     love.graphics.setColor(0, 1, 0)
     for i=1,22 do
         love.graphics.line(objects['l_joint_'..i]:getAnchors())
     end
     for i=1,22 do
         love.graphics.line(objects['r_joint_'..i]:getAnchors())
     end
     local x, y  = objects['r_joint_1']:getAnchors()
     love.graphics.line(0,y,800,y)

     love.graphics.setColor(1, 1, 1)

     love.graphics.print(
     "Press 1 for variant 1\n\nPress 2 for variant 2",310,50,0,1.5,1.5)
 end
LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от AntonI

Там для лучшей наглядности надо было скорость раза в два или три понизить, тогда буквально видно как нитки по очереди с разных сторон дёргают всю конструкцию вниз. Показать как импульс дёргания распространяется я неосилил и поленился (но было бы красиво), там надо у каждой ниточки и палочки рассчитывать отдельно, а потом снизу вверх по очереди закрашивать например красным типа брлбрлбрлррууньк на верх импульс полетел тянущий вниз. Но блин это долго всё рисовать. В коде можно гравитацию на world = love.physics.newWorld(0, 0.4*64, true) поставить, а на ютубе видео замедлить в два раза

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 2)
Ответ на: комментарий от LINUX-ORG-RU

Прикольно, я не знал что есть прям такие простые софтины для моделирования - мы то все сами ручками пишем.

AntonI ★★★★
()
Ответ на: комментарий от AntonI

Нашел!

возникает рычаг, на который давит кинетическая энергия падения звена… Неподвижный край звена продолжать падение не может и становится опорой

наш ответ Чемберлену:

Первые опыты по хромированию собак поставил румынский академик Петро́вич.
— Профессор, вот кролик в разрезе. Давайте ему что-нибудь введём.
— Отлично, давайте немедленно введём кролику хром.
— А, может, лучше бром?
— Э-э. Бром, вступая в реакцию с молекулами мяса, может вызвать у кролика отторжение от тела, и тогда кролик сдохнет.

Если бесконечность сменить на семёрку, то тогда посмотрите, как ведёт себя хром.
AntonI ★★★★
()
Ответ на: комментарий от AntonI

Это не совсем для моделирования, на этом игры делают. Ну и физика Box2D

Просто даже такой грубой симуляции для как у вас называется «численного эксперимента» вроде. Ну когда там вещи симулируются в очень условных границах, но даже их хватает чтобы отразить суть. Вот тут так же получается.

Вот уж доделал, (нашёл API функцию получения текущей угловой скорости для палочек)

Ютуб блин принудительно shorts сделал….

local world = { }
local objects = { }

local function reset_scene(minlen,maxlen)
    love.physics.setMeter(64)
    world = love.physics.newWorld(0, 0.4*64, true)
    ---
    objects.ground = { }
    objects.ground.body = love.physics.newBody(world, 200, 800)
    ---
    objects.ground.shape = love.physics.newRectangleShape(400, 50)
    objects.ground.fixture =
    love.physics.newFixture(objects.ground.body, objects.ground.shape)

    local start = -2000
    for i=1,12 do
        objects['l_plank_'..i] = { }
        objects['l_plank_'..i].body  = love.physics.newBody(world,200,start+maxlen*i,'dynamic')
        objects['l_plank_'..i].shape = love.physics.newRectangleShape(200,5)
        love.physics.newFixture(objects['l_plank_'..i].body,
                                objects['l_plank_'..i].shape)
    end
    local cnt = 1
    local l , r = minlen,maxlen
    for i=1,11 do
        objects['l_joint_'..cnt+0] =
        love.physics.newRopeJoint(objects['l_plank_'..i+0].body,
                                  objects['l_plank_'..i+1].body,
                                  100,(start+maxlen*i),100,(start+maxlen*(i+1)),l,true)
        objects['l_joint_'..cnt+1] =
        love.physics.newRopeJoint(objects['l_plank_'..i+0].body,
                                  objects['l_plank_'..i+1].body,
                                  300,(start+maxlen*i),300,(start+maxlen*(i+1)),r,true)
        cnt = cnt + 2
        l , r = r, l
    end
    ---
    for i=1,12 do
        objects['r_plank_'..i] = { }
        objects['r_plank_'..i].body  = love.physics.newBody(world,600,start+maxlen*i,'dynamic')
        objects['r_plank_'..i].shape = love.physics.newRectangleShape(200,5)
        love.physics.newFixture(objects['r_plank_'..i].body,
                                objects['r_plank_'..i].shape)
    end
    ---
    local cnt = 1
    local l , r = maxlen, minlen
    for i=1,11 do
        objects['r_joint_'..cnt+0] =
        love.physics.newRopeJoint(objects['r_plank_'..i+0].body,
                                  objects['r_plank_'..i+1].body,
                                  500,(start+maxlen*i),500,(start+maxlen*(i+1)),l,true)
        objects['r_joint_'..cnt+1] =
        love.physics.newRopeJoint(objects['r_plank_'..i+0].body,
                                  objects['r_plank_'..i+1].body,
                                  700,(start+maxlen*i),700,(start+maxlen*(i+1)),r,true)
        cnt = cnt + 2
        l , r = r, l
    end

end

function love.load()
    love.window.setTitle('#####')
    love.window.setMode(800,1000)
    ---
    reset_scene(50,200)
    love.graphics.setLineWidth(1)
end

function love.update(dt)
    world:update(dt)

end

function love.keypressed(key)
    if key == '1' then
       reset_scene(50,200)
    end
    if key == '2' then
       reset_scene(200,200)
    end
end


function love.draw()
     love.graphics.polygon("fill",
     objects.ground.body:getWorldPoints(objects.ground.shape:getPoints()))
     for i=1,12 do
         local w = math.abs(objects['l_plank_'..i].body:getAngularVelocity( ))
         love.graphics.setColor(0.5+(w*2), 0.5-(w*2), 0.5-(w*2))
         love.graphics.polygon("fill",
         objects['l_plank_'..i].body:
         getWorldPoints(objects['l_plank_'..i].shape:getPoints()))
     end

     for i=1,12 do
         local w = math.abs(objects['r_plank_'..i].body:getAngularVelocity( ))
         love.graphics.setColor(0.5+(w*2), 0.5-(w*2), 0.5-(w*2))
         love.graphics.polygon("fill",
         objects['r_plank_'..i].body:
         getWorldPoints(objects['r_plank_'..i].shape:getPoints()))
     end
     love.graphics.setColor(0, 1, 0)
     for i=1,22 do
         love.graphics.line(objects['l_joint_'..i]:getAnchors())
     end
     for i=1,22 do
         love.graphics.line(objects['r_joint_'..i]:getAnchors())
     end
     local x, y  = objects['r_joint_1']:getAnchors()
     love.graphics.line(0,y,800,y)

     love.graphics.setColor(1, 1, 1)

     love.graphics.print(
     "Press 1 for variant 1\n\nPress 2 for variant 2",310,50,0,1.5,1.5)
 end
LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 3)
Ответ на: комментарий от LINUX-ORG-RU

Че то как то много букв выходит… казалось бы на такой высокоуровневой штуке оно все лаконичнее должно быть.

AntonI ★★★★
()
Ответ на: комментарий от AntonI

Копипаста кодинг. Написал одно для левой части, скопипастил подправил под правое :D Это одноразовый код, чего его сокращать то :)

Зато всё явно, нет никаких хитростей и код полноценный.

высокоуровневой штуке

Это не движок, из высокоуровнего там лишь lua API, а так Love2D это просто сборочка сишных библиотек где то чуть упрощено, но в целом делай всё сам. На голой Сишке +/- тоже самое будет.

Вот был бы движок, тогда да, мышкой нарисовал геометрию, ей же соединил и в меню задал всякие значения. Но, это не всегда удобно, на ЛОР не скинешь :D

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 2)
Ответ на: комментарий от LINUX-ORG-RU

Не, ну там где то должны быть уравнения движения для обьектов типовой формы (в т.ч. готовые тензоры инерции), долны быть численные схемы какие то… ?

AntonI ★★★★
()
Ответ на: комментарий от AntonI

Всё внутри Box2D он для этого и существует. Физика твёрдого тела, упругость, трение, линейные и угловые ускорения. Всё. Как угодно их считай получишь одно и тоже лишь с разницей в точности. Тут точность не нужна от слова совсем.

Ничего, вон физики в тазике воронку с водой делают и типа такие, «так вот это вот чёрная дыра типа, давайте опишем происходящее формулами» :D И ведь реально сидят и описывают хехе ибо даже такое наигрубейшее сравнение не меняет сути искривления тут воды, а там пространства.

А вот если бы я попытался симулировать на этом какой то долгоиграющий эффект или/и особенно сложную систему где некий эффект проявляется как сумма других слабых эффектов типа того, то ничего бы у меня не получилось ибо ошибка в рамках Box2D была бы такая большая что вся суть затерялась бы, тут уже нужен ты и подобные, которые бы сели и вручную писали бы все вычисления дабы снизить значение ошибки и в целом не допустить неявных каких то там расчётов которые могут похерить результат на раз два.

И вообще, я быдлокодер, а по физике у меня была двойка, я не знаю ничего :D Оно само.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

я быдлокодер, а по физике у меня была двойка, я не знаю ничего :D Оно само.

Ну что тут скажешь кроме как

Господа, следующий номер нашей программы — вручение Нобелевской премии мира по химии. Лауреатом в этом году единогласно признан профессор Гендельбах из России. В связи с невозможностью профессора лично присутствовать на церемонии из-за отсутствия средств передвижения, премия вручается временному поверенному Гендельбаха — послу Албании в Нидерландах барону Нордау. 
AntonI ★★★★
()
Ответ на: комментарий от AntonI

Тонко ты меня шизиком назвал, так же тонко и глубоко как та «яма, наполненная бромом что может хлорироваться только четырьмя молекулами углерода» :D

Вспомнилось ещё это

Не в тему, но всегда с улыбкой смотрю этот ролик и понятия не имею про что там говорит этот интересный дядька :)

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Чей то сразу шизиком то… у тебя типично инженерный подход к решению задачи;-)

ну а чего, нормальная лекция. Я на семинарах (научных, т.е. для коллег) наверное еще непонятнее звучу иногда;-(

AntonI ★★★★
()
Ответ на: комментарий от AntonI

Чей то сразу шизиком то

Ну значит я промахнулся, обычно фильм «Комплекс Невменяемости» вспоминают когда происходит что-то неадекватное. Или просто смысл не допёр, проснувшись позавчера на данный момент какой либо в принципе смысл я улавливаю не оч :D

ну а чего, нормальная лекция.

Да я не спорю, если понимать нормальная наверное. Чтобы понимать почему таким как я нравятся такие ролики нужно не понимать ничего в том о чём в этих роликах говорится. Простые люди любят что-то непонятное на умном приправленное экшоном или ещё чем ярким.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Простые люди

Конечно, товарищу Хунте, как бывшему иностранцу и работнику церкви, позволительно временами заблуждаться, но вы-то, товарищ Ойра-Ойра, и вы, Федор Симеонович, вы же простые русские люди!
    — П-прекратите демагогию! — взорвался, наконец, и Федор Симеонович. — К-как вам не совестно нести такую чушь? К-какой я вам п-простой человек? И что это за слово такое — п-простой? Это д-дубли у нас простые!..
    — Я могу сказать только одно, — равнодушно сообщил Кристобаль Хозевич. — Я простой бывший Великий Инквизитор, и я закрою доступ к вашему автоклаву до тех пор, пока не получу гарантии, что эксперимент будет производиться на полигоне.

любят что-то непонятное на умном приправленное экшоном или ещё чем ярким.

Вот поэтому то комплекс невменяемости и заходит на ура, и не только «простым» людям;-)

AntonI ★★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)