Título praticamente diz tudo. Estou trabalhando em um projeto simples 'vamos nos acostumar com o lwjgl' envolvendo a manipulação de um cubo de rubik, e não consigo descobrir como saber de que lado / quadrado o usuário está apontando.
9
Respostas:
Você vai querer usar a seleção 3D. Aqui está um código que eu uso no meu jogo.
Primeiro, lancei um raio da minha câmera. Estou usando o mouse, mas se você estiver usando apenas para onde o usuário está olhando, basta usar o centro da janela. Este é o código da minha classe de câmera:
Então eu sigo o raio até ele se cruzar com um objeto, você pode fazer isso com caixas delimitadoras ou algo semelhante, já que isso é específico para o seu jogo, eu vou deixar você lidar com isso. Geralmente, isso é feito seguindo o raio para fora (adicionando a direção do raio ao ponto de partida várias vezes até que você esbarre em algo).
Em seguida, você deseja ver qual face está sendo escolhida, iterando sobre os triângulos em seu cubo para ver se o raio os intercepta. A função a seguir faz isso e retorna a distância para o rosto escolhido, então apenas uso o rosto cruzado mais próximo da câmera (para que você não escolha o rosto de trás).
O triângulo com a menor distância é o triângulo escolhido. Além disso, plug descarado para o meu jogo, você deve conferir, segui-lo e votar nas pesquisas que eu ocasionalmente publico. Obrigado! http://byte56.com
fonte
A técnica que você está procurando é chamada de "picking" ou "picking 3D". Há várias maneiras de o fazer; um dos mais comuns é transformar um ponto 2D na tela em espaço ocular usando o inverso da transformação da projeção. Isso permitirá que você gere um raio no espaço de visualização, que você pode usar para testar a colisão com a representação física de seus vários bits da geometria da cena para determinar qual objeto o usuário 'bateu'.
Você também pode usar um "buffer de picking" (ou "buffer de seleção") que o GL tenha suporte. Isso basicamente envolve escrever um identificador de objeto exclusivo em um buffer para cada pixel e simplesmente testar esse buffer.
O FAQ do OpenGL tem breves discussões sobre ambos (ele se concentra mais no buffer de seleção, pois esse é um recurso GL; a seleção de raios é independente da API, exceto talvez para extrair as matrizes ativas do pipeline). Aqui está um exemplo mais específico da técnica de seleção de raios (para iOS, mas deve ser traduzida com bastante facilidade). Este site possui algum código fonte para alguns dos exemplos do OpenGL Red Book portados para o LWJGL, que incluem uma demonstração de picking.
Veja também esta pergunta no SO.
fonte