PMG

Форумы по созданию игр
Текущее время: 26 сен 2017 15:09

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: 3D графика без DirectX
СообщениеДобавлено: 21 май 2010 10:57 
Не в сети
Любитель

Зарегистрирован: 19 сен 2008 14:48
Сообщения: 43
Я читаю литературу по началам графики и решил составить небольшой примерчик, демонстрирующий 3Д но без DirectX. Конечно мой пример можна проще всего сделать при помощи DirectX или OpenGL но меня заинтересовал сам механизм трехмерной графики поэтому я взялся за этот пример его делать. Пример заключаеться в слеадующем: я в трехмерном пространстве нарисовал куб в начале центра координатной системы трехмерной. Потом вращаю этот куб (при помощи таймера) по оси Y и по часовой стрелке справа на лево, и у меня получаються искажения, артефакты. Вот рисунок куба при повороте на 0 градусов:
Изображение
, вот при повороте на 90 градусов (идут искажения, как буд то наблюдатель справа от меня, меняеться проекция вроде) 90 градусов -
Изображение
. При повороте на 180 проекция сохраняеться
Изображение
и при повороте на 270 опять проекция вроде наблюдатель слева от меня
Изображение
Вот мой код:
Код:
void CCubeNotDXDlg::OnTimer(UINT nIDEvent)
{
   angle+=(3.1415926/180);
   if(angle>3.1415926*2) angle =0;

   Invalidate();
}

void CCubeNotDXDlg::OnPaint()
{
   CPaintDC dc(this); // device context for painting

   float nPoint = 1.0;

   Side[0].x1 = -nPoint;
   Side[0].y1 = nPoint;
   Side[0].z1 = -nPoint;

   Side[0].x2 = nPoint;
   Side[0].y2 = nPoint;
   Side[0].z2 = -nPoint;

   Side[0].x3 = nPoint;
   Side[0].y3 = -nPoint;
   Side[0].z3 = -nPoint;

   Side[0].x4 = -nPoint;
   Side[0].y4 = -nPoint;
   Side[0].z4 = -nPoint;

   Side[1].x1 = nPoint;
   Side[1].y1 = nPoint;
   Side[1].z1 = -nPoint;

   Side[1].x2 = nPoint;
   Side[1].y2 = nPoint;
   Side[1].z2 = nPoint;

   Side[1].x3 = nPoint;
   Side[1].y3 = -nPoint;
   Side[1].z3 = nPoint;

   Side[1].x4 = nPoint;
   Side[1].y4 = -nPoint;
   Side[1].z4 = -nPoint;

   Side[2].x1 = nPoint;
   Side[2].y1 = nPoint;
   Side[2].z1 = nPoint;

   Side[2].x2 = -nPoint;
   Side[2].y2 = nPoint;
   Side[2].z2 = nPoint;

   Side[2].x3 = -nPoint;
   Side[2].y3 = -nPoint;
   Side[2].z3 = nPoint;

   Side[2].x4 = nPoint;
   Side[2].y4 = -nPoint;
   Side[2].z4 = nPoint;

   Side[3].x1 = -nPoint;
   Side[3].y1 = nPoint;
   Side[3].z1 = nPoint;

   Side[3].x2 = -nPoint;
   Side[3].y2 = nPoint;
   Side[3].z2 = -nPoint;

   Side[3].x3 = -nPoint;
   Side[3].y3 = -nPoint;
   Side[3].z3 = -nPoint;

   Side[3].x4 = -nPoint;
   Side[3].y4 = -nPoint;
   Side[3].z4 = nPoint;

   Side[4].x1 = -nPoint;
   Side[4].y1 = nPoint;
   Side[4].z1 = nPoint;

   Side[4].x2 = nPoint;
   Side[4].y2 = nPoint;
   Side[4].z2 = nPoint;

   Side[4].x3 = nPoint;
   Side[4].y3 = nPoint;
   Side[4].z3 = -nPoint;

   Side[4].x4 = -nPoint;
   Side[4].y4 = nPoint;
   Side[4].z4 = -nPoint;

   Side[5].x1 = -nPoint;
   Side[5].y1 = -nPoint;
   Side[5].z1 = nPoint;

   Side[5].x2 = nPoint;
   Side[5].y2 = -nPoint;
   Side[5].z2 = nPoint;

   Side[5].x3 = nPoint;
   Side[5].y3 = -nPoint;
   Side[5].z3 = -nPoint;

   Side[5].x4 = -nPoint;
   Side[5].y4 = -nPoint;
   Side[5].z4 = -nPoint;

   for (int i = 0; i < 6; i++)
   {

      //поворачиваем вокруг Y
      Side[i].x1 = Side[i].x1 * cos(angle) + Side[i].y1 * 0 - Side[i].z1 * sin(angle);
      Side[i].z1 = Side[i].x1 * -sin(angle)+ Side[i].y1 * 0 - Side[i].z1 * cos(angle);

      Side[i].x2 = Side[i].x2 * cos(angle) + Side[i].y2 * 0 - Side[i].z2 * sin(angle);
      Side[i].z2 = Side[i].x2 * -sin(angle)+ Side[i].y2 * 0 - Side[i].z2 * cos(angle);

      Side[i].x3 = Side[i].x3 * cos(angle) + Side[i].y3 * 0 - Side[i].z3 * sin(angle);
      Side[i].z3 = Side[i].x3 * -sin(angle)+ Side[i].y3 * 0 - Side[i].z3 * cos(angle);

      Side[i].x4 = Side[i].x4 * cos(angle) + Side[i].y4 * 0 - Side[i].z4 * sin(angle);
      Side[i].z4 = Side[i].x4 * -sin(angle)+ Side[i].y4 * 0 - Side[i].z4 * cos(angle);


      
      //мировая трансформация

      Side[i].x1+=0;
      Side[i].y1+=0;
      Side[i].z1+=4;

      Side[i].x2+=0;
      Side[i].y2+=0;
      Side[i].z2+=4;

      Side[i].x3+=0;
      Side[i].y3+=0;
      Side[i].z3+=4;

      Side[i].x4+=0;
      Side[i].y4+=0;
      Side[i].z4+=4;

      //перспективная трансформация
   
      Side[i].x1 /= Side[i].z1;
      Side[i].y1 /= Side[i].z1;
      
      Side[i].x2 /= Side[i].z2;
      Side[i].y2 /= Side[i].z2;

      Side[i].x3 /= Side[i].z3;
      Side[i].y3 /= Side[i].z3;

      Side[i].x4 /= Side[i].z4;
      Side[i].y4 /= Side[i].z4;



      //экранная трансформация
      RECT rect;
      GetClientRect(&rect);
         
      Side[i].x1 = Side[i].x1 * rect.right/2 + rect.right/2;
      Side[i].y1 = (-Side[i].y1) * rect.bottom/2 + rect.bottom/2;

      Side[i].x2 = Side[i].x2 * rect.right/2 + rect.right/2;
      Side[i].y2 = (-Side[i].y2) * rect.bottom/2 + rect.bottom/2;

      Side[i].x3 = Side[i].x3 * rect.right/2 + rect.right/2;
      Side[i].y3 = (-Side[i].y3) * rect.bottom/2 + rect.bottom/2;

      Side[i].x4 = Side[i].x4 * rect.right/2 + rect.right/2;
      Side[i].y4 = (-Side[i].y4) * rect.bottom/2 + rect.bottom/2;
      
      CPen penBlue;

      penBlue.CreatePen(PS_SOLID, 3, RGB(0, 0, 255));

      CPen* ppenOld;
      ppenOld=dc.SelectObject(&penBlue);

      dc.MoveTo(Side[i].x1, Side[i].y1);
      
      dc.LineTo(Side[i].x2, Side[i].y2);
      dc.LineTo(Side[i].x3, Side[i].y3);
      dc.LineTo(Side[i].x4, Side[i].y4);
      dc.LineTo(Side[i].x1, Side[i].y1);

      dc.SelectObject(ppenOld);
   }
   if (IsIconic())
   {
      ...................      
   }
   else
   {
      CDialog::OnPaint();
   }
}



Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 3D графика без DirectX
СообщениеДобавлено: 21 май 2010 11:40 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2686
Откуда: Кирово-Чепецк
Какую литературу?

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 3D графика без DirectX
СообщениеДобавлено: 28 май 2010 12:12 
Не в сети
Любитель

Зарегистрирован: 19 сен 2008 14:48
Сообщения: 43
Значит я читаю Ла Мот главу "Третье измерение" и еще скачал с интернета, автора не знаю какой то курс лекций на 2 тыс страниц ПДФ на английском языке называеться "Graphics programming with DirectX". Там подробно описываеться как сделать то что я спрашиваю на форуме здесь, но в виде псевдокода. Исходников к Ла Моту у меня тоже нету. То есть не знаю. Когда кубик согласно этому коду поворачиваеться, то вроде меняеться положение осей получаеться, в частности оси Z потому что выходит глядя на картинки что при 90 градусов ось Z меняет направление, потому что проекция справа на лево, вроде наблюдатель справа от кубика, а не как прямо смотрит в экран при 0 градусов или 360. Что делать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 3D графика без DirectX
СообщениеДобавлено: 29 май 2010 17:11 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2686
Откуда: Кирово-Чепецк
Какая у тебя проекция?

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 3D графика без DirectX
СообщениеДобавлено: 31 май 2010 08:57 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2686
Откуда: Кирово-Чепецк
Мне кажется, что тебе надо почитать для начала Эйнджела или Хилла, а потом уже переходить к реализации собственного конвейра рендеринга.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 3D графика без DirectX
СообщениеДобавлено: 07 июн 2010 07:46 
Не в сети
Любитель

Зарегистрирован: 19 сен 2008 14:48
Сообщения: 43
Просмотрел я эти книги - к сожалению у меня сложности с математикой, да к тому же я изучаю DirectX а не OpenGL - я в этих книгах вобщим не нашел для себя ответов. Может быть вы могли бы уточнить именно какая страница в этих книгах или глава, что бы я почитал. А то я не нашел эту информацию что мне нужно. Кроме того проекцию я создаю когда делю на z координаты x,y каждой вершины. Так написано в той литературе что я читал. Как еще дополнительно что нужно сделать, что бы проекция была правильная? Может если Вам не сложно подскажете?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 3D графика без DirectX
СообщениеДобавлено: 07 июн 2010 08:35 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2686
Откуда: Кирово-Чепецк
Я думая тебе надо прочитать главу 5 от Эйнджела.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 3D графика без DirectX
СообщениеДобавлено: 07 июн 2010 14:59 
Не в сети
Любитель

Зарегистрирован: 19 сен 2008 14:48
Сообщения: 43
Дело было оказываеться не в проекции. Дело в том, что координаты которые участруют в повороте должны были быть сохранены перед поворотом, что бы участвовали не преобразованные координаты. Я думаю понятно будет если выложить код:
Код:
Temp[0].y1 = Side[i].y1;
Temp[0].z1 = Side[i].z1;

Temp[0].y2 = Side[i].y2;
Temp[0].z2 = Side[i].z2;

Temp[0].y3 = Side[i].y3;
Temp[0].z3 = Side[i].z3;

Temp[0].y4 = Side[i].y4;
Temp[0].z4 = Side[i].z4;
      

//вращение по X при помощи матриц
Side[i].y1 = Temp[0].y1 * cos(angle)  + Temp[0].z1 * -sin(angle);
Side[i].z1 = Temp[0].y1 * sin(angle)+ Temp[0].z1 * cos(angle);

Side[i].y2 = Temp[0].y2 * cos(angle) + Temp[0].z2 * -sin(angle);
Side[i].z2 = Temp[0].y2 * sin(angle)+ Temp[0].z2 * cos(angle);

Side[i].y3 = Temp[0].y3 * cos(angle) + Temp[0].z3 * -sin(angle);
Side[i].z3 = Temp[0].y3 * sin(angle)+ Temp[0].z3 * cos(angle);

Side[i].y4 = Temp[0].y4 * cos(angle) + Temp[0].z4 * -sin(angle);
Side[i].z4 = Temp[0].y4 * sin(angle)+ Temp[0].z4 * cos(angle);

MagicWolf спасибо за поддержку!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 3D графика без DirectX
СообщениеДобавлено: 16 июл 2010 18:17 
да ну нафиг так стараться писать без библиотек как раз для этого сделанных
я бы за то времяя пока ты написал бы как сделать куб сделал уже загрузку модели в ДХ


Вернуться к началу
  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB