40 likes | 112 Views
rotação. Trabalho 3 Pablo Bioni. Implementação do Arcball
E N D
rotação Trabalho 3 Pablo Bioni
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.
QuatarcballRotQuat(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; }
MatrixarcballRotMatrix(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; }