Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2] 3  Все   Вниз
  Печать  
Автор Тема: Вращение куба в DirectX 9.  (Прочитано 83955 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #30 : 08-02-2009 16:46 » 

во первых, тут все на "ты" )
во вторых - это всё лишь теория, так как до практики у меня руки так и не дошли ещё (всё мечтаю...), проверить всё на првктике - твоя задача Улыбаюсь
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #31 : 09-02-2009 19:35 » 

Тема неожиданно начила своё продолжение.

Я решил проверить а действительно ли после совмещения координат центра куба и координат центра мира координаты куба не миняются, оказались что меняются. Куб встоёт ровно по центру.

Я проверял так:
1. Закомментировал всё что относится к повороту.
2. Запустил программу и сравнил рассояния с права от куба и слева от куба они одинаковые.

Так что координаты куба надо возвращать обратно, но как это сделать.

« Последнее редактирование: 11-02-2009 08:03 от Алексей1153++ » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #32 : 09-02-2009 20:14 » 

zuze, непонятно, как ты это проверил, что координаты меняются
Записан

Антон__
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #33 : 09-02-2009 20:16 » 

Код:
если ты не пересчитываешь сам координаты объекта, то он никогда не меняется, он всегда постоянен.
Немного поправлю. После установки мировой матрицы, все следующие объекты рисуются с использованием этой матрицы.

Код:
Если не ошибаюсь, то: имеются координаты мира - объект изначально описан в этой системе координат. Функция SetTransform позволяет изменить систему координат мира (при этом не затрагивается сам объект). Относительно этой же системы координат задаётся просмотр (== камера)
У объекта есть СВОИ координаты, у мира директ икса свои. Если матрица мира единичная, эти координаты совпадают.
После того, как ты написал pDevice->SetTransfor(WORLD, &world);
Координаты всех точек умножаются на эту матрицу, и рисуются в мире директа.

Приведу пример. Ты нарисовал сферу в 3д максе, с центром (0,0,0) и радиусом 1 и загрузил сетку в программу.
Применяя матрицу
s 0 0 0
0 s 0 0
0 0 s 0
x y z 1
Шар сдвигается на (х,у,z) и растягивается в s раз.

Потом всё это проецирутся на экран, в зависимости от настроек камеры.
Еще: Всегда устанавливай матрицу мира, перед тем как нарисовать объект, т.к. неизвестно, какая матрица мира сейчас установлена.
Записан
Антон__
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #34 : 09-02-2009 20:19 » 

Надеюсь прояснил немного:)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #35 : 09-02-2009 20:20 » 

это всё понятно, я это и имею в виду - сам объект то не меняется, а матрицы накладываются картой перед выводом на экран
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #36 : 09-02-2009 20:28 » 

Я понял что сам объект (куб) не меняется, если у объекта (куба) координаты центра не 0,0,0 то я так думал расстояние с лева и справа от него должны быть разные, а они одинаковые.
Записан
Антон__
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #37 : 09-02-2009 20:34 » 

Код:
Я решил проверить а действительно ли после совмещения 
координат центра куба и координат центра мира координаты куба
не миняются, оказались что меняются. Куб встоёт ровно по центру.
Бред какой-то. А ты что хотел?

Код:
Я понял что сам объект (куб) не меняется, если у объекта (куба) координаты центра не 0,0,0 то я так думал расстояние с лева и справа от него должны быть разные, а они одинаковые.
Может стоит с камерой повозится?

zuze, а чего ты хочешь добиться, меняя координаты?
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #38 : 09-02-2009 20:40 » 

Вот я задаю объект (куб) вершинами я так как его центр объекта (куба) x = 5.0f, y = 0.6f, z = 4.1f, то он должен выводится на экран правее центра и вертеться, а получается так мы передвигаем объект (куб) в центр экрана и заставляем его вертеться.
Записан
Антон__
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #39 : 09-02-2009 21:20 » 

А ты хочешь заставить его вертеться вокруг центра координат?
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #40 : 09-02-2009 21:39 » 

Нет, вокруг своего центра.

Но у нас получается так:
1. Переносим объект (куб) в центр экрана (это мы делаем только из-за того чтобы куб вращался вокруг своего центра)
2. Задаём вращение
3. Выводим на экран

А должно быть так:
1. Переносим объект (куб) в центр экрана (это мы делаем только из-за того чтобы куб вращался вокруг своего центра)
2. Задаём вращение
3. Переносим обратно
4. Выводим на экран

Вот как сделать 3-ий шаг?
Записан
Антон__
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #41 : 09-02-2009 21:52 » 

Ты путаешь пространство мира и пространство объекта.
Центр объекта - всегда(0,0,0). А объект вращается вокруг осей Ox, Oy, Oz, опять же, своего пространства.

Если хочешь, могу скинуть свой проект, там настроена камера, может будет проще.
Но нужна 2008-я студия.
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #42 : 09-02-2009 22:01 » 

А тогда так объясню
С помощью функции SetTransfor переносим объект допустим в вехней части экрана в право, т.е. он находится вверхней части экрана с права.
То по коду который я сделал выходит следующие, что объект (куб) перемещается в центр экрана и начинает вертеться во круг центра мира, а надо чтобы объект (куб) вертелся во круг своего центра находясь в правом верхнем углу экрана.

Это я для примера взял что объект (куб) находится в правом верхнем углу экрана, он может быть где угодно.
« Последнее редактирование: 09-02-2009 22:42 от zuze » Записан
Антон__
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #43 : 09-02-2009 22:20 » 

Цитата
начинает вертеться во круг своего центра, а надо чтобы объект (куб) вертелся во круг своего центра
Объяснил.Улыбаюсь

Может ты сначала устанавливаешь матрицу, которая вращает, а потом ту, которая перещает?
Выложи код, который сейчас есть.
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #44 : 09-02-2009 22:53 » 

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

Вот код

Код:
// Глобальная переменная
DWORD OneTick = 0;
// Установка матриц преобоазования
void Matrix(void)
{
    // Мировая матрица
    D3DXMATRIX MatrixWorld;
    // Матрица перемещения
    D3DXMATRIX MatrixTranslation;
    // Матрица вращения
    D3DXMATRIX MatrixRotation;
    // Матрица вида
    D3DXMATRIX MatrixView;
    //матрица проекции
    D3DXMATRIX MatrixProjection;
    float fAngle;
    float BeginAngle;
    float rps;
    UINT iTime;
   
    D3DXMatrixIdentity(&MatrixWorld);
   
    BeginAngle = D3DX_PI/4.0f;
    rps = 0.05f;
    iTime = GetTickCount();

    if(!OneTick)
      OneTick = iTime;
    fAngle = BeginAngle + (iTime -  OneTick) * (D3DX_PI * 2.0f * rps / 1000.0f);

    // Поворот
    D3DXMatrixRotationY(&MatrixRotation, fAngle);
    // Перемещаем мировую матрицу
    D3DXMatrixTranslation(&MatrixTranslation, -5.0f, -0.6f, -4.1f);
   
    D3DXMatrixMultiply(&MatrixWorld, &MatrixTranslation, &MatrixRotation);
    // Устанавливаем мировую матрицу
    pDirect3DDevice->SetTransform(D3DTS_WORLD, &MatrixWorld);

    // Изменяем видовую матрицу
    D3DXMatrixLookAtLH(&MatrixView,      // полученная в итоге видовая матрица
        &D3DXVECTOR3(0.0f, 0.0f, 80.0f), // точка, из которой смотрим
        &D3DXVECTOR3(0.0f, 0.0f, 0.0f),  // куда смотрим
        &D3DXVECTOR3(0.0f, 1.0f, 0.0f)); // направление верха
    // Устанавливаем видовую матрицу
    pDirect3DDevice->SetTransform(D3DTS_VIEW, &MatrixView);
    // Изменяем матрицу проекции
    D3DXMatrixPerspectiveFovLH(&MatrixProjection, // полученная итоговая матрица проекции
        D3DX_PI/4,                                // поле зрения в направлении оси Y в радианах
        1.54f,                                    // соотношения сторон экрана 770/500=1.54
        10.0f,                                    // передний план отсечения сцены
        200.0f);                                  // задний план отсечения сцены
    // Устанавливаем матрицу проекции
    pDirect3DDevice->SetTransform(D3DTS_PROJECTION, &MatrixProjection);
}

