Operações básicas pra se programar jogos

Cada tipo de jogo requer obviamente um conjunto básico de operações.
A maioria requer o tratamento mínimo de→

● Sistema cartesiano (2D e 3D)
● Escala, rotação, translação de primitivas e modelos
● Vetores
● Ângulo entre vetores
● Normal/perpendicular a um plano
● Posicionamento da câmera
● Trajetória de tiros
● Detecção e reação de colisão
● Perseguição de oponentes
● Seleção, recorte, fôrma (stenciling)
● Reflexão, espelhamento
● Texturização
● Iluminação de modelos


Especificamente pra ambiente 3D→

● Nódulos
● Mapas, mundos, modelos, skyboxes, billboards, Curvas de Bezier
● Esqueletização
● Formatos .x, .md2, .bsp, .dbo




Ângulo entre 2 vetores em 2D

A figura abaixo mostra uma nave posicionada em O que aponta pra A.
Se for rotacioná-la de forma a apontar pra D deve-se encontrar o ângulo interno ou o externo.
Nessa situação alfa é o interno e teta é o externo.



O produto escalar pode ser usado pra encontrar o menor ângulo entre dois vetores (ou seja, o ângulo interno).



Essa coisa mal encarada pode ser traduzida pra→
Angulo = ArcCos (ProdutoEscalar (OA; OD) / Modulo (OA)*Modulo (OD))

A característica dela é que retorna um ângulo apenas entre 0º e 180º.
Se um jogo 2D requerer um lança-míssil com capacidade de mapear completamente os oponentes à sua volta (conseguir rotacionar em 360º), será necessário saber a direção do giro.
O determinante indica a orientação entre dois vetores 2D.
Se for um valor positivo, indica que formam um ângulo maior que 0º e menor que 180º. Do contrário, formam um maior que 180º e menor que 360º.



Ou seja→
Direcionamento = OA.x * OD.y  -  OA.y * OD.x

  Ângulo entre dois vetores em 2D  
function Obter_ProdutoEscalar (V1, V2: TPonto2D): TReal;

begin
  Result:= V1.X*V2.X + V1.Y*V2.Y;
end;

function Obter_Modulo (Valor: TPonto2D): TReal;

begin
  with Valor do
    Result:= SqRt (X*X + Y*Y);
end;

function Obter_Determinante (V1, V2: TPonto2D): TReal;

begin
  Result:= V1.X*V2.Y - V1.Y*V2.X;
end;

function Obter_Angulo (V1, V2: TPonto2D): TInteiro;

begin
  Result:= Trunc (RadToDeg (ArcCos (Obter_ProdutoEscalar (V1, V2) / (Obter_Modulo (V1)*Obter_Modulo (V2)))));
  if Obter_Determinante (V1, V2) < 0 then
    Result:= 360-Result;
end;




  Ângulo entre vetores
Multiplicação de vetor por escalar
Módulo dum vetor (Norm)
Produto Escalar (Dot product)
Produto Vetorial (Cross product)
Perpendicular Dot
Signed angle
Vector orientation
LookAt





http://transeberiano.brinkster.net