Я хочу знать, как потянуть спираль.
Я написал этот код:
void RenderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT);
GLfloat x,y,z = -50,angle;
glBegin(GL_POINTS);
for(angle = 0; angle < 360; angle += 1)
{
x = 50 * cos(angle);
y = 50 * sin(angle);
glVertex3f(x,y,z);
z+=1;
}
glEnd();
glutSwapBuffers();
}
Если я не включаю условия z, я получаю A Perfect Circle, но когда я включаю z, то я получаю 3 точки вот именно. Что, возможно, произошло?
Я установил область просмотра с помощью glviewport (0,0, w, h)
Для включения z, я должен сделать что-нибудь для установки области просмотра в z направлении?
Вы видите точки, потому что вы рисуете их с помощью glBegin (GL_POINTS)
.
Попробуйте заменить его на glBegin (GL_LINE_STRIP)
.
ПРИМЕЧАНИЕ: когда вы увидели круг, вы также нарисовали только точки, но нарисованы достаточно близко, чтобы выглядеть как соединенный круг.
Кроме того, возможно, вы не настроили буфер глубины для приема значений в диапазоне z = [-50, 310], который вы используете. Эти аргументы должны быть представлены как плоскости отсечения zNear и zFar в вашем gluPerspective
, glOrtho ()
или glFrustum ()
.
ПРИМЕЧАНИЕ: это объясняет, почему при значении z вы видите только несколько точек: другие точки обрезаются, потому что они находятся за пределами диапазона z-буфера.
ОБНОВЛЕНИЕ ПОСЛЕ ПОКАЗАНИЯ ВАШЕГО КОД:
glOrtho (-100 * соотношение сторон, 100 * соотношение сторон, -100,100,1, -1);
допускает только z-значения в диапазоне [-1, 1], поэтому будут нарисованы только три точки с z = -1
, z = 0
и z = 1
(таким образом, 3 точки).
Наконец, вы, вероятно, смотрите на спираль сверху, глядя прямо в направлении оси вращения. Если вы используете не перспективную проекцию (а изометрическую), спираль все равно будет отображаться в виде круга. Вы можете захотеть изменить свое представление с помощью gluLookAt ()
.
ПРИМЕР НАСТРОЙКИ ПЕРСПЕКТИВЫ
Следующий код взят из превосходных руководств по OpenGL от NeHe:
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glLoadIdentity(); // Reset The Projection Matrix
// Calculate The Aspect Ratio Of The Window
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glLoadIdentity(); // Reset The Modelview Matrix
Тогда в вашем цикле отрисовки будет выглядеть примерно так:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
glLoadIdentity();
glTranslatef(-1.5f,0.0f,-6.0f); // Move Left 1.5 Units And Into The Screen 6.0
glBegin(GL_TRIANGLES); // Drawing Using Triangles
glVertex3f( 0.0f, 1.0f, 0.0f); // Top
glVertex3f(-1.0f,-1.0f, 0.0f); // Bottom Left
glVertex3f( 1.0f,-1.0f, 0.0f); // Bottom Right
glEnd();
Конечно, вы должны изменить этот пример кода по своему усмотрению.
z = 0
и z = 1
будут нарисованы (то есть 3 точки).
Наконец, вы, вероятно, смотрите на спираль сверху, глядя прямо в направлении ось вращения. Если вы используете не перспективную проекцию (а изометрическую), спираль все равно будет отображаться в виде круга. Возможно, вы захотите изменить свое представление с помощью gluLookAt ()
.
ПРИМЕР НАСТРОЙКИ ПЕРСПЕКТИВЫ
Следующий код взят из превосходных руководств по OpenGL от NeHe:
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glLoadIdentity(); // Reset The Projection Matrix
// Calculate The Aspect Ratio Of The Window
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glLoadIdentity(); // Reset The Modelview Matrix
Тогда в вашем цикле отрисовки будет выглядеть примерно так:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
glLoadIdentity();
glTranslatef(-1.5f,0.0f,-6.0f); // Move Left 1.5 Units And Into The Screen 6.0
glBegin(GL_TRIANGLES); // Drawing Using Triangles
glVertex3f( 0.0f, 1.0f, 0.0f); // Top
glVertex3f(-1.0f,-1.0f, 0.0f); // Bottom Left
glVertex3f( 1.0f,-1.0f, 0.0f); // Bottom Right
glEnd();
Конечно, вы должны изменить этот пример кода по своему усмотрению.
z = 0
и z = 1
будут нарисованы (то есть 3 точки).
Наконец, вы, вероятно, смотрите на спираль сверху, глядя прямо в направлении ось вращения. Если вы используете не перспективную проекцию (а изометрическую), спираль все равно будет отображаться в виде круга. Вы можете захотеть изменить свое представление с помощью gluLookAt ()
.
ПРИМЕР НАСТРОЙКИ ПЕРСПЕКТИВЫ
Следующий код взят из превосходных руководств по OpenGL от NeHe:
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glLoadIdentity(); // Reset The Projection Matrix
// Calculate The Aspect Ratio Of The Window
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glLoadIdentity(); // Reset The Modelview Matrix
Тогда в вашем цикле отрисовки будет выглядеть примерно так:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
glLoadIdentity();
glTranslatef(-1.5f,0.0f,-6.0f); // Move Left 1.5 Units And Into The Screen 6.0
glBegin(GL_TRIANGLES); // Drawing Using Triangles
glVertex3f( 0.0f, 1.0f, 0.0f); // Top
glVertex3f(-1.0f,-1.0f, 0.0f); // Bottom Left
glVertex3f( 1.0f,-1.0f, 0.0f); // Bottom Right
glEnd();
Конечно, вы должны изменить этот пример кода по своему усмотрению.
Если вы используете не перспективную проекцию (а изометрическую), спираль все равно будет отображаться в виде круга. Вы можете захотеть изменить свое представление с помощью gluLookAt ()
.
ПРИМЕР НАСТРОЙКИ ПЕРСПЕКТИВЫ
Следующий код взят из превосходных руководств по OpenGL от NeHe:
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glLoadIdentity(); // Reset The Projection Matrix
// Calculate The Aspect Ratio Of The Window
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glLoadIdentity(); // Reset The Modelview Matrix
Тогда в вашем цикле отрисовки будет выглядеть примерно так:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
glLoadIdentity();
glTranslatef(-1.5f,0.0f,-6.0f); // Move Left 1.5 Units And Into The Screen 6.0
glBegin(GL_TRIANGLES); // Drawing Using Triangles
glVertex3f( 0.0f, 1.0f, 0.0f); // Top
glVertex3f(-1.0f,-1.0f, 0.0f); // Bottom Left
glVertex3f( 1.0f,-1.0f, 0.0f); // Bottom Right
glEnd();
Конечно, вы должны изменить этот пример кода по своему усмотрению.
Если вы используете не перспективную проекцию (а изометрическую), спираль все равно будет отображаться в виде круга. Возможно, вы захотите изменить свое представление с помощью gluLookAt ()
.
ПРИМЕР НАСТРОЙКИ ПЕРСПЕКТИВЫ
Следующий код взят из превосходных руководств по OpenGL от NeHe:
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glLoadIdentity(); // Reset The Projection Matrix
// Calculate The Aspect Ratio Of The Window
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glLoadIdentity(); // Reset The Modelview Matrix
Тогда в вашем цикле отрисовки будет выглядеть примерно так:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
glLoadIdentity();
glTranslatef(-1.5f,0.0f,-6.0f); // Move Left 1.5 Units And Into The Screen 6.0
glBegin(GL_TRIANGLES); // Drawing Using Triangles
glVertex3f( 0.0f, 1.0f, 0.0f); // Top
glVertex3f(-1.0f,-1.0f, 0.0f); // Bottom Left
glVertex3f( 1.0f,-1.0f, 0.0f); // Bottom Right
glEnd();
Конечно, вы должны изменить этот пример кода по своему усмотрению.