Это будет заментно на примере таком
1. Перенести куб в верхний правый угол (к примеру)
2. Через какое-то время (например 10 секунд) заставить объект (куб) вертется во круг своего центра

И мы увидим что объект (куб) переместился в центр экрана, так как мы совмещаем координаты центра куба и координаты центра мира, а без совмещения нельзя заставить объект вертется во круг своего центра, какой-то замкнутый круг получается.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #45 : 10-02-2009 04:26 » 

zuze, а для чего тебе есть вот это ? Ага

    D3DXMatrixLookAtLH(&MatrixView,      // полученная в итоге видовая матрица
        &D3DXVECTOR3(0.0f, 0.0f, 80.0f), // точка, из которой смотрим
        &D3DXVECTOR3(0.0f, 0.0f, 0.0f),  // куда смотрим
        &D3DXVECTOR3(0.0f, 1.0f, 0.0f)); // направление верха
Записан

Антон__
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #46 : 10-02-2009 08:30 » 

Код:
   // Поворот
    D3DXMatrixRotationY(&MatrixRotation, fAngle);
    // Перемещаем мировую матрицу
    D3DXMatrixTranslation(&MatrixTranslation, -5.0f, -0.6f, -4.1f);
   
    D3DXMatrixMultiply(&MatrixWorld, &MatrixTranslation, &MatrixRotation);
    // Устанавливаем мировую матрицу
Попробуй заменить на:
Код:
D3DXMatrixRotationY(&world, fAngle);
world.41 = x
world.42 = y
world.43 = z
pDirect3DDevice->SetTransform(D3DTS_WORLD, &MatrixWorld);

Цитата
а для чего тебе есть вот это ?
Давай еще камеру вокруг куба будем вертеть. Улыбаюсь
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #47 : 10-02-2009 10:08 » 

Вот я сделал два куба один куб находится в центре экрана и вращаеется вокруг центра своей оси.
Второй находиться левее и выше первого куба и он не вращаеться.

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

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

А должно быть так что
1. Первый куб должен вращаться вокруг своего цента в центре экрана.
2. Второй куб должен вращаться вокруг своего цента находясь левее и выше первого куба.

Для лучшего понимания прилагаю архив 2Cube.rar с файлами:
Два куба один вертиться один нет
1. Cube3DnotZ-buffer_1.cpp код программы
2. Cube3DnotZ-buffer_1.exe исполняемый файл
Два куба, оба вертится, но они накладываются друг на друга
1. Cube3DnotZ-buffer_2.cpp код программы
2. Cube3DnotZ-buffer_2.exe исполняемый файл
« Последнее редактирование: 11-02-2009 08:05 от Алексей1153++ » Записан
Антон__
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #48 : 10-02-2009 17:34 » 

zuze, читай Ответ #46.

Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #49 : 10-02-2009 19:17 » 

Вот я сделал как Вы сказали, но кубы всёравно наложились друг на друга

Код:
// Установка матриц преобоазования
void Matrix1(void)
{
    // Мировая матрица
    D3DXMATRIX MatrixWorld;
    // Матрица перемещения
    //D3DXMATRIX MatrixTranslation;
    // Матрица вращения
    D3DXMATRIX MatrixRotation;
    // Матрица вида
    D3DXMATRIX MatrixView;
    //матрица проекции
    D3DXMATRIX MatrixProjection;
    float fAngle;
    float BeginAngle;
    float rps;
    UINT iTime;

    D3DXMatrixIdentity(&MatrixWorld);

    BeginAngle = D3DX_PI/4.0f;
    rps = 0.05f;
    iTime = GetTickCount();

    if(!OneTick)
      OneTick = iTime;
    fAngle = BeginAngle + (iTime -  OneTick) * (D3DX_PI * 2.0f * rps / 1000.0f);

    // Поворот
    D3DXMatrixRotationY(&MatrixRotation, fAngle);
    // Перемещаем мировую матрицу
    MatrixWorld._41 = -5.0f;
    MatrixWorld._42 = -0.6f;
    MatrixWorld._43 = -4.1f;
    pDirect3DDevice->SetTransform(D3DTS_WORLD, &MatrixWorld);

    // Устанавливаем мировую матрицу
    pDirect3DDevice->SetTransform(D3DTS_WORLD, &MatrixWorld);

    // Изменяем видовую матрицу
    D3DXMatrixLookAtLH(&MatrixView,      // полученная в итоге видовая матрица
        &D3DXVECTOR3(0.0f, 0.0f, 80.0f), // точка, из которой смотрим
        &D3DXVECTOR3(0.0f, 0.0f, 0.0f),  // куда смотрим
        &D3DXVECTOR3(0.0f, 1.0f, 0.0f)); // направление верха
    // Устанавливаем видовую матрицу
    pDirect3DDevice->SetTransform(D3DTS_VIEW, &MatrixView);
    // Изменяем матрицу проекции
    D3DXMatrixPerspectiveFovLH(&MatrixProjection, // полученная итоговая матрица проекции
        D3DX_PI/4,                                // поле зрения в направлении оси Y в радианах
        1.54f,                                    // соотношения сторон экрана 770/500=1.54
        10.0f,                                    // передний план отсечения сцены
        200.0f);                                  // задний план отсечения сцены
    // Устанавливаем матрицу проекции
    pDirect3DDevice->SetTransform(D3DTS_PROJECTION, &MatrixProjection);
}
Записан
Антон__
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #50 : 10-02-2009 20:39 » 

Думать надо... И внимательно читать посты.
Иначе травы не хватит, чтобы тебя понять Улыбаюсь

У тебя столько матриц, что я сам запутался.
Исправил и всё закрутилось, как оно должно.

Я так понял, что ничего про матрицы не понимаешь.
Прикрепил свой проект, посмотри, как там матрицы используются, может поймешь.

Лёха, лучше не качай, всё равно не запустится и не скомпилится. Ага

* PPC.CPP (13 Кб - загружено 1360 раз.)
* Crimson.rar (208.48 Кб - загружено 907 раз.)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #51 : 10-02-2009 21:03 » 

Антон__, дык евойные вот проекты я запускал Улыбаюсь А вот твои не выходило почему то. А качать щас не буду, потом буду, когда разбираться продолжу Отлично
Записан

Антон__
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #52 : 10-02-2009 21:16 » 

Ну так скачай 2008-ю студию и мои будут запускаться, и windows 7, чтобы точно всё было хорошо Отлично
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #53 : 11-02-2009 07:33 » 

Выкладываю в архиве код и исполняемый файл (наконец всё нормально вертиться).

У меня только некоторые вопросы:
1. Почему я должен перемещать и вращать объекты (кубы) в функции рендеринга, а не в функции матриц преобразований.
2. Почему объекты (кубы) подсвечиваются, раньше же не подсвечивались.

* 2Cube.rar (25.21 Кб - загружено 900 раз.)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #54 : 11-02-2009 07:51 » 

кубы не подсвечиваются, это ты просто цвета у вертиксов разные задал, задай все одинаковые
« Последнее редактирование: 11-02-2009 08:07 от Алексей1153++ » Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #55 : 11-02-2009 07:58 » 

Ой да у последней вершины другой цвет, подправил теперь нормально.
Остался только вопросик "Почему я должен перемещать и вращать объекты (кубы) в функции рендеринга, а не в функции матриц преобразований?"
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #56 : 11-02-2009 08:10 » 

zuze, Антоха подправит, если я не прав, но тут происходит как раз то, что позволяет не работать с вертиксами объекта напрямую (да ещё и с каждым вертиксом) -
 перед рендером объекта ты говоришь карте, что нужно взять исходный описанный объект, наложить на него последние установленные матрицы преобразований и вывести на экран. При этом исходный объект не меняется
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #57 : 11-02-2009 11:10 » 

Вот сделал код с двумя функциями "матриц преобразований" и в них уже перемещение и вращение объекта.

Оказалось дело в том что в коде из ответа №10 маленькая ошибка, а мы столько мучались.

Код из ответа №10

