| PMG http://forum.pmg.org.ru/ |
|
| Урок 9, Урок 10 http://forum.pmg.org.ru/viewtopic.php?f=1&t=8363 |
Страница 1 из 1 |
| Автор: | lopster92 [ 20 ноя 2011 08:13 ] |
| Заголовок сообщения: | Урок 9, Урок 10 |
Урок 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; // Вращать сцену влево } |
|
| Автор: | lopster92 [ 23 ноя 2011 03:09 ] |
| Заголовок сообщения: | Re: Урок 9, Урок 10 |
дааа, печально тут у вас... |
|
| Автор: | MagicWolf [ 23 ноя 2011 16:25 ] |
| Заголовок сообщения: | Re: Урок 9, Урок 10 |
Урок 9. В уроке 9 написано, что Цитата: Теперь немного хитрого кода. Звезда это всего лишь плоская текстура. И если мы нарисовали плоский квадрат в середине экрана с наложенной текстурой - это будет выглядеть отлично. Он будет, повернут к вам, как и должен быть. Но если повернёте его вокруг оси y на 90 градусов, текстура будет направлена вправо или влево экрана. Всё что вы увидите это тонкую линию. Нам не нужно чтобы это случилось. Мы хотим, чтобы звезды были направлены на наблюдателя всё время, не важно как они вращаются и двигаются по экрану. Мы добиваемся этого путем отмены вращения, которое мы делаем, перед тем как нарисовать звезду. Мы отменяем вращение в обратном порядке. Выше мы повернули экран, когда сделали вращение на угол звезды. В обратном порядке, мы должны повернуть обратно звезду на текущий угол. Чтобы сделать это, мы используем обратное значение угла, и повернём звезду на этот угол. И так как мы повернули звезду на 10 градусов, то, поворачивая обратно на -10 градусов мы делаем звезду повернутой к наблюдателю по y. Первая строчка ниже отменяет вращение по оси y. Потом мы должны отменить вращение по оси x. Чтобы сделать это мы вращаем звезду на угол -tilt. После всех этих операций звезда полностью повернута к наблюдателю. То бишь, звезда - это плоскость, и она должна всегда смотреть на зрителя, вот для этого и манипуляции. |
|
| Автор: | MagicWolf [ 23 ноя 2011 16:34 ] |
| Заголовок сообщения: | Re: Урок 9, Урок 10 |
Урок 10. Относительно вектора движения игрока: z - вперед/назад; x - влево/вправо; y - вверх/вниз. walkbiasangle - это не голова, это поворот всего туловища. Вращение вправо/влево клавишами left/right - это вращение вокруг оси y, которая вверх направлена (z-вперед, x- влево). yrot дальше используется как GLfloat sceneroty = 360.0f - yrot; |
|
| Автор: | lopster92 [ 24 ноя 2011 14:32 ] |
| Заголовок сообщения: | Re: Урок 9, Урок 10 |
MagicWolf Это все и так понятно! Я урок читал вообще-то... http://www.gamedev.ru/code/forum/?id=154948 |
|
| Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|