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

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

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


« : 05-02-2009 20:06 » 

Вот я и подошёл к изучению 3D объектов.

Задача
Делаю куб с буфером индексов и без z-буфера. Хочу чтобы он вертелся вокруг своего центра по оси Y.
А у меня он начинает вертется как буд-то во круг какого-то другого объекта.

Вот часть кода

Код:
// Глобальная переменная
DWORD OneTick = 0;

// Установка матриц преобоазования
void Matrix(void)
{
    // Мировая матрица
    D3DXMATRIX MatrixWorld;
    // Матрица вида
    D3DXMATRIX MatrixView;
    //матрица проекции
    D3DXMATRIX MatrixProjection;
    float fAngle;
    float BeginAngle;
    float rps;
    UINT iTime;
   
    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);
    // Поворот мировой матрицы MatrixWorldRotation
    D3DXMatrixRotationY(&MatrixWorld, fAngle);

    // Устанавливаем мировую матрицу
    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);
}

Что я делаю не так, помогите пожалуйста разобраться.

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

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


« Ответ #1 : 06-02-2009 04:52 » 

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

zuze
Опытный

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


« Ответ #2 : 06-02-2009 05:14 » 

Странно, но в примере из книги автора Станислава Горнакова "DirectX 9: Уроки программирования на С++" вертится мировая матрица и куб при этом нормально вращается.

Для лучшего понимания проблемы прикрепляю архив Cube3DnotZ-buffer.rar который содержит два файла:
1. Cube.cpp код программы (в начало кода добавлен код для компиляции в Borland C++ Builder 5.5, а остальное всё как в книге)
2. Cube.exe исполняемый файл

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

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


« Ответ #3 : 06-02-2009 05:19 » 

дык а фигли )
Код:
	CUSTOMVERTEX Vertices[]=//создаём массив вершин и инициализируем его
{
{1.0f, -1.0f, -1.0f, 0x00345800f}, // A1
{-1.0f, -1.0f, -1.0f, 0x0097FF00f}, // B1
{-1.0f, 1.0f, -1.0f, 0x00538C00f}, // C1
{1.0f, 1.0f, -1.0f, 0x00538C00f}, // D1

{-1.0f, -1.0f, 1.0f, 0x00345800f}, // A2
{-1.0f, -1.0f, -1.0f, 0x0097FF00f}, // B2
{-1.0f, 1.0f, -1.0f, 0x00538C00f}, // C2
{-1.0f, 1.0f, 1.0f, 0x00538C00f}, // D2

{1.0f, -1.0f, 1.0f, 0x00345800f}, // A3
{-1.0f, -1.0f, 1.0f, 0x0097FF00f}, // B3
{-1.0f, 1.0f, 1.0f, 0x00538C00f}, // C3
{1.0f, 1.0f, 1.0f, 0x00538C00f}, // D3

{1.0f, -1.0f, -1.0f, 0x00345800f}, // A4
{1.0f, -1.0f, 1.0f, 0x0097FF00f}, // B4
{1.0f, 1.0f, 1.0f, 0x00538C00f}, // C4
{1.0f, 1.0f, -1.0f, 0x00538C00f}, // D4

{1.0f, 1.0f, 1.0f, 0x00345800f}, // A5
{-1.0f, 1.0f, 1.0f, 0x0097FF00f}, // B5
{-1.0f, 1.0f, -1.0f, 0x00538C00f}, // C5
{1.0f, 1.0f, -1.0f, 0x00538C00f}, // D5

{1.0f, -1.0f, 1.0f, 0x00345800f}, // A6
{-1.0f, -1.0f, 1.0f, 0x0097FF00f}, // B6
{-1.0f, -1.0f, -1.0f, 0x00538C00f}, // C6
{1.0f, -1.0f, -1.0f, 0x00538C00f}, // D6
};

на бумаге не чертил, но интуитивно догадываюсь, что центр куба - (0,0,0). А у тебя - центр куба смещён относительно центра мира.

Либо надо как-то вращать мир вокруг центра куба (не разбирался ещё, так же подсказать точно не смогу...)
Записан

zuze
Опытный

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


« Ответ #4 : 06-02-2009 05:44 » 

Понятно.
А я решил в графической программе нарисовать куб и экспортировать в файл с расширением wrl, что бы самому куб не чертить а координаты  куба в wrl файле посмотреть, но я не учёл того что центр куба смещён относительно центра мира.

Конешно в книге плохой пример приведён в ней координаты центра куба равены координатам центра мира.
А что будет если на экране несколько объектов, так что этот вариант из книги мне не подходит.

Так что буду разбиратся с вращанием мировой матрицы вокруг центра куба.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #5 : 06-02-2009 06:00 » 

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

Цитата
Так что буду разбиратся с вращанием мировой матрицы вокруг центра куба.
так что надо разбираться с вращением объекта вокруг заданной оси
Записан

zuze
Опытный

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


« Ответ #6 : 06-02-2009 16:29 » 

Пока нашёл вращение камеры, а про вращения самих объектов ни слова.
Может это не возможно?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #7 : 06-02-2009 17:06 » 

zuze, да как невозможно то, что мешает менять координаты - легко

Vertices[0].x+=5;

только все вершины надо одинаково повернуть вокруг 3 осей. Формулы типа таких : вокруг оси Z, например

Vertices[0].x = Vertices[0].x * cos(Angle) – Vertices[0].y * sin(Angle);
Vertices[0].y = Vertices[0].x * sin(Angle) + Vertices[0].y * cos(Angle);

но по идее должны быть функции, которые это делают, а может их и нету ) Ищи. Я порылся, но так сразу не нашёл тоже
Записан

zuze
Опытный

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


« Ответ #8 : 06-02-2009 20:31 » 

Я как раз про функции говорил.

Я так понял для нормального вращения вокруг собственной оси Y нужно сделать так?

Код:
for (i = 0; i < 24; i++)
{
     Vertices[i].z +=5;
     Vertices[i].x = Vertices[i].x * cos(Angle) – Vertices[i].y * sin(Angle);
     Vertices[i].y = Vertices[i].x * sin(Angle) + Vertices[i].y * cos(Angle);
}
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #9 : 06-02-2009 22:33 » 

Ну тригометрические функции очень тяжелые в вычислении. Я бы постарался бы их заменить, а тем более в цикле.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
zuze
Опытный

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


« Ответ #10 : 07-02-2009 06:02 » 

Есть идея объект поместить в центр координат в независимости где объект находится на сцене, а после повернуть, а после поворота переместить назад.

Вот код в котором я пока ещё не возвращаю назад объект, но он почемуто не крутится вокрук собственной оси, а крутится во круг другой точки

Код:
// Установка матриц преобоазования
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);
}


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

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


« Ответ #11 : 07-02-2009 06:14 » 

zuze, а смысл. У тебя щас всего один объект, сделай второй - сразу поймёшь, что миром вращать бесполезно Улыбаюсь
Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #12 : 07-02-2009 08:17 » 

Ну первое, что бы я сделал. Вывел бы вычисление sin(Angle) и cos(Angle) из цикла. Что то типа этого
Код:
double sinA = sin(Angle);
double cosA = cos(Angle);
for (i = 0; i < 24; i++)
{
     Vertices[i].z +=5;
     Vertices[i].x = Vertices[i].x * cosA – Vertices[i].y * sinA;
     Vertices[i].y = Vertices[i].x * sinA + Vertices[i].y * cosA;
}
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #13 : 07-02-2009 09:24 » 

ээээ, Vertices[i ].z +=5; не надо для вращения , это я для примера ляпнул ))

и, кстати,
не
Код:
     Vertices[i].x = Vertices[i].x * cosA – Vertices[i].y * sinA;
     Vertices[i].y = Vertices[i].x * sinA + Vertices[i].y * cosA;

а

Код:
float x = Vertices[i].x;
Vertices[i].x = x * cosA – Vertices[i].y * sinA;
Vertices[i].y = x * sinA + Vertices[i].y * cosA;

ведь во второй формуле Vertices[i ].x тоже используется, а его в первой формуле уже изменили
« Последнее редактирование: 07-02-2009 09:27 от Алексей1153++ » Записан

Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #14 : 07-02-2009 09:41 » 

о, и самое то главное. Если хотим вращать вокруг оси, параллельной Z и проходящей через X=X0, Y=Y0, то

Код:
float x = Vertices[i].x-X0;
float y = Vertices[i].y-Y0;

Vertices[i].x =X0 + x * cosA – y * sinA;
Vertices[i].y =Y0 + x * sinA + y * cosA;

вроде так )
Записан

zuze
Опытный

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


« Ответ #15 : 07-02-2009 15:34 » 

Цитата
zuze, а смысл. У тебя щас всего один объект, сделай второй - сразу поймёшь, что миром вращать бесполезно

Хотя я думаю для каждого объекта своя мировая матрица, то есть если допустим в редеринге сделать два объекта, тогда нужны две разные функции установка матриц преобоазования, хотя может я и не прав.

А на счёт моего кода я его в ответе №10 подправил, но всё равно не работает, мне кажется из-за того что я не правельно задал координаты у меня там 0.0f,  0.0f,  0.0f а это единичная матрица при перемножении результат не меняется, а какие нужны координаты я не понимаю.

Хотя Вы говорите что мировая матрица общая, специально сделаю два куба, и две разных  функции матрицы преобразования, если мировая матрца общая объекты (кубы) должны себя одинакого  себя вести.
« Последнее редактирование: 07-02-2009 15:41 от zuze » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #16 : 07-02-2009 19:26 » 

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

для 1 объекта поворачиваем-двигаем мир (мартицу делаем) , выводим , потом для второго объекта - свои действия (другая матрица) , выводим. Так наверное ?
Записан

zuze
Опытный

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


« Ответ #17 : 07-02-2009 20:01 » 

Я так понял у меня не работает пример из ответа №10 из-за того что в строчке

Код:
D3DXMatrixTranslation(&MatrixTranslation, 0.0f, 0.0f, 0.0f);

Не правельные координаты.

Вопрос как найти нужные координаты?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #18 : 07-02-2009 21:05 » 

центр твоего куба ?

x = (xmax+xmin)/2;
y = (ymax+ymin)/2;
z = (zmax+zmin)/2;

(исправил формулы)
« Последнее редактирование: 07-02-2009 22:04 от Алексей1153++ » Записан

zuze
Опытный

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


« Ответ #19 : 07-02-2009 21:30 » 

Я пощитал x = 2.5f, y = 2.5f, z = 2.5f

А всёравно вращается вокруг другой точки, а не вокруг своей оси

Код:
// Установка матриц преобоазования
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, 2.5f, 2.5f, 2.5f);
   
    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);
}

Чтоже опять не так?

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

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


« Ответ #20 : 07-02-2009 22:03 » 

ой, я, кстати, нагнал, ценрр же

x = (xmax+xmin)/2;
y = (ymax+ymin)/2;
z = (zmax+zmin)/2;

тогда
    D3DXMatrixTranslation(&MatrixTranslation, -5, -4, -4.1);

(y=-4  -  это для наглядности, чтобы верхнюю грань было видно)
« Последнее редактирование: 07-02-2009 22:05 от Алексей1153++ » Записан

zuze
Опытный

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


« Ответ #21 : 07-02-2009 22:13 » 

Да, теперь вертится вокруг своей оси.
А Вы могли объяснить по потробней почему такие координаты получились?

Ведь по формуле выходит так x = 5.0f, y = 0.6f, z = 4.1f.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #22 : 07-02-2009 22:22 » 

zuze, тут всё  просто, если центр куба - в точке x0,y0,z0  , то, чтобы совместить центр мира (0,0,0) с этой точкой, нужно от координат мира отнять координаты точки:

x= 0-x0 = 0-5 = -5
y= 0-y0 = 0-0.6 = -0.6
z= 0-z0 = 0-4.1 = -4.1

наш сдвиг:
D3DXMatrixTranslation(&MatrixTranslation, -5, -0.6, -4.1);

но, так как вращение происходит у тебя вокруг оси Y , то на место координаты y можем поставить любое число - куб при этом будет лишь выше или ниже
Записан

zuze
Опытный

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


« Ответ #23 : 07-02-2009 22:29 » 

Спасибо, всё понял.
Только разницу если задашь y = -4.0f или  y = -0.6f я не увидел, так что буду доверять формулам, а не глазам.
Выбираю y = -0.6f.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #24 : 07-02-2009 22:31 » 

и правильно делаешь! )

но я просто приблизился к кубу, поэтому мне было заметно
    D3DXMatrixLookAtLH(&MatrixView,
        &D3DXVECTOR3(0.0f, 0, 20.0f),
        &D3DXVECTOR3(0.0f, 0.0f, 0.0f),
        &D3DXVECTOR3(0.0f, 1.0f, 0.0f));
Записан

zuze
Опытный

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


« Ответ #25 : 07-02-2009 22:35 » 

Вот ещё два маленьких вопроса в тему

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

2. После совмещения координат центра куба и мира их надо потом обратно разъединять?

Второй вопрос это к тому я задал если на сцене два или более объектов.
« Последнее редактирование: 07-02-2009 22:44 от zuze » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #26 : 08-02-2009 06:33 » 

1. смотря, что понимаешь под "находятся координаты " , если ты о геометрическом центре, то
  а) если фигура правильной формы, то центр X0,Y0,Z0=(сумма X,Y,Z всех верших)/(количество вершин)
  б) те координаты, которые ты задашь для модели Улыбаюсь Можно же в 3D редакторе сразу определиться, где будут оси вращения и использовать эти оси, не вычисляя их каждый раз. Это повышение быстродействия, кстати

2. на самом же деле ничего не совмещается, просто перед выводом объекта задаём матрицы трансформации мира

Я ещё не пробовал, но чисто теоретически: задали матрицы для первого объекта, нарисовали. Задали для второго , нарисовали.
Если не прокатит, то эту затею надо бросить и трансформировать вертексы отдельных объектов Отлично
Записан

zuze
Опытный

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


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

На счёт первого вопроса понятно, а на счёт второго не очень.
Я правельно понимаю мы объединяем центры, но объект как был например в углу экрана так и остаётся?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #28 : 08-02-2009 15:55 » 

zuze, если ты не пересчитываешь сам координаты объекта, то он никогда не меняется, он всегда постоянен.

Если не ошибаюсь, то: имеются координаты мира - объект изначально описан в этой системе координат. Функция SetTransform позволяет изменить систему координат мира (при этом не затрагивается сам объект). Относительно этой же системы координат задаётся просмотр (== камера)

это можно представить как стационарную сцену с объектами, окружённую камерами, а изображение на мониторе при этом двигается

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

zuze
Опытный

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


« Ответ #29 : 08-02-2009 16:43 » 

Всё я понял спасибо.
Ну Вы сомной и помучились, был бы у Вас на форуме рейтинг я бы его поднял Вам за помощь и терпение при объяснении.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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 » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #60 : 11-02-2009 12:27 » 

как в книжке сказано, так и умножай Улыбаюсь В общем случае - чтобы не запутаться, умножай всегда в одном порядке, сделай себе inline функцию для этого, наконец, чтоб в одном месте умножение было
Записан

zuze
Опытный

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


« Ответ #61 : 11-02-2009 12:42 » 

Понял, спасибо.
Записан
Антон__
Помогающий

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

« Ответ #62 : 11-02-2009 12:51 » 

zuze, зачем ты умножаешь, если не знаешь, что это даёт?
Допустим тебе надо повернуть куб на углы alpha, beta, gamma вокруг осей Ox, Oy, Oz и переместить на (x0, y0, z0).
Какой твой вариант? Улыбаюсь
Записан
zuze
Опытный

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


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

Умножение это объединение матриц.
Чтобы над объектом можно производить несколько трансформаций одновременно используя одну матрицу.
Записан
Антон__
Помогающий

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

« Ответ #64 : 11-02-2009 15:11 » 

Кстати, перемножать матрицы можно так:
а = б*ц;
Записан
zuze
Опытный

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


« Ответ #65 : 11-02-2009 15:14 » 

На моём компьютере если перемножатьь так а = б*ц; программа медленнее работает это видно, т.е. есть задержка перед выводом объектов.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #66 : 11-02-2009 16:04 » 

zuze, какое железо ? Улыбаюсь
Записан

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

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

« Ответ #67 : 11-02-2009 16:17 » 

Лёха, у тебя тоже тормозит???
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #68 : 11-02-2009 16:28 » 

Антон__, не пробовал, но вряд ли будет разница с одним перемножением Улыбаюсь Вот и поинтересовался я его железками
Записан

zuze
Опытный

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


« Ответ #69 : 11-02-2009 16:51 » 

У меня P3 750 Мгц, RAM 512МБ, GeForce FX 5700LE 128 МБ.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #70 : 11-02-2009 17:17 » 

И изза одного несчастного перемножения вне карты тормоза ? Странно.
Записан

zuze
Опытный

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


« Ответ #71 : 11-02-2009 17:32 » 

У меня было два перемножения тогда.
Но это было такое не значительное торможение при прорисовки, можно сказать не торможение, а задержка. Так как во время выполнения ни чего не тормозило.
Записан
Evil_DarkMan
Гость
« Ответ #72 : 18-03-2009 17:52 » 

Ребят, по моему мне кажется, что не в железе дело!

   
Код:
HRESULT hr=pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &params, &pDevice);
- это в фанке Init3D, zure второй параметр попробуй поставь D3DDEVTYPE_REF (если конечно на C++ пишешь) - может помочь, у меня лажня тож подобная была, а вааще


Код:
#include <d3d9.h>
#include <d3dx9.h>
#pragma comment(lib, "d3d9.lib");
#pragma comment(lib, "d3dx9d.lib");
#pragma comment(lib, "winmm.lib");
#include <math.h>
#include "libraries.h"
float angle, n;
#define D3DFVF_CUSTOMVERTEX D3DFVF_XYZ|D3DFVF_DIFFUSE
LONG WINAPI WndProc (HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam);;
LPDIRECT3D9 pD3D=NULL;
LPDIRECT3DDEVICE9 pDevice=NULL;
LPDIRECT3DVERTEXBUFFER9 pBuffVer = NULL;
struct CUSTOMVERTEX{
float x,y,z;
DWORD color;
//float nx, ny, nz;
};
HRESULT Init3D(HWND hwnd){
if(NULL==(pD3D=Direct3DCreate9(D3D_SDK_VERSION)))
return E_FAIL;
D3DPRESENT_PARAMETERS params;
ZeroMemory( &params, sizeof(params));
params.Windowed=TRUE;
params.SwapEffect=D3DSWAPEFFECT_DISCARD;
params.BackBufferFormat=D3DFMT_UNKNOWN;
HRESULT hr=pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &params, &pDevice);
if(FAILED(hr))
{
pD3D->Release();
pD3D=0;
return E_FAIL;
}
pDevice ->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
pDevice ->SetRenderState(D3DRS_LIGHTING, FALSE);
pDevice ->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
}
VOID Delete3D()
{
if(pBuffVer!=NULL)
pBuffVer->Release();
if(pDevice!=NULL)
pDevice->Release();
if(pD3D!=NULL)
pD3D->Release();
}

HRESULT InitObj()
{
double pi = 3.1415926535;
CUSTOMVERTEX vers[]=
{
//First Object;
{-0.5, -0.5, 0, 0x000000ff},
{0.5, -0.5, 0, 0x00ff00ff},
{0, 0, 0, 0x0000f0ff},

{0, 0, 0, 0x000000ff},
{-0.5, -0.5, 0, 0x0000ff00},
{0, 0, -0.4, 0x000000ff},

{0, 0, 0, 0x000000ff},
{0.5, -0.5, 0, 0x0000ffff},
{0, 0, -0.4, 0x000000ff},

{0, 0, -0.4, 0x000000ff},
{0.5, -0.5, 0, 0x00f0ffff},
{-0.5, -0.5, 0, 0x000000ff},

};
if(FAILED(pDevice->CreateVertexBuffer(36*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &pBuffVer, NULL)))
return E_FAIL;
VOID *pBV;
pBuffVer -> Lock(0, sizeof(vers), (void**) &pBV, 0);
memcpy(pBV, vers, sizeof(vers));
pBuffVer -> Unlock();
return S_OK;
}

VOID SetupMatrices(float x, float y, float angle)
{
D3DXMATRIXA16 matWorld;
    D3DXMATRIXA16 matWorldRotation;
    D3DXMATRIXA16 matWorldTranslation;

    D3DXMatrixRotationY( &matWorldRotation, angle);
   
    D3DXMatrixTranslation(&matWorldTranslation, x, y, 0);
   
    D3DXMatrixMultiply(&matWorld, &matWorldTranslation, &matWorldRotation);

    pDevice->SetTransform( D3DTS_WORLD, &matWorld );

    D3DXVECTOR3 vEyePt( 0.0f, 3.0f, -5.0f );
    D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
    D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );
    D3DXMATRIXA16 matView;
    D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
    pDevice->SetTransform( D3DTS_VIEW, &matView );

    D3DXMATRIXA16 matProj;
    D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
    pDevice->SetTransform( D3DTS_PROJECTION, &matProj );

    //D3DXMATRIXA16 matWorld;
    //// Вращение треугольника.
    //UINT  iTime  = timeGetTime() % 1000;
    //FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 1000.0f;
    //D3DXMatrixRotationY( &matWorld, fAngle );
    //pDevice->SetTransform( D3DTS_WORLD, &matWorld );
    //// Видовая матрица.
    //D3DXVECTOR3 vEyePt( 0.0f, 3.0f,-5.0f );
    //D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
    //D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );
    //D3DXMATRIXA16 matView;
    //D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
    //pDevice->SetTransform( D3DTS_VIEW, &matView );
    //// Матрица проекции.
    //D3DXMATRIXA16 matProj;
    //D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
    //pDevice->SetTransform( D3DTS_PROJECTION, &matProj );
}

VOID DrawMyMesh(float x, float y, float angle)
{
    SetupMatrices(x, y, angle);
    pDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 12);
}


void Render()
{
pDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(128,128,0), 0.0f, 0);
if(SUCCEEDED (pDevice->BeginScene()))
{
// SetupMatrices();
pDevice -> SetStreamSource (0, pBuffVer, 0, sizeof(CUSTOMVERTEX));
    pDevice -> SetFVF (D3DFVF_CUSTOMVERTEX);
// Изменение смещения и угла поворота.
        n += 0.01;
        angle += 0.01;

        // Рисование 2-х объектов.
        DrawMyMesh(0, 0, angle);
        DrawMyMesh(0.5, n, -angle*10);
       
//pDevice -> DrawPrimitive (D3DPT_TRIANGLELIST, 0, 4);
pDevice -> EndScene();
}
pDevice -> Present(NULL, NULL, NULL, NULL);
}
  - это на тетраэдр, поменяй всё координаты на координаты куба и всё ништяк!)) Класс!

......и ещё, переменные n и angle поменяй под своё задание!
Записан
Антон__
Помогающий

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

« Ответ #73 : 19-03-2009 05:20 » 

Цитата
Ребят, по моему мне кажется, что не в железе дело!
Тут более глобальная проблема - не хватает травы. Улыбаюсь

А если хочешь вращать 2 кубика, то устанавливаешь мировую матрицу, рисуешь куб, устанавливаешь вторую мировую матрицу, опять рисуешь тот же куб.
Записан
Evil_DarkMan
Гость
« Ответ #74 : 20-03-2009 04:54 » 

 Муки творчества... ...........ребят, а подскажите же как 2 разных объекта крутить, а то у мя чё-т мозга не хватило провернуть всё, что ты сказал Должен же быть выход!!!  Помогите!........сижу.....не фига не втыкаю!  Уже туплю
Записан
Evil_DarkMan
Гость
« Ответ #75 : 20-03-2009 05:07 » 

..........а куба два, или 2 одинаковых объекта вращать - эт как пальца обоссать!  Класс!




My Fox
Записан
Антон__
Помогающий

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

« Ответ #76 : 20-03-2009 07:47 » 

Алгоритм тот же.
1) ставишь мировую матрицу для первого объекта.
2) рисуешь первый объект.
3) ставишь мировую матрицу для второго объекта.
4) рисуешь второй объект.
5) Если не получилось, делаешь заново с пункта 1).
Записан
Evil_DarkMan
Гость
« Ответ #77 : 20-03-2009 10:34 » 

Ok, ща буду пробовать!))
Записан
Evil_DarkMan
Гость
« Ответ #78 : 20-03-2009 17:08 » 

Чёрт, нихрена не врубаю  Сколько об стенку не бейся... , слушайте, люди добрые, выложите код, кому не впадлу, pls!! Поторопись! Должен же быть выход!!!....оч надо бы поскорее....
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #79 : 21-03-2009 09:00 » 

Evil_DarkMan, если ты внимательно эту тему смотрел, то тут куча кода в аттачах ))
Записан

Evil_DarkMan
Гость
« Ответ #80 : 08-04-2009 05:05 » 

Лан, проехал! А со светом на примитивы, типа куба, кто-нить чё-нить посоветовать может??!!))  Спасите - тону!
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #81 : 08-04-2009 07:44 » 

Evil_DarkMan, вот здесь начинали разбираться https://forum.shelek.ru/index.php/topic,18027.0.html
Записан

Страниц: 1 2 3 [Все]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines