Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Трансформация Эллипса в DirectX 9

11K
21 января 2009 года
zuze
84 / / 07.03.2008
Я хотел сделать перемещение, вращение по оси X и масштабирование (уменьшение эллипса в два раза) одновременно для эллипса.
Для этого перемножил матрицы.
Но почемуто раньше нармально вращался по оси X, а теперь вращается под углом (как бы эллипс со стороны на сторону переваливается - эффект как монентку бросаешь на пол)

Вот когда только вращение

Код:
// Установка матриц преобоазования
void Matrix(void)
{
    // Мировая матрица
    D3DXMATRIX MatrixWorld;
    // Матрица вида
    D3DXMATRIX MatrixView;
    //матрица проекции
    D3DXMATRIX MatrixProjection;
   
   // Коэффициент скорости вращения
    const float rps = 0.5f;

    UINT  iTime  = GetTickCount();
    FLOAT fAngle = iTime * (D3DX_PI * 2 * rps / 1000.0f);
    // Вращаем мировую матрицу по оси X
    D3DXMatrixRotationX(&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/3,                                // поле зрения в направлении оси Y в радианах
        1.54f,                                    // соотношения сторон экрана 770/500=1.54
        10.0f,                                    // передний план отсечения сцены
        200.0f);                                  // задний план отсечения сцены
    // Устанавливаем матрицу проекции
    pDirect3DDevice->SetTransform(D3DTS_PROJECTION, &MatrixProjection);
}


Вот код перемещение, вращение по оси X и масштабирование (уменьшение эллипса в два раза) одновременно

Код:
// Установка матриц преобоазования
void Matrix(void)
{
    // Мировая матрица перемещения, поворота и масштабирования
    D3DXMATRIX MatrixWorldAll;
    // Мировая матрица перемещения
    D3DXMATRIX MatrixWorldTranslation;
    // Мировая матрица поворота
    D3DXMATRIX MatrixWorldRotation;
    // Мировая матрица масштабирования
    D3DXMATRIX MatrixWorldScaling;
    // Матрица вида
    D3DXMATRIX MatrixView;
    //матрица проекции
    D3DXMATRIX MatrixProjection;

    D3DXMatrixIdentity(&MatrixWorldAll);
    // Перемещение мировой матрицы MatrixWorldTranslation
    D3DXMatrixTranslation(&MatrixWorldTranslation, -50.0f, 0.0f, 0.0f);
    const float rps = 0.5f;
    UINT  iTime  = GetTickCount();
    FLOAT fAngle = iTime * (D3DX_PI * 2 * rps / 1000.0f);
    // Поворот мировой матрицы MatrixWorldRotation
    D3DXMatrixRotationX(&MatrixWorldRotation, fAngle);
    // Масштабирование мировой матрицы MatrixWorldScaling
    D3DXMatrixScaling(&MatrixWorldScaling, 0.5f, 0.5f, 1.0f);

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

    // Изменяем видовую матрицу
    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/3,                                // поле зрения в направлении оси Y в радианах
        1.54f,                                    // соотношения сторон экрана 770/500=1.54
        10.0f,                                    // передний план отсечения сцены
        200.0f);                                  // задний план отсечения сцены
    // Устанавливаем матрицу проекции
    pDirect3DDevice->SetTransform(D3DTS_PROJECTION, &MatrixProjection);
}


Что же я сделал не так?

На всякий случай прикрепляю архив Ellipse.rar с кодом и исполняемыми файлами:

Код
Ellipse2dRotation.cpp - только вращение по оси X
Ellipse2dTRS.cpp - перемещение, вращение по оси X и масштабирование (уменьшение эллипса в два раза) одновременно
Исполняемые файлы
Ellipse2dRotation.exe - только вращение по оси X
Ellipse2dTRS.exe - перемещение, вращение по оси X и масштабирование (уменьшение эллипса в два раза) одновременно (но сдесь стало иначе вращатся)
11K
23 января 2009 года
zuze
84 / / 07.03.2008
У меня вращение по оси X, это так

 
Код:
const float rps = 0.5f;

UINT  iTime  = GetTickCount();
FLOAT fAngle = iTime * (D3DX_PI * 2 * rps / 1000.0f);
D3DXMatrixRotationX(&MatrixWorld, fAngle);


А я решил проверить что действительно так
Я сделал коэффициент rps = 0.05f; и что же я увидел эллипс ложится и обратно переходит в тоже положение, он не делает полный оборот по оси X.

Просто на большой скорости создаётся эффект какбуд-то он делает полный оборот.

Как же сделать полное вращение эллипса по оси X?
11K
25 января 2009 года
zuze
84 / / 07.03.2008
Вращение по оси X эллипса происходит.

Это зрительный обман был.

Я сделал в место

 
Код:
Vertices.color = 0x00000fff;


так

 
Код:
if (i < 10)
   Vertices.color = 0x00000fff;
else
if (i > 10 && i < 18)
   Vertices.color = 0x00ffffff;
else
    Vertices.color = 0xffffffff;


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

Это почему так происходит?
11K
25 января 2009 года
zuze
84 / / 07.03.2008
Эллипс начал вращатся по оси X всегда из положения стоя

Код:
DWORD OneTick = 0; // Глобальная переменная
float fAngle;
float BeginAngle = D3DX_PI/4.0f;
const float rps = 0.05f;

UINT  iTime  = GetTickCount();

if(!OneTick)
  OneTick = iTime;

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


Если сделать

 
Код:
float BeginAngle = D3DX_PI/2.0f;


то эллипс будет вращатся по оси X всегда из положения лёжа.
11K
25 января 2009 года
zuze
84 / / 07.03.2008
А по вопросу перемещение, вращение по оси X и масштабирование (уменьшение эллипса в два раза) одновременно для эллипса оказалось что он нормально работает я из-за уменьшения размеров произошёл визуальный обман я увеличил эллипс в два раза и увидел что всё прекрасно работает.

Тему можно закрыть.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог