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

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

Всё я понял спасибо.
Ну Вы сомной и помучились, был бы у Вас на форуме рейтинг я бы его поднял Вам за помощь и терпение при объяснении.
Записан
Страниц: [1] 2 3  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines