Урок 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; // Вращать сцену влево
}