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!
Respostas:
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)
fonte