PMG

Форумы по созданию игр
Текущее время: 19 апр 2024 22:29

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




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Урок 9, Урок 10
СообщениеДобавлено: 20 ноя 2011 08:13 
Не в сети
Новичок

Зарегистрирован: 19 ноя 2011 22:11
Сообщения: 3
Урок 9(<-Ссылка на урок)
Код:
int DrawGLScene(GLvoid)                           // Here's Where We Do All The Drawing
{
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);   // Clear The Screen And The Depth Buffer
   glBindTexture(GL_TEXTURE_2D, texture[0]);         // Select Our Texture

   for (loop=0; loop<num; loop++)                  // Loop Through All The Stars
   {
      glLoadIdentity();                        // Reset The View Before We Draw Each Star
      glTranslatef(0.0f,0.0f,zoom);               // Zoom Into The Screen (Using The Value In 'zoom')
      glRotatef(tilt,1.0f,0.0f,0.0f);               // Tilt The View (Using The Value In 'tilt')
      glRotatef(star[loop].angle,0.0f,1.0f,0.0f);      // Rotate To The Current Stars Angle
      glTranslatef(star[loop].dist,0.0f,0.0f);      // Move Forward On The X Plane
      glRotatef(-star[loop].angle,0.0f,1.0f,0.0f);   // Cancel The Current Stars Angle
      glRotatef(-tilt,1.0f,0.0f,0.0f);            // Cancel The Screen Tiltx
      
      if (twinkle)
      {
         glColor4ub(star[(num-loop)-1].r,star[(num-loop)-1].g,star[(num-loop)-1].b,255);
         glBegin(GL_QUADS);
            glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,-1.0f, 0.0f);
            glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,-1.0f, 0.0f);
            glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 0.0f);
            glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 0.0f);
         glEnd();
      }

      glRotatef(spin,0.0f,0.0f,1.0f);
      glColor4ub(star[loop].r,star[loop].g,star[loop].b,255);
      glBegin(GL_QUADS);
         glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,-1.0f, 0.0f);
         glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,-1.0f, 0.0f);
         glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 0.0f);
         glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 0.0f);
      glEnd();

      spin+=0.01f;
      star[loop].angle+=float(loop)/num;
      star[loop].dist-=0.01f;
      if (star[loop].dist<0.0f)
      {
         star[loop].dist+=5.0f;
         star[loop].r=rand()%256;
         star[loop].g=rand()%256;
         star[loop].b=rand()%256;
      }
   }
   return TRUE;                              // Everything Went OK
}


Шаманы программирования, я вот не могу разобраться:
Код:
      glLoadIdentity();                        // Reset The View Before We Draw Each Star
      glTranslatef(0.0f,0.0f,zoom);               // Zoom Into The Screen (Using The Value In 'zoom')
      glRotatef(tilt,1.0f,0.0f,0.0f);               // Tilt The View (Using The Value In 'tilt')
      glRotatef(star[loop].angle,0.0f,1.0f,0.0f);      // Rotate To The Current Stars Angle
      glTranslatef(star[loop].dist,0.0f,0.0f);      // Move Forward On The X Plane
      glRotatef(-star[loop].angle,0.0f,1.0f,0.0f);   // Cancel The Current Stars Angle
      glRotatef(-tilt,1.0f,0.0f,0.0f);            // Cancel The Screen Tiltx

1)glLoadIdentity, glTranslatef(0.0f,0.0f,zoom) : Как я понимаю вначале сбрасываем матрицу, потом двигаем камеру на "zoom" по оси "z",
2)glRotatef(tilt,1.0f,0.0f,0.0f) : далее вращаем по оси "x" на "tilt" = 90, т.е. теперь ось "y" направлена на нас (вместо "z"), а ось "z" направлена вниз(обратно "y" начального), звезды нам не видны, т.к. их лицевая часть направлена вверх или вниз,а мы смотрим "сбоку".
3)glRotatef(star[loop].angle,0.0f,1.0f,0.0f) : далее вращаем по оси "у" на "star[loop].angle", т.е. теперь звезды на которые мы смотрим "сбоку" начинают вращаться вокруг оси "y", которая направлена направлена на нас(вместо "z") => здесь уже "x" и "z" постоянно меняются местами...
4)glTranslatef(star[loop].dist,0.0f,0.0f) : двигаем звезды относительно центра(здесь уже без разницы относительно "x", или же "z" двигать)...

А вот дальше не пойму,что нам дают обратные вращения??? Ибо покрутили оси => покрутили звездочки, потом вернули все обратно glRotatef(-star[loop].angle,0.0f,1.0f,0.0f) и glRotatef(-tilt,1.0f,0.0f,0.0f) , а потом уже печатаем на экран и мы не должны увидеть как они крутятся...Так в чем же фишка????

И второй вопрос, как регулируется цвет вот тута glColor4ub(star[(num-loop)-1].r,star[(num-loop)-1].g,star[(num-loop)-1].b,255)???? Совсем не понял(((

Урок 10(<-Ссылка на урок)
Код:
if (keys[VK_UP])                 // Была ли нажата стрелка вверх?
{
      // Переместиться по оси X вектора направления игрока
      xpos -= (float)sin(heading*piover180) * 0.05f;
      // Переместиться по оси Z вектора направления игрока
      zpos -= (float)cos(heading*piover180) * 0.05f;
      if (walkbiasangle >= 359.0f)// walkbiasangle>=359?
      {
            walkbiasangle = 0.0f; // Присвоить walkbiasangle  0
      }
      else                        // В противном случае
      {
      // Если walkbiasangle < 359 увеличить его на 10
             walkbiasangle+= 10;
      }
      // Иммитация походки человека
      walkbias = (float)sin(walkbiasangle * piover180)/20.0f;
}

if (keys[VK_DOWN])               // Была ли нажата стрелка вниз?
{
      // Переместиться по оси X вектора направления игрока
      xpos += (float)sin(heading*piover180) * 0.05f;
      // Переместиться по оси Z вектора направления игрока
      zpos += (float)cos(heading*piover180) * 0.05f;
      if (walkbiasangle <= 1.0f)    // walkbiasangle<=1?
      {
            walkbiasangle = 359.0f; // Присвоить walkbiasangle 359
      }
      else                          // В противном случае
      {
// Если walkbiasangle >1 уменьшить его на 10
walkbiasangle-= 10;
      }
      // Иммитация походки человека
      walkbias = (float)sin(walkbiasangle * piover180)/20.0f;
}


Не понимаю, зачем при движении вперед и назад менять координаты по "x", по "z" понятно, а "x" причем тут?

Почему walkbiasangle меняется 0т 0 до 360, как понять, вить угол движения головы по оси "у" не 360, а 180?

Код:
      GLfloat x_m, y_m, z_m, u_m, v_m;
      GLfloat xtrans = -xpos;       // Проекция игрока на ось X
      GLfloat ztrans = -zpos;       // Проекция игрока на ось Z
      // Для смещения изображения вверх и вниз
      GLfloat ytrans = -walkbias-0.25f;


Почему со знаком минус, мы же уже учли, что при движении в одну сторону изображение движется в обратную?
Код:
if (keys[VK_RIGHT])              // Была ли нажата правая стрелка?
{
      heading -= 1.0f;
      yrot = heading;              // Вращать сцену влево
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Урок 9, Урок 10
СообщениеДобавлено: 23 ноя 2011 03:09 
Не в сети
Новичок

Зарегистрирован: 19 ноя 2011 22:11
Сообщения: 3
дааа, печально тут у вас...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Урок 9, Урок 10
СообщениеДобавлено: 23 ноя 2011 16:25 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Урок 9.
В уроке 9 написано, что
Цитата:
Теперь немного хитрого кода. Звезда это всего лишь плоская текстура. И если мы нарисовали плоский квадрат в середине экрана с наложенной текстурой - это будет выглядеть отлично. Он будет, повернут к вам, как и должен быть. Но если повернёте его вокруг оси y на 90 градусов, текстура будет направлена вправо или влево экрана. Всё что вы увидите это тонкую линию. Нам не нужно чтобы это случилось. Мы хотим, чтобы звезды были направлены на наблюдателя всё время, не важно как они вращаются и двигаются по экрану.

Мы добиваемся этого путем отмены вращения, которое мы делаем, перед тем как нарисовать звезду. Мы отменяем вращение в обратном порядке. Выше мы повернули экран, когда сделали вращение на угол звезды. В обратном порядке, мы должны повернуть обратно звезду на текущий угол. Чтобы сделать это, мы используем обратное значение угла, и повернём звезду на этот угол. И так как мы повернули звезду на 10 градусов, то, поворачивая обратно на -10 градусов мы делаем звезду повернутой к наблюдателю по y. Первая строчка ниже отменяет вращение по оси y. Потом мы должны отменить вращение по оси x. Чтобы сделать это мы вращаем звезду на угол -tilt. После всех этих операций звезда полностью повернута к наблюдателю.


То бишь, звезда - это плоскость, и она должна всегда смотреть на зрителя, вот для этого и манипуляции.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Урок 9, Урок 10
СообщениеДобавлено: 23 ноя 2011 16:34 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Урок 10.
Относительно вектора движения игрока: z - вперед/назад; x - влево/вправо; y - вверх/вниз.
walkbiasangle - это не голова, это поворот всего туловища.
Вращение вправо/влево клавишами left/right - это вращение вокруг оси y, которая вверх направлена (z-вперед, x- влево).
yrot дальше используется как GLfloat sceneroty = 360.0f - yrot;

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Урок 9, Урок 10
СообщениеДобавлено: 24 ноя 2011 14:32 
Не в сети
Новичок

Зарегистрирован: 19 ноя 2011 22:11
Сообщения: 3
MagicWolf
Это все и так понятно! Я урок читал вообще-то...
http://www.gamedev.ru/code/forum/?id=154948


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

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


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

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


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

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