1

Тема: GLUT. Своя MODELVIEW матриця для кожного об'єкту.

Привітульки-тульки-тульки.
Як я розумію матрицю MODELVIEW:

Прихований текст

http://не-дійсний-домен/bBN1s/eadb5661a0.png

  • Коли в сцені з'являється об'єкт, то він стоїть в нульових координатах

  • Для того, аби зрушити його кудись, ми завантажуємо матрицю виду, як в картинці під спойлером,
    де замість x y z ставимо компоненти потрібної позиції об'єкту, та множимо цю матрицю на позицію кожного вертексу об'єкту

  • У кожного об'єкту є своя матриця MODELVIEW, адже ми хочемо ставити різні об'єкти в різних місцях

Питаннячко:

  • Як в GLUT зробити свою матрицю для кожного об'єкту?

Ось код функції, котра малює об'єкти

void display(void) {
    glClear(GL_COLOR_BUFFER_BIT); 
    glColor3f(1.0, 1.0, 1.0); 
    glMatrixMode(GL_MODELVIEW);//кажемо, що зараз працюємо з MODELVIEW
    //Очистити матрицю 
    glLoadIdentity();
    //Видова трансформація (камера) 
    gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0); 
    //Модельна трансформація 
    glRotated(angle, 0, 1, 0); // змінюємо кут об'єкту
    glRotated(90, 1, 0, 0);
    glScaled(scale, scale, scale); // масштабуємо
    glutWireSphere(1, 15, 15); // малюємо сферу
    glutWireCube(2); // малюємо куб
    glutSwapBuffers();
    glFinish();
} 

Як ви вже зрозуміли, куб та сфера мають однакові матриці. Тобто вони стоять в одній позиції та під одним кутом.
Як зробити, аби в куба була своя матриця?

2

Re: GLUT. Своя MODELVIEW матриця для кожного об'єкту.

glPushMatrix() і glPopMatrix() в поміч

Отут є приклад

3

Re: GLUT. Своя MODELVIEW матриця для кожного об'єкту.

0x9111A написав:

glPushMatrix() і glPopMatrix() в поміч

Отут є приклад

Так от я теж почав їх юзати відразу, але не спрацювало.
Ту купу російської мови радьте першокурсникам, а мені поясніть, як воно робе.

От я думав так -
завантажуємо матрицю, обнуляємо її там, ну типу лоад айдентеті. Після цього викликаємо

glPushMatrix()

тим самим зберігаємо поточну матрицю в стек
далі робимо певні штуки дрюки з поточною матрицею та приміняємо її до сфери. А далі викликаємо

glPopMatrix()

тим самим дістаємо матрицю до виконання дій по її зміненю, ну і далі робимо з нею, що хочемо.
Що я не так зрозумів?

4 Востаннє редагувалося 0x9111A (16.09.2014 23:11:30)

Re: GLUT. Своя MODELVIEW матриця для кожного об'єкту.

Та наче все правильно зрозумів
Що не спрацювало?

5

Re: GLUT. Своя MODELVIEW матриця для кожного об'єкту.

0x9111A написав:

Та наче все правильно зрозумів
Що не спрацювало?

Ну, якщо от так зробити. То кубика не видно

void display(void) {
    glClear(GL_COLOR_BUFFER_BIT); 
    glColor3f(1.0, 1.0, 1.0); 
    glMatrixMode(GL_MODELVIEW);
    //Очистити матрицю 
    glLoadIdentity(); 
    //Видова трансформація (камера) 
    gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0); 
    //Модельна трансформація 
    glRotated(angle, 0, 1, 0);
    glRotated(90, 1, 0, 0);
    glScaled(scale, scale, scale);
    glutWireSphere(1, 15, 15);

    glPushMatrix();

    glLoadIdentity();
    glColor3f(1, 1, 0);
    glutWireCube(2);

    glPopMatrix();

    glutSwapBuffers();
    glFinish();
} 

А якщо забрати

glLoadIdentity();

після

glPushMatrix();

, то кубик крутиться і все робить те саме, що й сфера. Тобто, як я розумію, штука типу state machine відноситься навіть до функцій glTranslated і т.д.
Бо якщо після

glPushMatrix();

не ставити

glLoadIdentity();

, а додати якусь дію з поворотом, позицією, або масштабуванням, то ця дія додається до попередніх дій, котрі мали б примінятись лише до сфери, але ці, нові дії приміняються тільки до куба. Ну ви зрозуміли, ага?
Як відмінити попередні функції для переміщення і т.д.?

6

Re: GLUT. Своя MODELVIEW матриця для кожного об'єкту.

о, я вже розібрався, не знаю, чому не можна просто завантажити одиничну матрицю перед малюванням якогось об'єкту, але можна в самому початку запихнути цю матрицю в стек, і витягати перед малюванням об'єкта. от так працює

void display(void) {
    glClear(GL_COLOR_BUFFER_BIT); 
    glColor3f(1.0, 1.0, 1.0); 
    glMatrixMode(GL_MODELVIEW);
    //Очистити матрицю 
    glLoadIdentity(); 
    //Видова трансформація (камера) 
    gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0); 
    glPushMatrix();
    //Модельна трансформація 
    glRotated(angle, 0, 1, 0);
    glRotated(90, 1, 0, 0);
    glScaled(scale, scale, scale);
    glutWireSphere(1, 15, 15);

    glPopMatrix();
    glColor3f(1, 1, 0);
    glutWireCube(2);

    glutSwapBuffers();
    glFinish();
} 
Подякували: 0xDADA11C71

7 Востаннє редагувалося 0x9111A (16.09.2014 23:33:29)

Re: GLUT. Своя MODELVIEW матриця для кожного об'єкту.

Спробуйте так, нажаль зараз сам неможу перевірити

void display(void) {
    glClear(GL_COLOR_BUFFER_BIT); 
    glColor3f(1.0, 1.0, 1.0); 
    glMatrixMode(GL_MODELVIEW);
    //Очистити матрицю 
    glLoadIdentity(); 
    //Видова трансформація (камера) 
    gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0); 
    
    //працюєте(крутите-вертите) зі сферою
    glPushMatrix();
    glRotated(angle, 0, 1, 0);
    glRotated(90, 1, 0, 0);
    glScaled(scale, scale, scale);
    glutWireSphere(1, 15, 15);
    glPopMatrix(); //повернення до попереднього стану
    //працюєте з кубом, всі трансформації відносно початку координат, нічого спільного з сферою не мають
    glColor3f(1, 1, 0);
    glutWireCube(2);
    glutSwapBuffers();
    glFinish();
} 

..
ну ви зрозуміли вже й без мене  :)
взагалі це було написано по тому лінку що я спочатку кинув

Подякували: FakiNyan1

8

Re: GLUT. Своя MODELVIEW матриця для кожного об'єкту.

FakiNyan написав:

о, я вже розібрався, не знаю, чому не можна просто завантажити одиничну матрицю перед малюванням якогось об'єкту, але можна в самому початку запихнути цю матрицю в стек, і витягати перед малюванням об'єкта.

Справа в тому що сила пуш\поп в тому що їх можна робити вкладеними. Це дозволяє використовувати відносні координати і перетворення, що зачасту зручніше.