// Установка матриц преобоазования
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);
}
Трансформация Эллипса в DirectX 9
Для этого перемножил матрицы.
Но почемуто раньше нармально вращался по оси X, а теперь вращается под углом (как бы эллипс со стороны на сторону переваливается - эффект как монентку бросаешь на пол)
Вот когда только вращение
Код:
Вот код перемещение, вращение по оси 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);
}
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 и масштабирование (уменьшение эллипса в два раза) одновременно (но сдесь стало иначе вращатся)
Код:
const float rps = 0.5f;
UINT iTime = GetTickCount();
FLOAT fAngle = iTime * (D3DX_PI * 2 * rps / 1000.0f);
D3DXMatrixRotationX(&MatrixWorld, fAngle);
UINT iTime = GetTickCount();
FLOAT fAngle = iTime * (D3DX_PI * 2 * rps / 1000.0f);
D3DXMatrixRotationX(&MatrixWorld, fAngle);
А я решил проверить что действительно так
Я сделал коэффициент rps = 0.05f; и что же я увидел эллипс ложится и обратно переходит в тоже положение, он не делает полный оборот по оси X.
Просто на большой скорости создаётся эффект какбуд-то он делает полный оборот.
Как же сделать полное вращение эллипса по оси X?
Это зрительный обман был.
Я сделал в место
Код:
Vertices.color = 0x00000fff;
так
Код:
if (i < 10)
Vertices.color = 0x00000fff;
else
if (i > 10 && i < 18)
Vertices.color = 0x00ffffff;
else
Vertices.color = 0xffffffff;
Vertices.color = 0x00000fff;
else
if (i > 10 && i < 18)
Vertices.color = 0x00ffffff;
else
Vertices.color = 0xffffffff;
Но почему-то если запускать к примеру три раза подряд мою программу эллипс в двух случаях начинает вращение из положения стоя, а в одном случае из положения лёжа.
Это почему так происходит?
Код:
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 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 всегда из положения лёжа.
Тему можно закрыть.