Модераторы: Rickert
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> простая , но не совсем физика в 3Д, помогите с начальными знаниями ... 
:(
    Опции темы
Dubinsky
Дата 17.1.2006, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 1.6.2005

Репутация: нет
Всего: нет



Уважаемые знатоки , писал когда-то маленькие игрухи в 3Д окружении но с 2Д физикой (камера в одной плоскости и все действия происходили тоже только в строго одной плоскости , однако модельки были 3Д ну и всё такое)
так вот в таком случае с физикой было просто : есть точка положения объекта , вектор скорости , и единственный угол поворота + момент + момент инерции.Но вот стоило мне перейти в 3Д мир , как всё просто стало вконец непонятным ...

есть тело в космосе , у него есть положение (x,y,z) и есть некий вектор его скорости (x,y,z) тут всё ясно как вычислить новое положение тела в пространстве , но как быть с поворотом тела ? есть моменты по осям (Pitch , Yaw , Roll) а как теперь вычислить результирующее положение тела ? и как это самое положение (поворот) лучше всего представить ? вообще не пойму даже с чего начать ...
PM MAIL WWW   Вверх
DENNN
Дата 17.1.2006, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 3
Всего: 43



Положение объекты удобней всего описывать матрицей преобразование. Матрица афинных преобразований способна учитывать параллельный перенос, поворот и масштабирование (+ неортогональность осей координат, но к задаче это неотносится). Таким образом на вопрос
Цитата(Dubinsky @ 17.1.2006, 12:14 Найти цитируемый пост)

и как это самое положение (поворот) лучше всего представить ?

можно порекомендовать использовать матрицу поворота.
Если угловая скорость постоянна то ИМХО, результирующий угол будет равен исходный + угловая скорость * время.
PM ICQ   Вверх
Dubinsky
Дата 17.1.2006, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 1.6.2005

Репутация: нет
Всего: нет



матрица поворота ...слыхал ... я вот как подумал надо мне сделать :
на тело действуют силы по 3 осям (1 вектор) две силы просто складываются , результирующее перемещение = сила*время\инерция
на тело действуют моменты по 3 осям переводим момент по каждой оси в кватернион (получаем 3 кватерниона), умножаем 3 кватерниона и получаем рузультирующий кватернион который перемножаем с текущим кватернионом ориентации и получаем новый кватернион ориентации , из чего следует что хранить наверное удобно положение поворота тела в кватернионе ?

как то же самое что я только что описал сделать матрицами ?
момент вращения тела хранить как матрицу ? перемножить потом её на текущую матрицу положения тела и получить новое положение ?

Это сообщение отредактировал(а) Dubinsky - 17.1.2006, 18:39
PM MAIL WWW   Вверх
Dubinsky
Дата 17.1.2006, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 1.6.2005

Репутация: нет
Всего: нет



т.е. как имея силы по трём осям и моменты по этим осям получить искомое новое положение и поворот ?
PM MAIL WWW   Вверх
mr.DUDA
Дата 17.1.2006, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 7
Всего: 232



Цитата(Dubinsky @ 17.1.2006, 17:34 Найти цитируемый пост)
из чего следует что хранить наверное удобно положение поворота тела в кватернионе ?

Если тебе удобнее работать с кватернионами - работай с ними и забудь о матрицах smile

З.Ы. получить матрицу ориентации, зная yaw, roll и pitch, можно так:
Код
        public void FromEulerAnglesXYZ(float yaw, float pitch, float roll) {
            float cos = MathUtil.Cos(yaw);
            float sin = MathUtil.Sin(yaw);
            Matrix3 xMat = new Matrix3(1, 0, 0, 0, cos, -sin, 0, sin, cos);

            cos = MathUtil.Cos(pitch);
            sin = MathUtil.Sin(pitch);
            Matrix3 yMat = new Matrix3(cos, 0, sin, 0, 1, 0, -sin, 0, cos);

            cos = MathUtil.Cos(roll);
            sin = MathUtil.Sin(roll);
            Matrix3 zMat = new Matrix3(cos, -sin, 0, sin, cos, 0, 0, 0, 1);

            this = xMat * (yMat * zMat);
        }

// конструктор класса Matrix3 принимает последовательно:
// m00   m01  m02
// m10   m11  m12
// m20   m21  m22

(код на C#)


--------------------
user posted image
PM MAIL WWW   Вверх
Dubinsky
Дата 18.1.2006, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 1.6.2005

Репутация: нет
Всего: нет



хмм , окей , потом эту матрицу умножаю на текущую матрицу положения тела ? ну да ...

+ я тут еще вот что подумал , если у меня есть сила , действующая на тело в точке , отличной от центра тяжести (стало быть сила не только двигает но и закручивает тело) то я могу найти три момента исходя из точки приложения силы и направления действия, потом просуммировать тройки моментов разных сил , действующих на это тело , потом просчитаю по этим моментам и моментам инерции новые углы по осям , переведу в матрицу поворота перемножу на матрицу положения тела и получу новое положение тела , вот стоит ли раскладывать силу на три момента чтобы потом эти моменты переводить в матрицу ?

т.е. если есть сила вектор которой V(x,y,z) сила расположена относительно центра тяжести тела в точке F(x,y,z) и есть моменты инерции , есть какие то методы вычисления кроме того , который я только что попытался подытожить ?

короче как оптимизировать вычисление результирующих моментов ? мне кажется тот способ что я понял довольно медленный будет ...
PM MAIL WWW   Вверх
mr.DUDA
Дата 18.1.2006, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 7
Всего: 232



Цитата(Dubinsky @ 18.1.2006, 11:18 Найти цитируемый пост)
т.е. если есть сила вектор которой V(x,y,z) сила расположена относительно центра тяжести тела в точке F(x,y,z) и есть моменты инерции , есть какие то методы вычисления кроме того , который я только что попытался подытожить ?

это надо у физиков спросить smile


--------------------
user posted image
PM MAIL WWW   Вверх
maxim1000
Дата 19.1.2006, 03:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 2
Всего: 110



попробую вспомнить, чему нас учили на парах по физике в институте...

1. момент силы относительно какой-то точки - векторное произведение силы на плечо (вектор из точки, относительно которой считается, до точки приложения силы)
2. угловая скорость (вращения) - векторное произведение скорости точки на плечо (по-моему, тут оно плечом не называется, но означает то же самое) и деленная на квадрат длины плеча
3. угловое ускорение - производнаыя угловой скорости
4. момент инерции - интеграл по всему телу от r^2*dm (r - расстояние от текущей точки до точки, относительно которойвсе считается)

(не исключаю, что ошибся в определениях, но надеюсь, только в мелочах)

так что схема такая:
1. считаем сумму моментов каждой силы
2. делим его на момент инерции - получаем угловое ускорение
3. согласно нему корректируем угловую скорость
4. согласно угловой скорости поворачиваем тело
ось вращения - направление вектора угловой скорости
угол поворота - величина угловой скорости*dt


--------------------
qqq
PM WWW   Вверх
Dubinsky
Дата 19.1.2006, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 1.6.2005

Репутация: нет
Всего: нет



Во ! ближе к делу !

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

вот только если мы получаем сразу момент вращения а не три его компоненты , как тогда высчитать момент инерции относительно любой оси ?

я себе раньше представлял это так (грубо):
Omega_x = M_Res_x/MInertia_x
Omega_y = M_Res_y/MInertia_y

и всё сводится к поиску искомых моментов по трём осям ...что по сути не есть гуд , наверное ...


вот допусти по оси Х момент инерции равен 100 условных единиц , а по оси У 200 , вот на что делить момент вращения (который направлен не строго по осям а стоит произвольно да еще и меняет своё направление постоянно ) если момент инерции известен только по осям Х У и Зэд ? Моменты инерции как то надо задавать векторно чтоли ? и потом как то хитро умножать их на результирующий момент ?

(слава богу начинает всё таки что-то прояснятся)

однако с угловой скоростью можно еще раз что то не понял что за плечо там такое фигурирует ...

Это сообщение отредактировал(а) Dubinsky - 19.1.2006, 20:40
PM MAIL WWW   Вверх
maxim1000
Дата 19.1.2006, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 2
Всего: 110



Цитата

однако с угловой скоростью можно еще раз что то не понял что за плечо там такое фигурирует ...

там, наверное, вектор не из точки, относительно которой считается, а перпендикуляр на ось вращения
в общем, определение угловой скорости - как обычно - линейная скорость/радиус окружности, по которой двигается точка
определение через векторное произведение - для того, чтобы удобнее формализовать ее векторное представление

Цитата

вот только если мы получаем сразу момент вращения а не три его компоненты , как тогда высчитать момент инерции относительно любой оси ?

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


--------------------
qqq
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.

  • Литературу, связанную с программированием графики, обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы связанные с программированием графики и мультимедии на языках С++ и Delphi
  • Вопросы по реализации алгоритмов рассматриваются здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема »


 




[ Время генерации скрипта: 0.0636 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.