Ir ao conteúdo
  • Cadastre-se

C++ Camera Orbital com OpenGL


Posts recomendados

Estou implementando uma camera orbital ao redor de um desenho feito no centro do sistema de referencial universal, estou usando o opengl e a biblioteca glm; eu consegui fazer a camera se aproximar do objeto quando aperto W, porém a aproximação adequada só acontece quando pressiono W e mexo no tamanho da janela, pois se eu não fizer esse ritual a imagem fica toda desalinhada.

 

Acredito que seja algo relacionado a atualização da gluLookAt estou usando glutPostRedisplay após atualizar a posição da camera porém mesmo assim o bug continua, alguém já passou pelo mesmo problema, ou faz ideia de como eu possa resolver

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

@devair1010 aqui está o código com funções responsáveis por alterar o posicionamento da câmera, atualmente apenas a função de avançar está sendo desenvolvida:

 

vec3 olho;
vec3 alvo = {0, 0, 0};
float _raioDaCamera=30;
float _phi = 90;
float _teta = 90;


float Sen (float angulo){
    return sin(angulo*M_PI/180);
}

float Cos (float angulo){
    return cos(angulo*M_PI/180);
}

vec3 convertePCartesiano(float raioCamera, float phi, float teta){

    float x = raioCamera*Sen(phi)*Sen(teta);  //x
    float y = raioCamera*Cos(phi); //y
    float z = raioCamera*Sen(phi)*Cos(teta);  //z

    if(x > 0 && x < 0.0001) x = 0;
    if(y > 0 && y < 0.0001) y = 0;
    if(z > 0 && z < 0.0001) z = 0;

    vec3 vetor (x, y, z);
    return vetor;
}

void updateCamera (float raioCamera, float phi, float teta){
    olho = convertePCartesiano(raioCamera, phi, teta);
    alvo = (-1.0f) * olho;

    gluLookAt(olho.x, olho.y, olho.z, alvo.x, alvo.y, alvo.z, 0, 1, 0);
}

vec3 normalize(const vec3 &vetor){
   float norma = sqrt(pow(vetor.x, 2) + pow(vetor.y, 2) + pow(vetor.z, 2));

   if(norma > 0)
        return vec3(vetor.x/norma, vetor.y/norma, vetor.z/norma);
   return vec3(0, 0, 0);
}

float magnitude (vec3 &vetor){
    return sqrt(pow(vetor.x, 2) + pow(vetor.y, 2) + pow(vetor.z, 2));
}

void avanca(){
    vec3 direcao = alvo;

    direcao = normalize(direcao);
    vec3 velocidade = direcao * (0.25f);
    olho = olho + velocidade;

    _raioDaCamera = magnitude(olho);

    updateCamera(_raioDaCamera, _phi, _teta);
}

void eventoDeTeclado(unsigned char key, int x, int y){
    switch(key){
        case 'q':
        case 'Q':
            exit(0);
            break;
        case '+':
            if(raio < 11.12)
                raio += 0.12;
            break;
        case '-':
            if(raio > 6.32)
                raio -= 0.12;
            break;
        case 'w':
        case 'W':
		avanca();
            break;
        default:
            break;
    }
    glutPostRedisplay();
}

 

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

Bom, como meu conhecimento básico de OpenGL é da versão 3.0 em diante, as chances de dar algum pitaco minimamente útil são pequenas mas vou tentar mesmo assim.
 

Talvez fosse interessante dar uma olhada em todas as chamadas de funções entre updateCamera() e a função que redesenha a imagem, chamada por glutPostRedisplay(). A primeira coisa a investigar é se a matriz criada por gluLookAt() não está sendo modificada sem querer antes da imagem ser atualizada. Por exemplo, um erro muito comum é uma chamada inapropriada da função glLoadIdentity() entre gluLookAt() e a imagem a ser redesenhada na tela. Ou seja, você cria a matriz de projeção e em seguida, sem querer, substitui por uma matriz identidade. Dependendo de como o código estiver organizado pode não ser óbvio que há uma chamada de função modificando a matriz criada por gluLookAt() antes da imagem ser redesenhada.

Então, seria bom ter o código inteiro como bem disse @devair1010.

  • Obrigado 2
Link para o comentário
Compartilhar em outros sites

@V!OLADOR acho que pode ser isso então porque na main eu chamo a função "inicializa()" que carrega as matrizes inclusive a identidade, não sei se ela pode estar sendo chamada durante o loop, mas provavelmente deve ser algo relacionado ao carregamento da matriz identidade logo após alterar a gluLookAt().

 

Não postei o código todo porque ele ta meio desorganizado ainda, e na vdd essas são as únicas funções que atuam diretamente na alteração da câmera, mas eu vou dar mais uma revisada no código e caso não consiga solucionar eu retornarei aqui com o código em íntegra.

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

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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...