Estou em uma aula de multimídia na faculdade e estamos "aprendendo" o OpenGL como parte da aula. Estou tentando descobrir como a câmera OpenGL vs. modelview funciona e, por isso, encontrei este exemplo. Estou tentando portar o exemplo para Python usando as ligações do OpenGL - ele inicia o OpenGL muito mais rápido, portanto, para fins de teste é muito melhor -, mas continuo com um erro de estouro de pilha com o glPushMatrix neste código:
def cube():
for x in xrange(10):
glPushMatrix()
glTranslated(-positionx[x + 1] * 10, 0, -positionz[x + 1] * 10); #translate the cube
glutSolidCube(2); #draw the cube
glPopMatrix();
De acordo com essa referência , isso acontece quando a pilha da matriz está cheia.
Então pensei: "bem, se estiver cheio, deixe-me tirar a matriz do topo da pilha e haverá espaço". Eu modifiquei o código para:
def cube():
glPopMatrix()
for x in xrange(10):
glPushMatrix()
glTranslated(-positionx[x + 1] * 10, 0, -positionz[x + 1] * 10); #translate the cube
glutSolidCube(2); #draw the cube
glPopMatrix();
E agora recebo um erro de buffer underflow - o que aparentemente acontece quando a pilha tem apenas uma matriz.
Então, eu estou apenas fora da base no meu entendimento? Ou existe alguma maneira de aumentar o tamanho da pilha da matriz?
Além disso, se alguém tiver algumas boas referências (online) (exemplos, etc.) para entender como as matrizes de câmera / modelo funcionam juntas, eu agradeceria sinceramente!
Obrigado!
EDITAR:
Aqui está a pasta do código completo: http://pastebin.com/QXxNisuA
Respostas:
Editado para adicionar: isso não é importante por enquanto, pois ainda funcionará bem e facilita o aprendizado do OpenGL, mas observe que todo o sistema de pilha de matrizes está obsoleto no OpenGL 3.xe além. Uma possível substituição é o GLM .
O código no seu pastebin nem sequer funciona para mim.
Em particular, seus índices de lista na função de exibição estão fora do intervalo (sua lista possui 10 elementos: as listas python começam em 0; você indexa de 0 + 1 a 10 + 1).
Eu acho que você também tinha alguns globais ausentes na função de manipulação do mouse, mas isso poderia ser de mim movendo o código na tentativa de pelo menos fazê-lo parecer com python;)
De qualquer forma, com essas correções, o código mostrado abaixo FUNCIONA PARA MIM, sem sinais de pilha de matriz GL sob / excedente!
fonte
O OpenGL pode armazenar e restaurar matrizes em uma pilha usando
glPushMatrix
eglPopMatrix
. É muito importante que cada push tenha um pop correspondente - se você pressionar mais do que pop, será informado quando todo o desenho terminar que você está transbordando a pilha. Se você estourar mais do que empurra, será informado imediatamente que está sobrecarregando a pilha. É assim que o OpenGL permite localizar erros de programação.Portanto, verifique se todos os toques em todos os lugares têm um pop correspondente.
Em todos os lugares que você pressiona, verifique se há um pop correspondente na saída desse bloco de código.
Se seu código está lançando uma exceção (ou seja, sua iteração fora dos limites em sua matriz?), Pode ser que você precise colocar o pop em um bloco finalmente, por exemplo:
fonte