
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.52] |
![]() |
|
Сообщ.
#1
,
|
|
|
Очень нужно забацать лабораторную работу. Она заключается в том, что о плоскость ударяется упругий шар. Упругий это означает что при ударе он деформируется. Постепенно он должен успокоиться и не прыгать. Такую фигню надо написать на чистом Turbo Pascal'e. Начал копать инфу - нигде нет никакой инфы по созданию трехмерных объектов. В связи с этим нескольких вопросов:
1. Подскажите, пожалуйста, где можно найти инфу по созданию трехмерных объектов в паскале. 2. Нашел несколько работ: а) http://pascal.sources.ru/tmt/samples/bounce.zip - практически то что надо (только шар не останавливается). Но работа написана с применением opengl и под другой компилятор. А так низзя... Возможно кто-нибудь посоветует как переписать это чудо. б) http://pascal.sources.ru/demo/ball.zip - просто крутится в воздухе. Такую фигню было бы очень прикольно переписать. Чтобы падал и деформировался. в) Еще Passrc.zip (ссылку найти не могу) - то что надо только не деформируется. Помогите пожалуйста. Знакомый программер болеет и вежливо посылает меня. Как с чего начать???Реально ли эти проги переписать... ПОсоветуйте пожалуйста... Заранее благодарю... |
Сообщ.
#2
,
|
|
|
Надо спросить у wormball. Он точно знает %)
З.Ы. А почему именно трехмерный ? Так поставлено условие задачи ? |
Сообщ.
#3
,
|
|
|
Цитата Some1 @ 13.12.03, 13:17 Да такая задача. Надо спросить у wormball. Он точно знает %) З.Ы. А почему именно трехмерный ? Так поставлено условие задачи ? 1. Должен быть трехмерный шар и плоскость. 2. Шар должен ударяться о плоскость упруго (т.е. деформироваться при ударе). 3. В конце шар должен прекратить свое движение. А как спросить у wormball??? Написать ему приватное сообщение??? Не нагловато будет??? Да еще нашел ссылку на PASSRC.ZIP ( http://www.programmist.info/pub/PASSRC.ZIP )... Но это так между делом... |
Сообщ.
#4
,
|
|
|
Будет не нагловато, если ты вежливо попросишь. Кинь ему в сообщении линк на тему, и попроси посмотреть.
|
Сообщ.
#5
,
|
|
|
Ты паскаль знаешь? С 3Д когда нить работал?
Вопросик по задаче: шар деформируется только теноретически или же это должно отображаться на екране? 3д перспективное или изометрическое? |
Сообщ.
#6
,
|
|||
|
В том все и дело что нет... Есть опыт работы на Perl немного на C. Но pascal + 3d - никогда. Т.е. сам паскаль то знаю, а вот 3d уже нет. Основная сложность - отсуствие документации... И плохое понимание работы с графикой в паскале. Начал домогаться своего знакомого программера - от сказал что в примере PASSRC.ZIP сделать деформацию нереально - проще переписывать заново. С текстурами ничего неясно... Вот так-то все печально... Деформирование шара должно отображаться на экране. Повторюсь но идеал http://pascal.sources.ru/tmt/samples/bounce.zip . Очень все четко работает. По поводу перспективного и изометрического не понял... Поясни plz... |
Сообщ.
#7
,
|
|
|
Я имею ввиду 3д в какой проекции перспективноу (z-вглубь, х-вправо, у-вверх) или изометрическое (z-вверх а остальные оси под 120 градусов друг к другу). Текстуры чтоли тоже надо?
|
Сообщ.
#8
,
|
|||
|
насоветуешь ещё.... ![]() по графике ничем не могу помочь, разве что в виде линий, а текстурировать я не умею. а чтобы он деформировался - ето можно. смысл такой: шар задаётся в виде футбольного мяча, ну тоесь фигуры с 60 вершинами. получается массив из 60 точек в трёхмерном пространстве и связей между ними. далее постулируешь, что связи - ето пружинки, а вершины - ето точечные массы, и что со стороны центра шара действует постоянная сила давления воздуха, а при соприкосновении с землёй действует сила отталкивания от земли, ну и хорошо бы не забыть про силу тяжести. ну и рассчитываешь всё ето механикой. а потом на ето можно и текстуры натянуть. не знаешь как рассчитывать механику - спрашивай |
Сообщ.
#9
,
|
|
|
да кстати. готовый футбольный мяч http://enzyme.nm.ru/files/football.ent
|
Сообщ.
#10
,
|
|
|
Вот у меня есть такой исходник на Делфи: http://albom.nm.ru/ball.rar
Переделать его под TP7 в общем довольно просто. Необходимо выкинуть все что отностится к WinApi и OpenGL, и написать одну функцию проекции точки на экран. Вот вроде и все. Если подойдет, то смело обращайся, если что в нем будет не ясно. |
Сообщ.
#11
,
|
|
|
Я спрашиваю. %))) ты хорошё знаешь механику. Всегда завидовал %))))
Мне бы хотябы основные сведения. Ты хоть скажи, где это в доступной форме изложено. Или изложи основы сам. %) |
Сообщ.
#12
,
|
|
|
Ребят, спасибо большое... Еще спасибо уважаемому xxxnnn, который написал мне некоторые рекомендации по мылу... Буду думать и стараться...
Да только у пользователя albom не скачивается его мяч... (если не сложно - скинь на мыло - arkhangel(собака)mail.ru )... Еще раз всех благодарю... искренне... |
Сообщ.
#13
,
|
|||||||||||||||||||||||||
|
не! хорошо знать механику я буду, когда смоделирую велосипед ![]() а действительно хорошо знает механику vot какой мужик: http://graphics.stanford.edu/~fedkiw/ в алгоритмах c300g ссылку дал
в учебниках по физике ![]() напр есть такой савельев, там насколько я помню всё в доступной форме, для нефизических специальностей вузов. ну или ландау лифшиц, там в недоступной форме для физических специальностей ![]() собственно в расчёте системы материальных точек нет ничего сложного. у тебя есть два массива трёхмерных векторов: координаты точек q и их скорости v, и один массив с массами. вектор задаётся приблизительно так:
мне лично больше нравится первый вариант, ибо можно написать for x:=0 to 2 do v[x]..... . также у тебя есть массив пружинок:
, где node1 и node2 - номера связанных точек, k - жёсткость, len - равновесная длина пружинки. или можно задать пружинки подругому, главное чтобы были определены параметры k и len. сначала рассчитываешь силу, действующую на каждую точку. если две точки соединены пружинкой, то на каждую действует сила, пропорциональная разности расстояния между точками и равновесной длины с коэффициентом пропорциональности k:
. но ето ещё полдела. надо силу пересчитать в приращение скорости. здесь надо знать направление силы. в нашем случае она направлена по оси, соединяющей точки, поетому чтобы получить координатные составляющие, надо силу умножить на направляющие косинусы, а приращение скорости равно силе, делённой на массу и умноженному на временной шаг dt:
тут главное не перепутать полярность, ибо иначе пружина будет не стягивать, а отталкивать. при соприкосновении с субстратом (предположим, что ето происходит когда z<0) действует сила реакции опоры, можно её представить пропорциональной степени погружения с коеффициентом n:
в общем случае ето может быть негоризонтальная поверхность, да и вобще могут сталкиваться два многогранника, так что сила реакции опоры может быть и не такой. ещё хорошая сила - сила трения. она пропорциональна скорости с некоторым коеффициентом b, а приращение скорости записывается так:
. ну и главная сила - сила тяжести ![]()
собственно можно придумывать собственные силы, напр в нашем случае нам нужно давление воздуха внутри шара. мы конечно не будем углубляться в тонкости газодинамики и примем (заметьте, от балды!!), что сия сила постоянна по модулю и действует со стороны центра шара. центр же определяется так:
а само приращение скоростей
наконец, когда все силы посчитаны, надо посчитать приращения координат:
и мы можем с чистой совестью сказать, что совершили один шаг численного интегрирования уравнений ньютоновской механики методом верлета. етим методом хорошо считать молекулы: http://moldyn.ru/bioinzhenerija/doc/stat/moldyn.htm собственно я в етой лаборатории делаю курсовую. а более сложные обьекты вроде велосипеда уже не представишь в виде системы материальных точек: ето уже будет система твёрдых тел, и если моделировать твёрдое тело системой точек, то там появляются гигантские жёсткости, и требуется очень маленький шаг интегрирования. что особенно неприемлемо, когда ты хочешь сделать реал-тайм симулятор велосипеда. собственно такие системы тоже можно моделировать с помощью механики твёрдого тела, но я ещё не очень её освоил. там надо расписывать уравнения относительно моментов импульса, вращать поразному, хотя если пару дней целиком посвятить расписыванию, обязательно чтото получится. а как моделировать жидкости или газы - ето я и в страшном сне представить не могу ![]() |
Сообщ.
#14
,
|
|
|
=8-[ ]
Cнимаю шляпу, профессор. %))))) Мне понимание сего не дано. Примерно после 3-4 выкладки тега CODE я начал терять смысл написанного %))) Кошмар !! Я даже не представляю, как это можно всё понимать. Остаётся кусать локти и ругать про себя дебильного учителя по физике в школе, который не смог нормально привить мне любви к этому предмету с самого начала. :'''''( З.Ы. Я ТОЖЕ ТАК ХОЧУУУУУУ.... %'''''(((((( |
Сообщ.
#15
,
|
|||
|
То бишь после такого шага нужно пересчитать координаты всех точек, умножив вычисленные вектора скоростей на dt<<1 и наконец нарисовав несчастный футбольный мяч с помощью банального line(x1,y1,x2,y2) ![]() ![]() |
Сообщ.
#16
,
|
|||||
|
точно ![]()
тамбовский волк тебе профессор!! профессор тем и отличается от студента, что может объяснять так, чтобы его понимали. я наверное поступил неправильно, смешав принципы работы с техническими деталями. попробую изложить принципы отдельно. ну есь у тебя точка. как известно, у неё есть три координаты и три скорости. причём координаты изменяются во времени, и производная координаты по времени равна скорости. стало быть чтобы получить координату в следующий момент времени, ты должен к координате прибавить скорость, умноженную на временной промежуток: x(t+dt)=x(t)+vx*dt. но скорость меняется во времени, поетому ето получится только линейное приближение, и тем более точное, чем меньше промежуток dt. чтобы узнать скорости на последующем шаге, есь легендарная формула ньютона: F=m*a dv/dt=F/m v(t+dt)=v(t)+F/m*dt , где F - равнодействующая сила, тоесь сумма всех сил. всё вроде |
Сообщ.
#17
,
|
|||
|
v(t+dt)=v(t)+dt*F/m :) иначе несколько раз умножишь и лопнет твой шарик :) |
Сообщ.
#18
,
|
|
|
исправил
только она не лопнет, а наоборот остановится, ведь dt маленькое ![]() |
Сообщ.
#19
,
|
|
|
В целом уже понятнее %) Но ещё требует осмысления. Тем более практического. %)
Равнодействующая сила - это что такое ? |
Сообщ.
#20
,
|
|
|
Равнодействущая сила... хм, Some1 а ты физику в школе пинал?
![]() |
Сообщ.
#21
,
|
|||
|
ну не такая уж и виртуальная ![]() по крайней мере не более виртуальная, чем все её составляющие |
Сообщ.
#22
,
|
|
|
Читай пост с начала. Там написано и про физику, и про школу :**((( Я примерно себе представляю, что такое равнодействующая. Но сила - это вобще виртуальное понятие. В нашем случае все силы представляют собой: вектор направления действия силы и число - сила воздействия силы. Так ? Я не знаю, как это всё в терминах. И равнодействующая сила должна быть суммой всех этих векторов, так ? А числовое значение этой силы как должно считаться ? То, которое обозначает, как сильно эта сила действует на тело ?
|
Сообщ.
#23
,
|
|||||
|
сила представляет собой просто вектор, а у вектора уже есь модуль и направление. ну или три координаты. собственно она такой же вектор, как и координата точки и её скорость. но в ряде случаев, как например с пружинкой, нам проще сначала посчитать модуль и направление, а потом посчитать три компоненты, непосредственно нужные для расчёта. если M - модуль силы, а r - её направление, то сама сила равна
, где || - модуль, а чёрточка над буквой - знак того, что ето вектор. а в других случаях, как напр с силой трения, мы можем сразу вычислять компоненты вектора.
накопал в инете небольшую статью: http://www.komi.com/DFSH/study/lessons/lesson01/lesson01.htm накопал я её в даже не знаю как назвать, нечто среднее между поисковиком и сборником статей. http://en.edu.ru/db/msg/35325/_sp/3368/1410 называестя "естественнонаучный образовательный портал" возможно там и про велосипед есь, и про жидкости |
Сообщ.
#24
,
|
|
|
зы. там же откопал
http://images.en.edu.ru/pubs/2003/09/13/00...048/kvatern.pdf похоже ето то, что поможет мне с велосипедом |
Сообщ.
#25
,
|
|
|
Буду читать %)
|
Сообщ.
#26
,
|
|||
|
Айм сорри ![]() ![]() |
Сообщ.
#27
,
|
|
|
[offtopic]оценки ето вселенское зло!! всё что было сказано во флейме относительно рейтингов и статусов, в полной мере относится к оценкам, даже ещё в большей степени! я лично по возможности сру на оценки, в школе ето получалось замечательно, а в универе троечникам стипендию не платят, и в аспирантуру говорят нужен красный диплом
![]() невидать мне похоже аспирантуры[/offtopic] |
Сообщ.
#28
,
|
|
|
Ладно. В полном руководстве по схеме от wormball у меня получилось вот что: (jumpball.zip, его нужно еще собрать) В параметре к программе указывается фигура (*.dat) которая и будет прыгать. По крайней мере куб прыгает более-менее устойчиво
![]() ![]() ![]() ![]() Буду признателен, если поможете. Кстати, автор куда-то пропал. Да, вот еще. Просьба не бить ![]() Прикреплённый файл ![]() |
Сообщ.
#29
,
|
|
|
Потому и выворачивает, что нет внутреннего давления. Но для объектов, отличных от шара внутреннее давление расчитать наверно будет куда сложнее. В разных местах такого объекта давление по идее должно быть разным. Или направлено по разным осевым. для фигут типа буквы К вобще задача ещё больше усложняется. Основное правило, которое должно соблюдаться - фигура должна быть выпуклой, тоесть не образовывать из своих плоскостей углов вовнутрь.
|
Сообщ.
#30
,
|
|
|
Я тут подумал над этим ночью
![]() ![]() |
Сообщ.
#31
,
|
|
|
а чо ето она утебя так дико тормозит?? ка сделать чтобы она не тормозила? и вобще помоему никого там не выворачивает
|
Сообщ.
#32
,
|
|
|
Ну дык шаг-то 1Е-4, вычисления типом extended, один фрейм есть 100 циклов, да еще я его вообще никак еще не оптимизировал.
А ты tor.dat ему в параметры подсовывал? У меня так после капитального сжатия вывернутый кусок тора проскочил насквозь еще нормальный ![]() |
Сообщ.
#33
,
|
|||||
|
ну, а в какой строчке ето записано??
подсовывал, но он у меня считался настолько медленно, что я его вырубил, не дождавшись действа |
Сообщ.
#34
,
|
|||||
|
Все есть в константах ![]() ![]() Кстати константы там все откомментированы.
Хе, а у тебя какой комп? У меня Р3-866, 6фпс считает ![]() ![]() Если хочешь, можешь включить давление, есть там такая строчка pressflag:=false; а строкой выше выражение для определения, а можно ли давление включать. |
Сообщ.
#35
,
|
|
|
да, чото их не по детски колбасит.....
я думаю у тебя глюк в программе |
Сообщ.
#36
,
|
|
|
А не подскажешь где?
![]() ![]() ![]() |
Сообщ.
#37
,
|
|
|
а если шаг в 10 раз увеличить, то их тоже колбасить начинает! мож параметры надо поменять?? ты кстати центр каждый раз рассчитываешь?
зы.а мож ты у пружин всётаки полярность перепутал?? |
Сообщ.
#38
,
|
|
|
жёсткость 283, давление 150, для всех фигур, реакция опоры 6, шаг 0.001. всё вроде правильно.
|
Сообщ.
#39
,
|
|||||||||
|
Неа ![]() ![]() ![]()
Я так понял, если pe*dt>1, начинают сказываться машинные нули ![]() ![]() ![]()
Ага, ну и круто. А тор что, не выворачивается? Ща проверю. И правда, прыгает ![]()
Хм. Спасибо, это же громадный гемор
![]() ![]() |
Сообщ.
#40
,
|
|||||
|
почему нули?? помоему как раз наоборот
ыы? я ж совсем другое имел в виду! ежели ты его вычисляешь на первом шаге, то утебя ведь фигура едет, а центр стоит!! так что надо на каждом шаге его вычислять, а тормозит у тебя имхо главным образом графика. и вобще, как ты пружинки задаёшь? только по сетке или каждая точка соединена с каждой другой?? |
Сообщ.
#41
,
|
|||||||||
|
Я имел в виду, при каждом шаге неизбежны ошибки в примерно 1е-19 в расстоянии между точками. Потом в applysprings етот 1е-19 множится на ре, а в updatevelocity на дт, в результате ошибка нарастает лавинообразно.
Я его вычислял вместо одного раза 504 ![]() ![]()
По сетке, там есть массив masgran, он и хранит всю сетку. Я по нему прохожу до инитграфа, генерируя masspring достаточно тупым алгоритмом, а именно проверяю, есть ли уже пружина, связывающая эти вершины, и если нет, связываю.
Это вполне возможно, я не подвергал ету прогу анализу по времени. Там в среднем 6 раз считаются нормали граней, правда они динамические, но мне влом делать еще один массив в куче.
|
Сообщ.
#42
,
|
|||||
|
тоже мне неточность нашёл! там возникают неточности куда более чудовищного масштаба. а именно, когда ты подвигаешь точку на конечное приращение, ты говоришь, что её скорость постоянна на всём промежутке dt, хотя она в натуре меняется, и когда ты приращиваешь скорости, ты опять же говоришь что сила постоянна. поетому шаг интегрирования берут не более 1/10 периода самого быстрого колебания. Добавлено в
кинь мне исправленную версию! самому лень разбираться |
Сообщ.
#43
,
|
|||||
|
Здесь ты неправ, когда я двигаю точку, я считаю, что скорость в процессе меняется, по линейному закону, а вот с силой это действительно так, она считается неизменной на всем dt.
Ааа, не любишь копаться в чужом коде? Согласен, темный лес. Щас. (Я сейчас не дома, а править там почти нечего) Хм. А здесь тор сначала сплющился, а потом все-таки прыгнул, восстановив форму. Прикреплённый файл ![]() |
Сообщ.
#44
,
|
|||
|
не! когда ты считаешь что dx=v*dt, то v у тебя постоянно. и вобще чото у тебя с пружинками. я давление увеличил, а кубик симметрию потерял. да и вобще чото не такое уж большое увеличение скорости ![]() |
Сообщ.
#45
,
|
|
|
:) У меня dx=(2v+dv)*dt/2, а точнее dx=v*dt,dx:=(dx+(v+dv)*dt)/2;
|
Сообщ.
#46
,
|
|
|
а ты уверен что ето действительно ближе к реальности, чем dx=v*dt? я почемуто нет
|
Сообщ.
#47
,
|
|
|
По этому методу вычисленная равнодействующая действует на тело dt времени, масса там 1, следовательно ускорение есть F, тогда vnew=v+F (vnew это новое значение скорости) тогда dx=(vdt+vnew*dt)/2.
|
Сообщ.
#48
,
|
|||
|
помоему ето уже учитывается формулой
ежели её расписать, получится моя формула, а твоя имхо получается вторичным учётом етого же мне ща лень расписывать, порасписывай сам, но помнится нам ето на лекциях рассказывали |
Сообщ.
#49
,
|
|
|
Ты считаешь мгновенную величину ускорения и прироста пути, а в программе нужно все это разворачивать для нахождения прироста за шаг пересчета. Из-за этого и возникает такой трюк.
Добавлено в ЗЫ: А веселая полемика у нас с тобой возникла по поводу несчастной физики, а бьёмся мы имхо из-за разных исползованных понятий: ты говоришь всегда про мгновенное изменение, а я про dx/Dt. (в смысле дельта Т>0). |
Сообщ.
#50
,
|
|
|
правильно, но помоему ето как раз развёрнуто в первоначальной формуле
|