OpenGL GL_TRIANGLE_STRIP; по-видимому, не приводит к тому, что координата Z влияет на рисование

63
10

Я пытаюсь нарисовать строку, используя GL_TRIANGLE_STRIP, которая будет глубже или более мелкой с координатой z, но значение z, которое я передаю в glVertex3f(), похоже, не влияет на воспринимаемую ширину. В приведенном ниже коде (модифицированный пример из Руководства по программированию OpenGL) линия должна начинаться ближе к перспективе (более крупная) и проходить дальше (меньше).

Не могли бы вы указать на мою ошибку или тему, в которой это адресовано?

void init(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
}
void display(void)
{
GLdouble gran = 5.0;
GLdouble width = 7.0;
GLdouble theta = 1.047197551;
GLdouble halfPi = 3.1459/2;
GLdouble refpx = 50.0;
GLdouble refpy = 50.0;
GLdouble startr = 1.0;
GLdouble startg = 1.0;
GLdouble startb = .5;

glClear(GL_COLOR_BUFFER_BIT);

//glLoadIdentity();
//glScalef(2.0, -.5,1.0);
//glRotatef(45.0, 0.0, 0.0, 1.0);

glBegin(GL_TRIANGLE_STRIP);

for(int i = 0; i < 40; i++)
{
glColor3f(startr / i, startg / (20 - (i%20)), startb);

GLdouble x1 = refpx + width*cos(theta + halfPi);
GLdouble x2 = refpx + width*cos(theta + halfPi*3);
GLdouble y1 = refpy + width*sin(theta + halfPi);
GLdouble y2 = refpy + width*sin(theta + halfPi*3);

glVertex3f(x1,y1, (GLdouble)i/40.0);
glVertex3f(x2,y2, (GLdouble)i/40.0);

refpx += gran*cos(theta);
refpy += gran*sin(theta);
if(i % 9 == 0) {
theta += halfPi/8;
}
if(i == 20) {
theta -= halfPi/2;
}
if(i == 5) {
theta -= halfPi/2;
}
}
glEnd();
glDisable(GL_BLEND);
glFlush();
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, (GLdouble) w, 0.0, (GLdouble) h, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
}

int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(450, 450);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}

спросил(а) 2021-01-19T17:16:32+03:00 2 месяца, 3 недели назад
1
Решение
62

Вы устанавливаете матрицу проекций только на орфографический вид. Это означает, что изменения на расстоянии от камеры не будут влиять на размер объекта на экране.

В перспективной проекции далеко все меньше, что неверно для орфографической проекции.

Таким образом, в ваших вычислениях вершины координата Z управляется i, но не X и Y, они контролируются только тригонометрией и, в частности, при изменении refpx и refpy размер объекта в плоскости XY никогда не делает ( потому что единственное изменение - это sin или косинусный член, добавленный к значениям refpx и refpy).

Поэтому почему: он не может меняться, потому что у вас нет ничего в математике, которая вычисляет координаты X и Y, которые изменяют размер по расстоянию. Сам по себе Z не будет иметь никакого значения для размера на экране, если вы не установите преобразование перспективы в матрицу проекции. Используйте gluPerspective для облегчения или gluPerspective собственную матрицу камеры, математика здесь: http://en.wikipedia.org/wiki/3D_projection#Perspective_projection

ответил(а) 2021-01-19T17:16:32+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема