Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
27 / 27 / 18
Регистрация: 13.09.2014
Сообщений: 137
1

Сохранение предыдущих вращений объекта

01.12.2015, 13:40. Показов 503. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пишу 3D бильярд на OpenGL. Не получается сделать правильное вращение шаров. Допустим, шар ударяется об борт стола, меняет направление и теперь должен вращаться с учетом его вращения до удара об борт.
Как высчитывать новые вращения в зависимости от старых при столкновении шаров, шара и борта?
Вот код (шар движется по оси X и оси Z):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//Отрисовка шара
void Draw()
{
    glPushMatrix();
        //перемещаем шар туда, где будем его рисовать
        glTranslated(x, y, z);
        switch (move_direction) {
            case MOVE_DIRECTION::RIGHT_UP://шар движется вправо вверх
            {
                //под углом alpha шар движется по отношению к оси Z
                //повернем по оси Y на alpha градусов
                glRotated(-alpha, 0.0, 1.0, 0.0);
                //вращаем шар вперед (т.к. шар движется вперед) по оси X на rotation angle градусов
                glRotated(rotation_angle, 1.0, 0.0, 0.0);
                //повернем обратно по оси Y
                glRotated(alpha, 0.0, 1.0, 0.0);
                //таким образом получаем правильноое вращение шара,
                //если он еще не сталкивался с бортом или другим шаром
                break;
            }
            //обработка других направлений
        }
        glMateriali(GL_FRONT, GL_SHININESS, 128);
        glNormal3d(0.0, 1.0, 0.0);
        glBindTexture(GL_TEXTURE_2D, texture_id);//Select our texture
        gluSphere(sphere.obj, RADIUS, slices, slices);
    glPopMatrix();
}
 
GLint DrawGlScene(const Room& room, const Plant& plant, const Table& table, const std::array<Pocket, POCKETS_COUNT>& pockets,
    std::array<Ball, BALLS_COUNT>& balls, const Cue& cue, const AimLine& aim_line)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
 
    gluLookAt(gCamera.position.x, gCamera.position.y, gCamera.position.z,
        gCamera.view.x, gCamera.view.y, gCamera.view.z,
        gCamera.up_vector.x, gCamera.up_vector.y, gCamera.up_vector.z);
 
    glPushMatrix();
    //Рисуем стол
    glPopMatrix();
 
    glPushMatrix();
    //Рисуем еще что-то
    glPopMatrix();
 
    //Рисуем шары
    glEnable(GL_TEXTURE_2D);
    for (std::size_t i = 0; i < BALLS_COUNT; ++i)
        if (!balls[i].IsDropOut()) balls[i].Draw();
    glDisable(GL_TEXTURE_2D);
    //...
}
Думаю, что надо как-то матрицу поворота перед каждой коллизией сохранять или сразу после отрисовки каждого шара, а потом домножать на нее текущую матрицу при каждой отрисовке шара...
Надеюсь, понятно объяснил.
С вас это, а я бильярд выложу на github)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.12.2015, 13:40
Ответы с готовыми решениями:

Сохранение N предыдущих копий архивов
Помогите пожалуйста, реализовать в batch файле возможность сохранения N предыдущих копий архивов....

Сохранение предыдущих данных при динамическом добавлении поля ввода
Я РНР-шник, с Javascript и jQuery не подружился все еще Вообщем, есть код: &lt;!DOCTYPE html PUBLIC...

Элементы с четными индексами заменить максимумом предыдущих элементов, остальные - минимумом предыдущих.
Дана линейная таблица А, N &lt;=50. Каждый элемент A с четным индексом заменить значением max(A,...

Сохранение состояния объекта в БД
Здравствуйте. Потихоньку стараюсь изучать PHP и попутно решил писать проектик чисто для себя,чтобы...

4
64 / 17 / 3
Регистрация: 09.11.2013
Сообщений: 120
01.12.2015, 14:51 2
Я через эти вычисления проходил в этой программе,если честно для вычисления пропорционального отражения удара надо ломать мозг недели две,методом проб и многоразовых тестов искать формулу вживую

Там должна быть длиннющая формула с делениями и минусовкой иксов и игреков,типа (x1-x2)-(y2+y1)/2 ...

Тебе придется самому эту формулу искать.Это чистая алгебра и геометрия.

Добавлено через 56 минут
образец формулы на visual basic.net:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
            G.DrawLine(MyPen, CInt(x1 - ((x2 - x1) / 2.2) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 2.2) + ((y3 - y1) / tol)), CInt(x1 - ((x2 - x1) / 3.5) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 3.5) + ((y3 - y1) / tol)))
            G.DrawLine(MyPen, CInt(x1 - ((x2 - x1) / 2.2) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 2.2) + ((y3 - y1) / tol)) - vis, CInt(x1 - ((x2 - x1) / 3.5) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 3.5) - vis + ((y3 - y1) / tol)))
            G.DrawLine(MyPen, CInt(x1 - ((x2 - x1) / 3.5) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 3.5) + ((y3 - y1) / tol)), CInt(x1 - ((x2 - x1) / 5.5) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 5.5) - vis / 3 + ((y3 - y1) / tol)))
            G.DrawLine(MyPen, CInt(x1 - ((x2 - x1) / 3.5) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 3.5) + ((y3 - y1) / tol)) - vis, CInt(x1 - ((x2 - x1) / 5.5) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 5.5) - vis / 1.5 + ((y3 - y1) / tol)))
 
            G.DrawLine(MyPen, CInt(x1 - ((x2 - x1) / 5.5) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 5.5) - vis / 3 + ((y3 - y1) / tol)), CInt(x1 - ((x2 - x1) / 5.5) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 5.5) - vis / 1.5 + ((y3 - y1) / tol)))
 
            G.DrawLine(MyPen, CInt(x1 - ((x2 - x1) / 2.2) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 2.2) + ((y3 - y1) / tol)), CInt(x1 - ((x2 - x1) / 2.2) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 2.2) - vis / 4 + ((y3 - y1) / tol)))
            G.DrawLine(MyPen, CInt(x1 - ((x2 - x1) / 2.2) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 2.2) + ((y3 - y1) / tol)) - vis, CInt(x1 - ((x2 - x1) / 2.2) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 2.2) - vis / 1.3 + ((y3 - y1) / tol)))
            G.DrawLine(MyPen, CInt(x1 - ((x2 - x1) / 2.2) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 2.2) - vis / 4 + ((y3 - y1) / tol)), CInt(x1 - ((x2 - x1) / 2.9) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 2.9) - vis / 4 + ((y3 - y1) / tol)))
            G.DrawLine(MyPen, CInt(x1 - ((x2 - x1) / 2.2) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 2.2) - vis / 1.3 + ((y3 - y1) / tol)), CInt(x1 - ((x2 - x1) / 2.9) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 2.9) - vis / 1.3 + ((y3 - y1) / tol)))
 
            G.DrawLine(MyPen, CInt(x1 - ((x2 - x1) / 2.9) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 2.9) - vis / 4 + ((y3 - y1) / tol)), CInt(x1 - ((x2 - x1) / 3.3) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 3.3) - vis / 2.5 + ((y3 - y1) / tol)))
            G.DrawLine(MyPen, CInt(x1 - ((x2 - x1) / 2.9) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 2.9) - vis / 1.3 + ((y3 - y1) / tol)), CInt(x1 - ((x2 - x1) / 3.3) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 3.3) - vis / 1.6 + ((y3 - y1) / tol)))
 
            G.DrawLine(MyPen, CInt(x1 - ((x2 - x1) / 3.3) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 3.3) - vis / 2.5 + ((y3 - y1) / tol)), CInt(x1 - ((x2 - x1) / 2.6) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 2.6) - vis / 2.5 + ((y3 - y1) / tol)))
            G.DrawLine(MyPen, CInt(x1 - ((x2 - x1) / 3.3) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 3.3) - vis / 1.6 + ((y3 - y1) / tol)), CInt(x1 - ((x2 - x1) / 2.6) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 2.6) - vis / 1.6 + ((y3 - y1) / tol)))
            G.DrawLine(MyPen, CInt(x1 - ((x2 - x1) / 2.6) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 2.6) - vis / 2.5 + ((y3 - y1) / tol)), CInt(x1 - ((x2 - x1) / 2.6) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 2.6) - vis / 1.6 + ((y3 - y1) / tol)))
            REM...
 
 
            G.DrawLine(MyPen, CInt(x1 - ((x2 - x1) / 2.2)), CInt(y1 - ((y2 - y1) / 2.2)), CInt(x1 - ((x2 - x1) / 2.2) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 2.2) + ((y3 - y1) / tol)))
            G.DrawLine(MyPen, CInt(x1 - ((x2 - x1) / 2.2) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 2.2) + ((y3 - y1) / tol)) - vis, CInt(x1 - ((x2 - x1) / 2.2)), CInt(y1 - ((y2 - y1) / 2.2)) - vis)
            G.DrawLine(MyPen, CInt(x1 - ((x2 - x1) / 5.5)), CInt(y1 - ((y2 - y1) / 5.5) - vis / 3), CInt(x1 - ((x2 - x1) / 5.5) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 5.5) - vis / 3 + ((y3 - y1) / tol)))
 
            G.DrawLine(MyPen, CInt(x1 - ((x2 - x1) / 3.5) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 3.5) + ((y3 - y1) / tol)), CInt(x1 - ((x2 - x1) / 3.5)), CInt(y1 - ((y2 - y1) / 3.5)))
            G.DrawLine(MyPen, CInt(x1 - ((x2 - x1) / 3.5) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 3.5) + ((y3 - y1) / tol)) - vis, CInt(x1 - ((x2 - x1) / 3.5)), CInt(y1 - ((y2 - y1) / 3.5)) - vis)
 
            G.DrawLine(MyPen, CInt(x1 - ((x2 - x1) / 5.5) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 5.5) - vis / 1.5 + ((y3 - y1) / tol)), CInt(x1 - ((x2 - x1) / 5.5)), CInt(y1 - ((y2 - y1) / 5.5) - vis / 1.5))
 
            G.DrawLine(MyPen, CInt(x1 - ((x2 - x1) / 2.2)), CInt(y1 - ((y2 - y1) / 2.2) - vis / 4), CInt(x1 - ((x2 - x1) / 2.2) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 2.2) - vis / 4 + ((y3 - y1) / tol)))
            G.DrawLine(MyPen, CInt(x1 - ((x2 - x1) / 2.2)), CInt(y1 - ((y2 - y1) / 2.2) - vis / 1.3), CInt(x1 - ((x2 - x1) / 2.2) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 2.2) - vis / 1.3 + ((y3 - y1) / tol)))
            G.DrawLine(MyPen, CInt(x1 - ((x2 - x1) / 2.9)), CInt(y1 - ((y2 - y1) / 2.9) - vis / 4), CInt(x1 - ((x2 - x1) / 2.9) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 2.9) - vis / 4 + ((y3 - y1) / tol)))
 
            G.DrawLine(MyPen, CInt(x1 - ((x2 - x1) / 3.3)), CInt(y1 - ((y2 - y1) / 3.3) - vis / 1.6), CInt(x1 - ((x2 - x1) / 3.3) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 3.3) - vis / 1.6 + ((y3 - y1) / tol)))
 
            G.DrawLine(MyPen, CInt(x1 - ((x2 - x1) / 2.6)), CInt(y1 - ((y2 - y1) / 2.6) - vis / 2.5), CInt(x1 - ((x2 - x1) / 2.6) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 2.6) - vis / 2.5 + ((y3 - y1) / tol)))
            G.DrawLine(MyPen, CInt(x1 - ((x2 - x1) / 2.6)), CInt(y1 - ((y2 - y1) / 2.6) - vis / 1.6), CInt(x1 - ((x2 - x1) / 2.6) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 2.6) - vis / 1.6 + ((y3 - y1) / tol)))
            G.DrawLine(MyPen, CInt(x1 - ((x2 - x1) / 2.6)), CInt(y1 - ((y2 - y1) / 2.6) - vis / 1.6), CInt(x1 - ((x2 - x1) / 2.6) + ((x3 - x1) / tol)), CInt(y1 - ((y2 - y1) / 2.6) - vis / 1.6 + ((y3 - y1) / tol)))
            REM...
1
snake32
01.12.2015, 15:32
  #3

Не по теме:

Цитата Сообщение от Intronessia Посмотреть сообщение
образец формулы на visual basic.net:
Там точно ошибки нет? :)

0
1823 / 731 / 99
Регистрация: 01.10.2012
Сообщений: 3,739
01.12.2015, 19:04 4
Цитата Сообщение от Intronessia Посмотреть сообщение
Тебе придется самому эту формулу искать.Это чистая алгебра и геометрия.
Да, но это луч света в темном царстве OpenGL :-) Году так в 2000 я пытался написать свой движок физики (ну был тогда моложе ). Конечно ничем реальным это не кончилось, но, как говорится, "приобрел жизненный опыт". Что (смутно) помню:

- шар = rigid body, имеющий COM (центр масс, для щара просто центр), движение которого полностью описывается 2 вещами:

- линейная скорость приложенная к центру масс
- момент силы приложенный к тому же центру масс

Момент силы записывается как угловая скорость, в виде вектора длина которого = углу вращения в радианах, а направление = ось вращения. Т.е. имея скорость и момент - имеете матрицу. При столкновении нужно посчитать новый вектор скрости (просто отражение) и новый момент (это уже не помню). Остальное - копайте
1
27 / 27 / 18
Регистрация: 13.09.2014
Сообщений: 137
02.12.2015, 06:10  [ТС] 5
Спасибо за ответы. Значит сделаю шары одноцветными)
0
02.12.2015, 06:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.12.2015, 06:10
Помогаю со студенческими работами здесь

Редактирование и сохранение объекта
Уважаемые форумчане, помогите написать код к задаче. При обращении к Url &quot;xxx/Edit/n&quot; выводится...

Сохранение свойств объекта
Здравствуйте!Пытаюсь сделать типа такого калькулятора http://wcalc.sinc.ru/ метод load_design...

Сохранение объекта в XML
У меня есть объекта класса Clazz, как я могу без велосипедов и лишних телодвижений сериализировать...

Сохранение объекта JSON
всем доброго времени суток. на работе поставили задачу , реализовать выгрузку данных в файл...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru