![]() |
|
Модераторы: Rickert |
![]()
|
|
| sSilence |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 27.5.2009 Репутация: нет Всего: нет |
Здраствуйте.
Подскажите как сделать мяч который падает с определенной высоты, по законам гравитации и отскакивает. я не могу (понять, сделать) цикл, по которому, мяч должен падать и отпрыгивать все должно происходить по формуле at^2+yt+y(0) или еще как... подскажите, можно только цикл. Спасибо. Не откажусь и от примера) Это сообщение отредактировал(а) sSilence - 27.5.2009, 21:46 |
|||
|
||||
| Mazzi |
|
|||
|
Правильный ![]() ![]() Профиль Группа: Комодератор Сообщений: 825 Регистрация: 3.4.2003 Репутация: 4 Всего: 21 |
Делай так.
Задай переменные: скорость, расстояние до земли. Исходное положение: скорость == 0, расстояние == N цикл_пока (расстояние > 0) { скорость++; расстояние--; рисуем_мяч(); } цикл_пока (скорость > 0) { скорость--; расстояние++; рисуем_мяч(); } Примитивно, но для иллюстрации сгодится. -------------------- Мне нужны помощники. |
|||
|
||||
| Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 5 Всего: 27 |
Нет, не сгодится.
На разных машинах это будет работать по разному. Вот праильная схема: 1. понадобятся три 64 битные переменные (t1, t2, f) 2. При старте Вызываем API QueryPerfomanceCounter(t2); // Количество тиков на данный момент времени 3. При старте Вызываем API QueryPerformanceFrequency(f); // Частота процессора 3. Тело программы While (!Stop) { QueryPerfomanceCounter(t1); deltaT = (t1 - t2) / f; if (deltaT>0.1) // Скорость работы не быстрее 0.1 секунды { QueryPerfomanceCounter(t2); Speed += g*deltaT; if (Координата_шарика_Y>0) Координата_шарика_Y + = Speed; else Speed = -1; // -1 это значение с потолка, то есть 1 метр в секунду вверх } } 4. переменная g это ускорение свободного падения = 9.822 Типы всех переменных, думаю интуитивно понятны |
|||
|
||||
| Rickert |
|
|||
|
Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 6 Всего: 52 |
Люди не гоните, скорость не может задаваться постоянным значением. Она должна расчитываться исходя из разницы во времени между сменой кадра.
-------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
| Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 5 Всего: 27 |
Rickert, а я что написал?
|
|||
|
||||
| Mazzi |
|
|||
|
Правильный ![]() ![]() Профиль Группа: Комодератор Сообщений: 825 Регистрация: 3.4.2003 Репутация: 4 Всего: 21 |
Я показал всего лишь иллюстрацию, без подробностей.
-------------------- Мне нужны помощники. |
|||
|
||||
| Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 5 Всего: 27 |
Что же она иллюстрирует? Что мяч должен опускаться вниз, а потом подниматься вверх что ли? Думаю автор сам понимает что значит "падает" и "отскакиваает"
|
|||
|
||||
| sSilence |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 27.5.2009 Репутация: нет Всего: нет |
госпада.
все еще проще чем кажется,
|
|||
|
||||
| Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 5 Всего: 27 |
это вобще не понятно что цифры какие-то от балды... лажа. Попробуй запусти на машине в 233 Мг и на машине с 4мя ядрами...
это называется проще? Я тебе реальное решение показал. Ну как знаешь... Это сообщение отредактировал(а) Bitter - 30.5.2009, 22:57 |
|||
|
||||
| Rickert |
|
|||
|
Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 6 Всего: 52 |
Bitter, вы учитываете такты ЦП. Но ведь для получения кадра используется ещё процессор звуковой карты и видео. Нужно искать разницу между кадрами - тогда будет нужный эффект. Ищем её в секундах, используем физическую формулу для расчёта, и умножаем на полученную разницу - она играет роль шага во времени (dt).
-------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 2 Всего: 386 |
Rickert, Хм... А зачем считать какие-то такты ЦП? Картинка должна изменяться не менее чем 20 раз в секунду. Вот они "такты" и есть! Ставить delay/slip/timeout по вкусу, пусть процессор сам считает свои такты...
-------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Rickert |
|
|||
|
Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 6 Всего: 52 |
Вот и я спрашиваю: зачем Bitter их считает?
Почему именно 20? Почему не 33? Не 1567? Это сообщение отредактировал(а) Rickert - 31.5.2009, 15:46 -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 2 Всего: 386 |
Rickert, В кино, к примеру, частота кадров - 24 кадра в секунду. Вполне реалистичная картинка получается. Зачем пересчитывать чаще и тратить такты процессора, которые можно потратить на что-то нужное...
-------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Rickert |
|
|||
|
Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 6 Всего: 52 |
ksnk, т.е. то ваши личные убеждения? Ну давайте, попробуйте поиграть в кваку с fps = 20 кадров.
-------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
| Mazzi |
|
|||
|
Правильный ![]() ![]() Профиль Группа: Комодератор Сообщений: 825 Регистрация: 3.4.2003 Репутация: 4 Всего: 21 |
топикстартер написал "я не могу (понять, сделать) цикл, по которому, мяч должен падать и отпрыгивать" вот это и иллюстрирует. Читайте внимательней пожалуйста. -------------------- Мне нужны помощники. |
|||
|
||||
| Rickert |
|
|||
|
Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 6 Всего: 52 |
Mazzi, ключевая фраза
-------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
| Bitter |
|
||||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 5 Всего: 27 |
Rickert, вот вы спорите о том, сколько должно быть кадров в секунду, а мой алгоритм не зависит от этого. Мяч будет одинаково выглядеть хоть при частоте 100 fps хоть при частоте 10 fps. Именно для этого я считаю количество тактов пройденных с момента последнего рендера, после чего на основе этой цифры изменяется ускорение. В этом случае не нужно даже думать сколько кадров выбирать. Это называется не зависеть от системы. А звуковая и графическая карта тут вообще не причем, так как в расчетах скорости участия не принимают и работают паралельно.
Добавлено через 2 минуты и 40 секунд Блин, а я что делаю? вот этот кусок кода не о чем не говорит?
Добавлено через 4 минуты и 54 секунды
Вот именно - незачем, по этому и считается количество потраченных процессором тактов на другие расчеты, для того, чтобы сохранять неприрывность движения графики |
||||
|
|||||
| Rickert |
|
|||
|
Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 6 Всего: 52 |
Bitter, ну считайте - считайте, пока на грабли не наступите - не поймёте.
-------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
| Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 5 Всего: 27 |
Rickert, ну объяснили бы сразу в чем грабли-то, а то получается как "я такой классный знаю, а вот вам не скажу бугага"
|
|||
|
||||
| Dobermann |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 992 Регистрация: 7.1.2008 Репутация: нет Всего: 0 |
Я по моему тут все по физике... сила трения, притяжения, вектор падения и т.п. и формулы оттуда же брать надо...
|
|||
|
||||
| cardinal |
|
||||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: нет Всего: 99 |
Bitter, помоему не так
а так
должно быть... -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
||||
|
|||||
| Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 5 Всего: 27 |
cardinal, ну я просто до этого написал:
то есть дельту уже учел. |
|||
|
||||
| cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: нет Всего: 99 |
Bitter, в случае, что g = const
integral a dt = v integral v dt = s соответственно перемножать нужно два раза... -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
| Rickert |
|
|||
|
Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 6 Всего: 52 |
Вы разработками в области параллельных вычислений занимались? Вот у вас есть два потока, которые считают два значения и складывают их в область памяти. Каждый работает независимо от другого разное количество секунд. И есть третий поток, который должен сложить результаты работы первых двух. Вопрос: как организовать работу? Как узнать что первые два потока завершили свои вычисления и в обусловленных областях памяти лежат конечные значения? Когда вы считаете такты ЦП - вы следите за выполнением только одного потока, забывая, что есть ещё поток GPU и остальные вычисления, которые в конечном итоге, дают результирующую картинку. Т.е. чтобы верно отсчитывать время вы должны отталкиваться от реально отображённых кадров, а не от тактов ЦП. Конечно, возможно что при небольшой нагрузке вы можете учитывать только такты ЦП и иметь на руках достоверную картинку. Но стоит вашему проекту вырасти до шейдеров и большого количества объёма данных - как начнутся непонятные артефакты в просчёте физики, на отлов которых у вас, скорее всего, уйдёт очень много времени. -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
| arilou |
|
|||
![]() Великий МунаБудвин ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2646 Регистрация: 15.7.2004 Где: город-герой Минск Репутация: 6 Всего: 61 |
Rickert, кстати, а где тут проблема? Bitter считает дельту с последнего рассчета и учитывает ее. Всё равно у тебя один поток для всего получается, а там где драйвер скидывает command buffer в видео карту, основной поток будет ждать. Т.е. нет смысла заморачиваться на параллелизм в данном случае. Это как из пушки по воробьям.
|
|||
|
||||
| sSilence |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 27.5.2009 Репутация: нет Всего: нет |
зачем мне считать такты, кадры! у меня тут идет просто вычиления значения по оси "y"!
программа готова в ней отображается щарик(мячик), только осталось в бить что делать с координатой и все. и на данный момент как я писал в пред посте, он просто опускается с ускорением |
|||
|
||||
| Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 5 Всего: 27 |
sSilence, либо Вы задете вопрос не относящийся к теме данного раздела, либо Вы не поняли, что Вам отвечают.
Если Вам надо объяснить как работают циклы в С++, то Вам явно не сюда, но если вам нужна физика перемещения падающего упругого объекта, то внимательно еще раз прочитайте ответы, в них всё уже указано. именно это вам и объяснили ускорение существует только в реальном физическом мире. В рамках же программы, оно описывается некоторым уравнением, вычисление которого жестко привязано к характеристикам компьютера. Так вот, чтобы абстрагироваться от конкретной модели процессора, и производят подсчет времени, прошедшего с момента последнего вычисления. |
|||
|
||||
| cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: нет Всего: 99 |
-------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
| Rickert |
|
|||
|
Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 6 Всего: 52 |
arilou, с пушки попадёшь с большей вероятностью, а точность в физ. расчётах - наше фсё.
-------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
| galileopro |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 7.6.2009 Где: Харьков Репутация: нет Всего: нет |
Ну если 20 мало, то думаю 30 будет вполне достаточно. А больше для падающего шарика не нужно, скорее всего...
|
|||
|
||||
| Somewho |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 8.7.2010 Репутация: нет Всего: нет |
Эммм... падающий мяч легко сделать даже в Паскале. Насколько я понимаю, всё проблема в просчёте формулы движения. Начальная высота - h. Ускорение всегда направлено вниз и по модулю равно g. Начальная скорость 0 (не так ли). Если не учитывать потерю енергии мяча при отскоке, то мяч будет вечно подпрыгивать до постоянной высоты, но не выше.
Система координат одномерная (движение только вверх-вниз). Точка отсчёта - Земля, т.е. точка с у=0. Мяч имеет кординату h (стрелка оси вверх). Формула координаты мяча от времени: y=h-g*(t^2)/2 при падении и y=V*t-g*(t^2)/2. V рассчитывается в самом начале по формуле равенства энергий m*(V^2)/2=m*g*h; V=(2*g*h)^0.5. Как это на том же Паскале: просто выбираем значения констант (h и g), а также значение "хода", то есть задержки между кадрами dt. А дальше - программная часть. Через каждое прибавление dt к t пересчитывать координату (ну и выводить изображение, конечно). Каждый раз еще просчитывать координату мяча при следующем "ходе" с целью предотвращения падения его под землю. Если y<0 - просто-напросто достаточно под t подставлять значение t про y=0, которое было в первый раз, то есть t=(2*h/g)^0.5. Как-то так |
|||
|
||||
![]()
|
| Правила форума "Программирование игр, графики и искуственного интеллекта" | |
|
|
НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |