Pergunta

Estou tendo um problema de pensamento e pesquisa aqui e não consigo encontrar a boa direção para olhar...Estou procurando desenvolver um algoritmo para mover uma imagem 360 (semelhante a uma esfera) usando o movimento do dispositivo.

Assim, se o usuário apontar o dispositivo para sua frente ele obterá o ponto de origem determinado da imagem.À medida que ele move o dispositivo ao seu redor, a imagem panorâmica se move de acordo com ele.

Alguma ideia ou fonte que eu possa pesquisar?

Obrigado e boa sorte a todos com Swift :)

Foi útil?

Solução

Eu vejo duas maneiras fáceis de implementar isso sem muito aborrecimento de matemática:

    .
  1. use ângulos Euler, ou seja, o Propriedade de rolo de CMattitude . Defina um mapeamento entre a largura da imagem e o ângulo medido e cuide da singularidade a 180 ° / -180 °. Desvange dessa abordagem:
    • Perigo possível de bloqueio gimbal Quando os usuários começam a mover seus dispositivos de forma caótica.
    • O mesmo se aplica à extensibilidade em relação a uma visão 3D completa.
  2. use o campo magnético da cmDevicemotion O que é robusto contra o bloqueio gimbal. O magnetômetro é um pouco mais lento que o acelerômetro / giroscópio, mas acho que o algoritmo de fusão da Coremotion fornecerá uma estimativa razoável para que este não seja o ponto. Dicébacks aqui:
    • campo magnético nem sempre está disponível ou tende a ser slighlty imprecise.
    • estendendo-o para a visão 3D pode ser um incômodo.
  3. Ambas as abordagens devem ser bem fáceis de implementar e, portanto, eu começaria com um deles. Se você quer ter uma solução mais sofisticada, precisará mergulhar um pouco mais fundo na matemática. Neste caso, uma solução PPOScible pode ser para usar o dispositivo atual normal (s. Por exemplo Encontrar o vetor normal para o dispositivo iOS ), projete-o no plano da Terra Sufície e pegue o delta dos ângulos para o panorama cilíndrico.

    A projeção esfera é ainda mais fácil neste caso, pois você pode usar o vetor nomal diretamente.

Outras dicas

Graças à Kay pude estar no caminho certo para alcançar esse efeito.

Estou fazendo esta resposta apenas para fornecer mais detalhes para quem procura a mesma coisa.

Primeiro você precisa criar um objeto CMMotionManager.

Em seguida, use startDeviceMotionUpdatesToQueue para lidar com eventos de movimento.

[self.motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMDeviceMotion *motion, NSError *error) {
    [self processMotion];
}];

No processMotion você só precisa obter a atitude baseada na anterior:

// Get attitude difference with previous one
CMAttitude *currentAttitude = self.motionManager.deviceMotion.attitude;
[currentAttitude multiplyByInverseOfAttitude:self.referenceAttitude];

Graças a isso você conhece o novo ângulo feito pelo usuário desde a última atualização.Então, onde você manipula sua visualização, você converte o novo ângulo de Euler na quantidade de pixels necessária para mover sua imagem.Apenas tome cuidado. O ângulo de Euler varia entre -180, 180 e é fornecido em rad pela Apple.Isso pode ser útil:

#define RADIANS_TO_DEGREES(radians) ((radians) * (180.0 / M_PI))

Então, no meu caso, apenas calculo o novo deslocamento x porque estou apenas me movendo no eixo x.

Espero que isto ajude.

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