Pergunta

A inclinação e a rotação que obtemos do SensorManager.getOrientation() do Android são todas para o eixo Y do telefone.Com isso quero dizer que a guinada e a inclinação indicam para onde o eixo Y aponta, e o rolamento é em torno do eixo Y.(e a orientação da minha tela é fixada em paisagem, então o eixo Y não muda).Mas o que eu quero é a inclinação e rotação do eixo Z negativo (pontos em o telefone), mais como se a tela do meu telefone fosse uma janela de paisagem na cabine de um avião, qual seria a inclinação e rotação da guinada?

Foi útil?

Solução

Se bem entendi o que você está dizendo, você está vendo a inclinação e rotação de guinada atuais sendo retornadas como se o eixo +y fosse o vetor 'frontal' padrão e o eixo +z fosse o vetor 'para cima' padrão.Você gostaria de fazer uma transformação de coordenadas de forma que sua guinada, inclinação e rotação sejam calculadas com o eixo -z como o vetor 'frontal' padrão e o vetor +x como o vetor 'para cima' padrão.

Primeiro, você precisará calcular os vetores frontais e superiores atuais de sua guinada, inclinação e rotação na configuração atual.Isso pode ser feito usando matrizes de rotação 3D:http://en.wikipedia.org/wiki/Rotation_matrix#Rotations_in_três_dimensions

Use o ângulo de guinada para girar em torno de z, inclinar como uma rotação em torno de x e rolar como uma rotação em torno de y.Multiplique essas matrizes e, em seguida, multiplique o vetor frontal (0, 1, 0) e o vetor superior (0, 0, 1) pelo resultado para obter seus novos vetores frontal e superior.

Em seguida, você precisará calcular os novos ângulos de guinada, inclinação e rotação.Yaw é o ângulo entre o vetor frontal projetado no plano yz (defina o valor x como 0) e o vetor -z (0, 0, -1), pitch é o ângulo entre o vetor frontal projetado no plano xz e o - vetor z, e roll é o ângulo entre o vetor ascendente projetado no plano xy e o vetor +x (1, 0, 0).Se deixarmos Fx = a componente x do vetor frontal, Fy ser a componente y, e assim por diante, obteremos:

yaw   = acos ( -z dot (0,  Fy, Fz) ) / sqrt(Fy*Fy + Fz*Fz)
pitch = acos ( -z dot (Fx, 0,  Fz) ) / sqrt(Fx*Fx + Fz*Fz)
roll  = acos ( +x dot (Ux, Uy, 0 ) ) / sqrt(Ux*Ux + Uy*Uy)

Você poderá fazer isso para outros vetores se eu tiver escolhido os errados.

Outras dicas

As convenções dos eixos do corpo usadas no Android não são as mesmas usadas em aeroespacial (por boas razões).O eixo X de um "plano" é equivalente ao eixo "Y" e do dispositivo Android (e da mesma forma x eixo está relacionado ao eixo Y, positivo ou negativo, dependendo das conéditions da Enu Ro Ned).Um bom artigo sobre as convenções de rolo de pitch de Yaw pode ser encontrada aqui, e pode ser um começo para responder a sua pergunta: http://www.sensorplatforms.com/umstandinging-orientation-conventions-mobile-platforms/

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top