Может ли кто-нибудь проверить правильность моей логики?

Я только начинаю исследование opengl, я собираюсь опубликовать сегмент кода и объясню свое понимание, не могли бы вы следовать моим объяснениям и указать на какие-либо проблемы?

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity();   //start with an identity matrix

glPushMatrix();  
//push the current identity matrix onto the stack, and start with a new identity matrix as 
  the transformation matrix

    glPushMatrix();  
    //copy the current matrix which is the identity as the new transformation matrix and then push the current transformation matrix onto stack

        glScalef(10, 10, 1.0);
        **Question 1**
        //I feels like the order which the image is built is kinda reversed
        //It's like drawSquare happens first, then color, then scale
        //can anyone clarify?
        //Second, the drawsquare defines the 4 vertices around the origin(+/-0.5,+/-0.5)
        //is the origin located at the center of the window by default?
        //what happen when it is scaled? does point (0.5,0.5) scaled to (5,5)?
        glColor3f(0.0, 1.0, 0.0);
        drawSquare(1.0);
    glPopMatrix(); 
    //forget the current transformation matrix, pop out the one on top of the stack
    //which is the identity matrix

    //In the code below:
    //my understanding is 4 vertices is defined around origin, but is this the same origin?
    //then the unit square is moved just below the X-axis
    //and the 4 vertices are scaled one by one?
    //ex: (0.5,0) -> (1,0)  (0.5,-1) -> (1,-2)
    glScalef(2, 2, 1.0);
    glTranslatef(0.0, -0.5, 0.0);
    glColor3f(1.0, 0.0, 0.0);
    drawSquare(1.0);
    //last question, if I want to make the second square rotate at a point along z-axis
    //do I have to specify it here? 
    //for example: add glRotatef(rotate_degree, 0.0, 0.0, 1.0); above the glScalef(2, 2, 1.0);
    //such that later i can change the value in the rotate_degree?

glPopMatrix(); //forget about the current transformation matrix, pop out the top matrix on the stack.
0
nl ja de
@FelixK. не могли бы вы объяснить, что такое фиксированный конвейер функций?
добавлено автор fiftyplus, источник
@FelixK. да, есть современный способ и старый способ ... но для цели обучения это более прямолинейно, вы могли бы просто погладить старый стиль ... и просто дайте мне знать, если мое понимание ошибочно. Независимо от современного способа или старого пути, математическая концепция должна быть такой же, не так ли?
добавлено автор fiftyplus, источник
@fiftyplus: все матричные функции, встроенные в OpenGL. Они устарели. Современный OpenGL - это все о шейдерах и шейдерах, которые получают их как «Matrices-Ready-to-Eat» в форме униформы. Библиотеки, такие как GLM, Eigen или linmath.h (последнее - мое творение), помогают вам создавать матрицы.
добавлено автор datenwolf, источник
Не используйте конвейер с фиксированной функцией, это первое недоразумение.
добавлено автор Felix K., источник
Посмотрите мой первый комментарий моего ответа: stackoverflow.com/questions/14573079/& hellip;
добавлено автор Felix K., источник

1 ответы

То, что порядок операций представляется инвертированным, исходит из того, что матрицы являются некоммутативными и правыми ассоциативными при умножении на векторы столбцов. Предположим, что в пространстве модели есть вектор столбца позиции ↑ p . Чтобы привести его в мировое пространство, вы умножаете его на матрицу M , т. Е.

↑p_world = M · ↑p

Обратите внимание, что вы не можете изменить порядок операций! Столбечные векторы совпадают с ключом в матрицах, а ключ вписывается в матричный замок справа.

На следующем шаге вы хотите преобразовать в пространство просмотра, используя матрицу V , чтобы писать

↑p_view = V · ↑p_world

но это вы можете заменить

↑p_view = V · M · ↑p

Но, конечно, если у вас есть много ↑ p -s, которые вы хотите сохранить при вычислениях, поэтому вы сжимаете эти две матрицы M и V в одну матрицу, которую вы вызываете моделью. И когда вы создаете модельное представление с OpenGL, вы строите его так:

MV = 1
MV = MV · V
MV = MV · M

Из-за правильной ассоциативности умножения матрицы столбцов первое преобразование, примененное к вектору, является последним, умноженным на стек.


Обратите внимание, что при использовании математической матрицы порядка row элементы становятся левыми ассоциативными, т. Е. Все происходит в том порядке, в котором вы их пишете. Но правильная ассоциативность по порядку столбцов невероятно полезна, так как делает иерархии построения ветвящихся преобразований намного проще.

1
добавлено
Я c, возможно, мне стоит изучить, почему правильная ассоциативность настолько полезна ...
добавлено автор fiftyplus, источник
@fiftyplus: Я предлагаю вам подумать о том, как вы будете оживлять солнечную систему. Начните с центральной звезды, затем нарисуйте планету, луны каждой планеты и так далее. Для каждого тела вы основываетесь на преобразованиях, применяемых к предыдущим этапам в цепочке трансформации. Если вы следуете за цепочкой star-planet-moon, преобразования умножаются точно в таком порядке с правильным ассоциативным умножением.
добавлено автор datenwolf, источник
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

pro.graphon (and gamedev)
pro.graphon (and gamedev)
389 участник(ов)

Обсуждаем стандарты консорциума Khronos: OpenGL, OpenCL и пр., предлагаем различные работы, туторы, интересные материалы по этим стандартам (и помечаем их тегами). Правила чата и инфо по системе тегов – /rules. Реклама только по согласованию с @AlexFails.

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest