Girando uma câmera de terceira pessoa em direção a um alvo

10

Eu tenho uma câmera de terceira pessoa que não olha diretamente para o jogador, mas em algum lugar à sua frente.

Quando o usuário entra no modo de disparo, quero que a câmera vire o player para enfrentar o alvo.

exemplo do que estou falando

Na imagem acima. "O" é o jogador (Origem), "L" é a aparência, "C" é a posição da câmera e "T" é o alvo. Quero girar a linha lookat C-> L para que ela passe por T (C '-> L' -> T ') ao redor da origem ("O").

Basicamente, preciso encontrar o ângulo alfa que coloquei em vermelho na imagem.

Eu guardo a posição da minha câmera em uma estrutura como esta:

struct CameraTarget {
     Quaternion absoluteRotation;
     Vec3 absolutePosition;
     Vec3 cameraOffset;
     Vec3 lookatOffset;
     float FOV;
}

Então, se eu pudesse encontrar o ângulo que estou procurando, poderia fazer algo como:

cam->absoluteRotation = cam->absoluteRotation * alpha;

Para fazer com que o jogador sempre olhe para o alvo.

Se o lookat estivesse passando pela Origem, eu poderia simplesmente fazer

Vec3 origDir = cam->lookAtOffset - cam->absolutePosition;
origDir.normalize();
Vec3 newDir = cam->target - cam->absolutePosition;
newDir.normalize();
Quaternion q(origDir, newDir); // from->to
cam->absoluteRotation = cam->absoluteRotation * q;

No entanto, no diagrama acima, isso não funciona muito, pois a rotação é deslocada da Origem.

Matchoc
fonte

Respostas:

1

Respondendo a mim mesmo se ajudar alguém mais um dia:

O SFDKT tem a idéia certa de projetar o ponto de destino na direção atual da câmera.

No entanto, meu maior problema foi encontrar esse ponto P. Aconteceu que um pouco de trigonometria conseguiu resolvê-lo.

Considerando o triângulo formado pelos três pontos do CPO:

  1. Como conheço os comprimentos LO, OC e CL, posso calcular o ângulo em C.

  2. Agora eu sei o ângulo C e o comprimento de OC e PO. Usando a lei dos senos, você pode encontrar o ângulo em O. (achei este site muito útil para encontrar os ângulos ausentes)

  3. Então eu posso encontrar o último ângulo ausente P e usar novamente a lei de Sines para encontrar o comprimento CP.

  4. Pegue a direção do olhar posC + normalized (CL) * lengthCP fornece a posição de P.

  5. Depois de ter o PI, posso calcular a rotação mais curta entre OP e OT, o que me dá o quaternion necessário para girar minha câmera.

Eu tive alguns problemas com o rolo indesejado em 3D, mas resolvi o problema com Z = 0 e calculei a rotação de afinação ausente para manter o vetor ativo da câmera reto.

Matchoc
fonte
0

esta imagem adiciona a simetria necessária para resolver a questão mais facilmente.

insira a descrição da imagem aqui

Apenas projete Lao longo do vetor CLpara que |P-O|=|T-O|.

Agora, obviamente, são apenas dois triângulos idênticos ( CPOe C'TO) rotacionados pelo ângulo desejado. IEang(OT)-ang(OP)

C'e L'são ambos o mesmo que Ce Ldepois de rodar, sobre O, pela mesma quantidade.

DSWFB
fonte