Ir ao conteúdo
  • Cadastre-se

Fazer novo desenho sem cancelar anterior, OpenGL


Posts recomendados

Boa tarde, poderiam me dar uma ajuda em OpenGL?

 

Estou tentando fazer um programa para desenhar uma trajetória, com as direções sendo escolhidas pelo usuario,

 

no código que fiz, está tendo um problema, que acho ser devido à glutPostRedisplay(),

faz a primeira linha, mais quando vai fazer a segunda, a primeira é apagada,

tem algo que eu possa fazer para não cancelar a linha anterior?

 

 

 

#include<iostream>using namespace std;#include <glut.h>#include<math.h>#include <conio.h>#include "iostream"GLfloat gfPosX = 0.0;GLfloat gfDeltaX = .0001;GLfloat x=0.4;GLfloat y=0.4;GLfloat abc=0.0;GLfloat var=.000001;double graus;void Draw() {glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0, 1.0, 1.0);glBegin(GL_LINES);//Dif//glVertex3f(gfPosX, 0.25, 0.0);//glVertex3f(1.0 - gfPosX, 0.75, 0.0);//double graus;//graus = 30;double rad = (graus*3.1415926)/180;glVertex3f(x, y, 0.0); //inicial oblíquoglVertex3f(x+abc, y+abc*tan(rad), 0.0); //var obliquoglVertex3f(x, 0.4, 0.0); //inicial xglVertex3f(x+abc, 0.4, 0.0); //var xif(kbhit()){cin>>graus;x = x+abc;y = y+abc*tan(rad);    }//fim DifglEnd();glFlush();//Seilaabc += var;gfPosX += gfDeltaX;if (gfPosX >= 1.0 || gfPosX <= 0.0){gfDeltaX = -gfDeltaX;}glutPostRedisplay();//fim Seila}void Initialize() {glClearColor(0.0, 0.0, 0.0, 0.0);glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);}int main(int iArgc, char** cppArgv) {graus = 0;glutInit(&iArgc, cppArgv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowSize(500, 500);glutInitWindowPosition(500, 500);glutCreateWindow("XoaX.net");Initialize();cin>>graus;glutDisplayFunc(Draw);glutMainLoop();return 0;}
Link para o comentário
Compartilhar em outros sites

sim..na verdade é por causa de glclear que limpa o buffer de tela toda vez que entra na função,mas isso é nescessario para redesenhar os objetos com as coordenadas atualizadas,porém se voce nao tiver as informações gravadas dos objetos anteriores em algum lugar,vai perde-las

 

acho que a forma mais fácil pra fazer isso seria usar a classe GLFrame que serve realmente só pra segurar as coordenadas x,y,z, a vantagem é que voce pode usar uma unica primitiva pra desenhar todas as coordenadas de cada objeto GLFrame

por exemplo voce pode criar um array de GLFrame,suponha que voce quer desenhar 10 linhas na tela

GLFrame ar[10];int cont = 0;//dentro de uma função,poderia ser algo comovoid exemplo(){ std::cin>>entrada;ar[cont].SetOrigin(//poe as coordenadas de acordo com o que foi passado para um novo objeto,cada vez  entrar na função );for(int i = 0;i<cont ;i++){   //redesenha os objetos que ja foram criados(pega a matriz do objeto GLFrame e passa pro shader para a //primitiva desenhar,usa um shader que permita matriz de transformação)    linhas.draw();}cont ++}

essa classe geralmente é usada com GLMatrixStack pra movimentação de atores com matrizes de transformação,mas tambem pode ser usada dessa forma,é só os valores dos vértices nao mudarem

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...