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:
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 much
o 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)
Respostas:
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.
fonte
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.
fonte