Como converter um movimento 2D (do mouse) em um deslocamento ao longo de um eixo 3d?

8

Estou fazendo um pequeno editor de cenas em 3D (que só permite modificar as posições dos objetos).

Cada objeto é desenhado com um eixo X / Y / Z 3d:

insira a descrição da imagem aqui

Como funciona: o usuário escolhe um eixo (X, Y ou Z) clicando com o botão esquerdo do mouse e, enquanto mantém pressionado o botão esquerdo, move o mouse (para mover o objeto na direção do eixo). escolher já está ok, mas eu gostaria de saber que how mucho objeto deve ser traduzido para o eixo selecionado, dependendo do movimento do mouse em 2D.

Por exemplo, nesta figura, selecionar o eixo X e mover o mouse para a esquerda e para a direita deve proporcionar um deslocamento maior do que movê-lo para cima (quase zero para este)

Deve ser muito simples, mas não consigo descobrir.

A entrada deve ser: deslocamento do mouse desde o primeiro clique esquerdo (vetor 2D), vetor de eixo selecionado (vetor 3d), matriz de exibição de modelo / projeção.

Saída: quantidade (flutuante ou dupla)

tigrou
fonte
Você pode comparar a direção em que o usuário está movendo o mouse em relação ao objeto, comparando a orientação do objeto versus a orientação da câmera.
MichaelHouse

Respostas:

5

Como você quer que isso se comporte? Existem diferentes maneiras de fazer isso.

Uma opção simples é simplesmente mover o objeto por um número fixo de unidades espaciais mundiais para cada unidade espacial da tela (pixel, digamos) que o mouse se move.

Outra opção é pegar o vetor de movimento do mouse e projetá-lo no eixo de movimento através das matrizes normais de projeção / câmera. Projete o vetor de movimento do mouse através das matrizes de viewport, projeção e câmera inversas (forneça um Z inicial da distância do plano de visualização próxima; você deve terminar com um deslocamento no plano próximo). Isso fornece o vetor de movimento do mouse no espaço do mundo. Projete esse vetor no eixo desejado. Isso lhe dá o movimento no espaço do mundo. O objeto se moverá para onde o usuário apontou, independentemente da orientação do objeto. Se o eixo for principalmente vertical, é necessário movimento vertical para movê-lo.

Você também pode simplesmente pegar o ponto inicial e final do mouse no espaço da tela, projetar os dois e, a partir disso, calcular o vetor de movimento do espaço mundial. Eu não, mas você pode achar isso mais fácil.

Outra opção é controlar o movimento do mouse, para que movimentos mais rápidos causem maiores compensações.

Usando uma variante da primeira opção, você também pode pegar o ponteiro para que o usuário possa mover continuamente o mouse (pegando-o e recuando). Isso é especialmente popular para controles de rotação e escala.

Sean Middleditch
fonte
Técnica interessante. De qualquer forma, seria bom saber se a técnica RobCurr também é válido (parece-me, mas não há para baixo ou upvotes ...)
tigrou
Enquanto eu lia, ele estava dizendo a mesma coisa que uma opção que eu listei. Calcule os pontos finais projetados e forme um vetor no espaço do mundo, projetando-o no eixo desejado. Ele acabou de listar algumas matemáticas confusas para a projeção vetorial.
Sean Middleditch
0

Eu provavelmente projetaria os pontos finais do eixo selecionado no espaço 2D, subtraí-los para produzir um vetor 2D. Em seguida, pegue o produto escalar do vetor normalizado do movimento 2D do mouse com o primeiro vetor normalizado para determinar a parte do movimento que deve ser aplicada.

Então, basicamente, calcule 2 vetores:

Va = diferença normalizada dos pontos finais projetados do eixo

Vb = vetor normalizado criado a partir do delta do movimento do mouse xey

Va.Vb = | Va || Vb | cos @

Va.Vb / (| Va | Vb |) = cos @ - que é o componente do movimento do mouse que deve ser aplicado ao longo do eixo.

Apenas outra opção.

RobCurr
fonte