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!

Anônimo anônimo
fonte
+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)

jheriko
fonte
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