Код:
// Установка матриц преобоазования
void Matrix(void)
{
    // Мировая матрица
    D3DXMATRIX MatrixWorld;
    // Матрица перемещения
    D3DXMATRIX MatrixTranslation;
    // Матрица вращения
    D3DXMATRIX MatrixRotation;
    // Матрица вида
    D3DXMATRIX MatrixView;
    //матрица проекции
    D3DXMATRIX MatrixProjection;
    // Ось вращения - вектор
    D3DXVECTOR3 axis;
    float fAngle;
    float BeginAngle;
    float rps;
    UINT iTime;
   
    D3DXMatrixIdentity(&MatrixWorld);
   
    BeginAngle = D3DX_PI/4.0f;
    rps = 0.05f;
    iTime = GetTickCount();

    if(!OneTick)
      OneTick = iTime;
    fAngle = BeginAngle + (iTime -  OneTick) * (D3DX_PI * 2.0f * rps / 1000.0f);

    // Поворот
    D3DXMatrixRotationY(&MatrixRotation, fAngle);
    // Перемещаем мировую матрицу
    D3DXMatrixTranslation(&MatrixTranslation, 0.0f, 0.0f, 0.0f);
   
    D3DXMatrixMultiply(&MatrixWorld, &MatrixTranslation, &MatrixRotation);
    pDirect3DDevice->SetTransform(D3DTS_WORLD, &MatrixWorld);


    // Изменяем видовую матрицу
    D3DXMatrixLookAtLH(&MatrixView,      // полученная в итоге видовая матрица
        &D3DXVECTOR3(0.0f, 0.0f, 80.0f), // точка, из которой смотрим
        &D3DXVECTOR3(0.0f, 0.0f, 0.0f),  // куда смотрим
        &D3DXVECTOR3(0.0f, 1.0f, 0.0f)); // направление верха
    // Устанавливаем видовую матрицу
    pDirect3DDevice->SetTransform(D3DTS_VIEW, &MatrixView);
    // Изменяем матрицу проекции
    D3DXMatrixPerspectiveFovLH(&MatrixProjection, // полученная итоговая матрица проекции
        D3DX_PI/4,                                // поле зрения в направлении оси Y в радианах
        1.54f,                                    // соотношения сторон экрана 770/500=1.54
        10.0f,                                    // передний план отсечения сцены
        200.0f);                                  // задний план отсечения сцены
    // Устанавливаем матрицу проекции
    pDirect3DDevice->SetTransform(D3DTS_PROJECTION, &MatrixProjection);
}

Надо было в место
Код:
D3DXMatrixMultiply(&MatrixWorld, &MatrixTranslation, &MatrixRotation);
написать
Код:
D3DXMatrixMultiply(&MatrixWorld, &MatrixRotation, &MatrixTranslation);

Это можно проверить подставив в мой код который я прикрепил в этом ответе в функции Matrix1 в место D3DXMatrixMultiply(&MatrixWorld, &MatrixRotation, &MatrixTranslation); функцию D3DXMatrixMultiply(&MatrixWorld, &MatrixTranslation, &MatrixRotation); и Вы увидите что второй куб начнёт вращаться не вокруг своего центра.

Конешно хотелось понять почему так происходит с кубом, если так перемножаем матрицы он так вращаеться, а если наоборот перемножаем матрицы он иначе вращаеться?

С математической точки зрения это понятно
А - матрица
В - матрица
А*В не равняеться В*А

* Cube3D-2fun.cpp (10.98 Кб - загружено 967 раз.)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #58 : 11-02-2009 11:25 » 

сам же и ответил Улыбаюсь

Цитата
А*В не равняеться В*А

а насчёт " двумя функциями "матриц преобразований" " , тебе надо свойство к объекту присобачить - где он сейчас и на какой угол повёрнут. Тогда для  любого объекта будет автоматически считаться
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #59 : 11-02-2009 11:35 » 

Вы имеете ввиду у функции Matrix сделать параметры?

А на счёт матриц, если надо объект повернуть вокруг своего центра, то MatrixRotation*MatrixTranslation, а если надо объект вращать вокруг какого-то центра на экране,  то  MatrixTranslation*MatrixRotation.

То есть в каком порядке перемножать  матрицы можно считать что это справочная информация?
Как бы это мне ещё по подробней понять почему в этих случаях так умножаем, а в других иначе?
« Последнее редактирование: 11-02-2009 11:42 от zuze » Записан
Страниц: 1 [2] 3  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines