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

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

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


« : 24-01-2009 22:32 » 

У меня нарисован эллипс вытинутый по горизонтали.

Код для вращения

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

    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, а иногда наооборот он из положения лёжа начинает вставать и обратно переходит в положение лёжа, а должен из положения стоя делать полный оборот по оси X.

Помогите пожалуйста разобратся.

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

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

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


« Ответ #1 : 25-01-2009 06:59 » 

zuze, запустил, вижу вращение вокруг X , что не так то - непонятно )
Записан

zuze
Опытный

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


« Ответ #2 : 25-01-2009 09:46 » 

Эллипс вроде должен делать целый оборот, а он делает пол оборота или я ошибаюсь?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #3 : 25-01-2009 10:53 » 

zuze, а как ты это узнАешь то ? Он же весь синий. Сделай на нём рисунок, несимметричный относительно оси X
Записан

zuze
Опытный

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


« Ответ #4 : 25-01-2009 11:09 » 

Да Вы правы Алексей1153++ он вертится.

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

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

Код:
Vertices[i].color = 0x00000fff;

так

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

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

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

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


« Ответ #5 : 25-01-2009 11:21 » new

zuze, у тебя он вообще из любого положения может стартануть -

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

ведь изза GetTickCount(); угол поворота бешенно меняется, на какой попадёшь - фиг знает )

если охота, делай поправку: после запуска программы при самом первом вызове GetTickCount()  запомни это значение

DWORD dwd0Tick=GetTickCount()

и отнимай его каждый последующий раз при очередном расчёте угла
« Последнее редактирование: 25-01-2009 11:24 от Алексей1153++ » Записан

zuze
Опытный

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


« Ответ #6 : 25-01-2009 15:02 » 

Я подумал надо чтобы начальный угол при старте надо задать такой чтобы эллипс стоял.

Сделал так, но это не помогло

Код: (C++)
int OneTick = 0; // глобальная переменная
float fAngle;
const float rps = 0.05f;
UINT  iTime  = GetTickCount();
OneTick = OneTick++;
if (OneTick == 1)
   fAngle = D3DX_PI/4.0f;
else
   fAngle = iTime * (D3DX_PI * 2.0f * rps / 1000.0f);

D3DXMatrixRotationX(&MatrixWorld, fAngle);

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

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


« Ответ #7 : 25-01-2009 16:42 » 

я бы сделал так

Код:
DWORD g_dwdTheFirstTickCount;
//g_dwdTheFirstTickCount - инициализировать нулём в начале WinMain()

WinMain()
{
   g_dwdTheFirstTickCount=0;
   ...
}

//отрисовка
...
{
    // Коэффициент скорости вращения
    const float rps = 0.05f;

    // Начальный угол
    const float fF0 = 0.5 * D3DX_PI ; //


    UINT  iTime  = GetTickCount();
   if(!g_dwdTheFirstTickCount)
   {
      g_dwdTheFirstTickCount=iTime;
   }

   FLOAT fAngle = fF0 + (iTime-g_dwdTheFirstTickCount) * (D3DX_PI * 2 * rps / 1000.0f);
   // Вращаем мировую матрицу по оси X

   ...

}
Записан

zuze
Опытный

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


« Ответ #8 : 25-01-2009 17:26 » 

Большое спасибо.

Эллипс начал вращатся по оси X всегда из положения лёжа.

Для вращатся эллипса по оси X всегда из положения стоя нужно

Код:
const float fF0 = 0.25 * D3DX_PI;

 

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

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


« Ответ #9 : 25-01-2009 18:13 » 

странно, пи/4 - это 45 градусов. Значит мир как-то повёрнут у тебя ещё ))
Записан

zuze
Опытный

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


« Ответ #10 : 25-01-2009 18:51 » 

Я только не знаю почему он повёрнут. я его вроде не поворачивал в программе ни куда.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines