Qual é a maneira mais fácil de implementar uma câmera de terceira pessoa em C ++ / DirectX9


8

Eu sou muito novo em C ++ e DirectX9 e quero implementar uma câmera de terceira pessoa. Depois de ler sobre as câmeras baseadas em Quaternion, decidi tentar implementá-las. Mas isso realmente me surpreende, então pergunto aqui qual é a maneira mais fácil de implementar uma câmera TP?

Aqui estão as coisas que a câmera deve fazer:

  • Siga as coordenadas armazenadas em um vetor 3D (x, y, z)

  • Girar ao redor do objeto (suave)

  • Talvez algum tipo de 'mola' = Mova lentamente para o Pos normal atrás do Objeto depois de Girar

Peça desculpas pelo meu inglês ruim: eu sou alemão e ainda estou na escola!

Desde já, obrigado!

EDITAR:

Depois de algumas tentativas, eu entendi.

O maior problema que considerei foi a extração correta do vetor "direction" da World-Matrix.

Durante minha pesquisa, encontrei principalmente algo parecido com isto:

D3DXVECTOR3 direction;
direction.x = worldMatrix->_13;
direction.y = worldMatrix->_23;
direction.z = worldMatrix->_33;
D3DXVec3Normalize(&direction, &direction);

Isso não funciona para mim! Em vez disso, fiz o seguinte:

D3DXVECTOR3 direction;
direction.x = worldMatrix->_13;
// Consider the .y after the .z!
direction.z = worldMatrix->_23;
direction.y = worldMatrix->_33;
D3DXVec3Normalize(&direction, &direction);

Para dimensionar:

// The tenfold of the average distance
D3DXVec3Scale(&direction, &direction, 10.0f);

Definindo as posições:

cameraPos = targetPos - direction;
// For a top-view
cameraPos.y = targetPos.y + 5;

Para Rotações, você deve criar uma Matriz mundial temporária (a partir da posição do alvo) e girá-la como quiser e extrair a direção.

A suavização da rotação realmente depende do seu jogo!

Esse tipo de câmera de terceira pessoa é realmente fácil de fazer e funciona!

Realmente MUITO obrigado a "jheriko", que me deu a resposta certa!


+1 para realmente descrever o que você precisa, isso é raro (embora possa ser mais detalhado, por exemplo, o terceiro ponto é confuso - você não estava sugerindo que ele estava girando livremente?).
Wondra 31/10

Sim, ele deve girar livremente, mas eu quero que ele volte lentamente ao ponto na parte de trás do jogador após a rotação!
Anonymous Anonymous

Respostas:


1

O que o ajudará é ter a matriz de transformação para o objeto que você deseja seguir. Você pode extrair o vetor adiante desta matriz - dependendo do seu sistema de coordenadas e do tamanho da matriz, essa será uma das linhas ou colunas com o 4º componente removido (supondo que você use matrizes de transformação 4x4, sem fatores de escala - os fatores de escala são horríveis para várias razões ... mas se você tiver fatores de escala, poderá normalizar a linha / coluna após remover o 4º componente.)

Depois de conseguir isso, você pode posicionar a câmera diretamente atrás do objeto, subtraindo-o da posição do objeto. Para mover a câmera para dentro e para fora, você pode dimensionar o vetor e girar em torno do objeto, você pode fazer uma rotação x e y (ou xz / zy etc., dependendo da mão, etc.) que você aplica a uma cópia da matriz do objeto antes de extrair a direção para frente.

Finalmente, para suavizar o movimento, a solução mais simples é rastrear os desvios e ângulos anteriores e lerp em direção a eles por uma quantidade dependente da taxa de quadros descrita por a ^ (b.dt), em que dt é o tempo delta e a, b são parâmetros que você escolhe. a = 0,9 eb = 30 fornece o efeito de mover 90% para a posição como se você estivesse fazendo isso a cada quadro a 30 qps. isso é chamado de filtro de 'resposta ao impulso infinito' e é um hack clássico para esse tipo de suavização.

isso pode não ser o ideal, você pode escolher uma distância mínima e restringir os ângulos também, caso contrário, a câmera poderá passar pelo objeto. se você estiver dentro de um mundo denso, recortar ou desbotar objetos intervenientes também se tornará importante.

desculpe, isso é longo, mas não é um problema trivial, como você parece ter descoberto.

espero que isto ajude. posso fornecer mais detalhes, se necessário.

(ps não são necessários quaterniões - eles realmente não ajudam nesse problema)


Muito obrigado! Você me deu algumas idéias de como fazer isso. Mas eu apreciaria alguns exemplos de código, se você não se importa. E por que não usar quaternions? Eu li que eles são comumente usados ​​para fazer esse tipo de coisa ( en.wikipedia.org/wiki/Quaternion ).
Anonymous Anonymous

Tentei fazer isso como você descreveu, mas ainda tem alguns problemas. A câmera não está na parte de trás do jogador, provavelmente, mas pelo menos em algum lugar ao lado dele! Não entendo a peça com as rotações X e Y: O que deve ser girado? A matriz mundial, o vetor de direção ou uma cópia do vetor de posição do jogador? E como girar? Espero que possa me ajudar!
Anonymous Anonymous

você gira o vetor de direção ou a matriz da qual o extrai (a matriz de transformação do objeto, não o mundo ou a matriz de visualização) para girar, constrói matrizes de rotação de ângulo de eixo e multiplica-as, ou usa trigonometria ...
jheriko
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.