4
rotação Trabalho 3 Pablo Bioni

rotação

  • Upload
    erasto

  • View
    42

  • Download
    6

Embed Size (px)

DESCRIPTION

rotação. Trabalho 3 Pablo Bioni. Implementação do Arcball - PowerPoint PPT Presentation

Citation preview

Page 1: rotação

rotaçãoTrabalho 3 Pablo Bioni

Page 2: rotação

Implementação do Arcball

O Arcball é uma maneira muito intuitiva e amplamente utilizada pelos principais softwares de visualização 3D como o 3DSMAX, a idéia é que vc consiga rotacionar um objeto arrastando o mouse sobre uma esfera virtual. Quando o Mouse é clicado é gerado um ponto inicial e ao arrastar o mouse, é gerado o vetor para rotação desse objeto. O que estamos na verdade tentando conseguir portanto é um arco de rotação através da interação entre o operador e o mouse, com isso conseguimos 2 pontos em relação ao nosso observador.

A Rotação pode ser feita através de quatérnios ou matriz de rotação conforme algoritmo a frente exibido.

O uso do Arcball evita o inconveniente problema de gimbal lock em que o objeto perde completamente o sentido de orientação quando um limiar de eixo é atingido.

Uma vantagem de se utilizar o quaternio é conseguir interpolação entre posições de forma muito suave e agradável com pouco esforço. Utilizando o Quaternio o objeto roda o dobro do que com matriz, desta forma criou-se um botão extra chamado “Equalize rotations” que faz com que a Matriz de rotação gire o mesmo que o quatenio.

Page 3: rotação

Quat arcballRotQuat(Arcball *arc, int x0, int y0, int x1, int y1) { /* IMPLEMENTE O ARCBALL RETORNANDO O QUATERNIO DE ROTACAO ATUALIZE TAMBEM OS EIXOS ex, ey e ez DO ARCBALL */

//Vector p0 = screenToSphere(arc,arc->downx,arc->downy);Vector p0 = screenToSphere(arc,x0,y0);Vector p1 = screenToSphere(arc,x1,y1);

arc->qdrag = arcballQuatFromPoints(p0,p1);arc->qnow = algQuatMult(arc->qdrag,arc->qstart);arc->qstart = arc->qnow;arc->prevRot = algQuatToMatrix(arc->qstart);

arc->ex = algQuatRotVec(arc->qnow,arc->ex);arc->ey = algQuatRotVec(arc->qnow,arc->ey);arc->ez = algQuatRotVec(arc->qnow,arc->ez);

return arc->qnow;

}

Page 4: rotação

Matrix arcballRotMatrix(Arcball* arc, int x0, int y0, int x1, int y1){

/* Faca aqui uma implementacao semelhante ao Arcball, com a diferenca que retorne uma

Matriz de rotacao que rode exatamente o arco do mouse*/

Matrix currRot;Vector p0 = screenToSphere(arc,x0,y0);Vector p1 = screenToSphere(arc,x1,y1);

Vector axis = algCross(p0,p1);double cos,sin;

cos = algDot(p0,p1);

if(arc->equalize_matrix_quat){

cos = 2 * (cos * cos) - 1;}sin = sqrt(1 - (cos * cos));

currRot = algMatrixRotateCS(cos,sin,axis.x,axis.y,axis.z);arc->prevRot = algMult(currRot,arc->prevRot);arc->qstart = algQuatFromMatrix(arc->prevRot);

return arc->prevRot;}