1 / 4

rotação

rotação. Trabalho 3 Pablo Bioni. Implementação do Arcball

Télécharger la présentation

rotação

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. rotação Trabalho 3 Pablo Bioni

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

  3. 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; }

  4. 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; }

More Related