Estou tentando entender a aritmética vetorial (e especificamente seu uso no mecanismo Unity). Eu não sou capaz de descobrir como um vetor pode ter um comprimento (magnitude), mesmo que ele represente apenas um ponto (posição e direção)?
Isso significa que a magnitude é simplesmente a sua distância do ponto de origem (0, 0, 0)? Ou eu estou esquecendo de alguma coisa?
Normalized
no contexto significa um novo vetor que preserva oDirection
mas temMagnitude
de 1. Ou seja, oNormalized
vetor é criado escalando o vetor original.Respostas:
A resposta tl; dr pode ser: Sim, você pode imaginar assim.
Mas não tenho certeza se isso pode não levar a um entendimento errado.
Um vetor não é um ponto, e há uma diferença crucial entre os dois!
O fato de um vetor geralmente ser representado como uma "seta" pode dar uma impressão errada. De fato, um vetor não é uma única seta. Seria mais preciso dizer que um vetor é o conjunto de todas as setas que têm o mesmo comprimento e direção . (A seta que normalmente é pintada é apenas um representante de todas essas setas). Mas não quero ir muito longe nos detalhes chatos da matemática aqui.
Mais importante, há uma diferença crucial entre um ponto e um vetor, que se torna óbvio na programação gráfica quando você transforma o ponto ou o vetor. Não estou familiarizado com o Unity, mas, olhando rapidamente para a documentação, eles estão modelando a diferença mais importante entre um ponto e um vetor na
Matrix4x4
classe. Tem duas funções diferentes:Matrix4x4.MultiplyVector
eMatrix4x4.MultiplyPoint
A diferença é, grosso modo, que um vetor não é traduzido, enquanto um ponto é. Imagine a seguinte matriz 4x4:
Ele descreve uma tradução sobre (1,2,3). Agora, quando você tiver o seguinte pseudocódigo
Então
tp
será (3,4,5), enquantotv
ainda será (2,3,4). A conversão de um vetor não o altera (porque, como mencionado acima, é o conjunto de todas as setas com a mesma magnitude e direção).O fato de o Unity usar a
Vector3
classe para vetores e pontos é legítimo, mas pode ser confuso. Outras bibliotecas diferenciam dedicadamente entrePoint3D
eVector3D
, às vezes com uma base comum comoTuple3D
.fonte
A vector is, in fact, not a single arrow
, você está certo, representando o Vector3 como uma única seta é exatamente o que me confundiu. +1 por mencionar esta frase crítica.vector
significar matriz ou múltiplo! Em C ++, você pode ter um,std::vector<Vector3>
por exemplo. Avector
deVector
s.É exatamente isso.
Entre outras coisas, um vetor pode representar um ponto (uma posição), uma direção e / ou uma velocidade, dependendo do contexto.
Se você possui esta variável:
Geralmente representa apenas a posição, ou seja, onde está localizado no espaço 3D.
Se você possui esta variável:
Geralmente representa a direção. Normalmente, esses vetores são vetores unitários, ou seja, vetores de comprimento 1 (mas nem sempre é necessário). Um vetor unitário e um vetor Normalizado são a mesma coisa, ambos têm comprimento 1. Esses vetores são frequentemente usados com outros vetores para alterar suas posições.
Ao normalizar um vetor, você perde seu comprimento (sua magnitude), mas a direção permanece a mesma. Há situações em que você só precisa da direção (por exemplo, quando deseja mover um objeto nessa direção), e ter a magnitude (sem unidade de comprimento) no vetor introduziria resultados inesperados de cálculo.
Se você precisar de um vetor normal para um único cálculo, poderá usá-
myVec3.normalized
lo, isso não afetarámyVec3
, e se você pretende usar esse vetor normalizado frequentemente, provavelmente deverá criar uma variável:para evitar chamadas repetidas para o
normalized
métodoE se você vir variáveis:
Geralmente representa uma força / velocidade: esses vetores representam uma direção e sua magnitude (seu comprimento) é importante. Eles também podem ser representados com
Vector3 mDirection;
e afloat mSpeed;
.Todos estes são utilizados em relação à sua origem local, que pode ser (0, 0, 0) ou pode ser outra posição.
fonte
myVec3.normalized
retorna uma nova Vector3, tendo a mesma direção, mas magnitude 1.myVec3
permanece inalteradathese vector are unit vectors
paradirection vectors are unit vectors
algo assim? Porque, como é agora, um leitor pode ficar confuso pensando quethese
se refere aos dois exemplos anteriores,mPosition
emDirection
. (Foi assim que li no início.) #Você pode vê-lo dessa maneira, mas apenas vê-lo dessa maneira pode levar a um entendimento errado.
Primeiro de tudo, um vetor não é um ponto, e um ponto não é um vetor.
A diferença entre um vetor e um ponto é a mesma que entre uma duração e uma hora do dia . O primeiro é um intervalo de tempo, o último é um único ponto no tempo. Obviamente, 6 horas não é o mesmo que 6 horas. Você não diria "A corrida dura 1 hora" e você não diria "Vamos nos encontrar às 13 horas". A corrida dura uma hora - um intervalo - e você se encontra às 13 horas - um momento específico.
O mesmo se aplica aos vetores e ponto. Um vetor é um intervalo - um deslocamento, se você desejar. Aponta em uma certa direção e, sim, tem um comprimento.
Pontos e vetores são, portanto, relacionados, assim como durações e horas do dia. A corrida começa às 13 horas e termina às 15 horas. Ambos são pontos no tempo. Mas 15 horas - 13 horas = 2 horas, uma duração. A corrida dura duas horas, e não duas horas.
O mesmo se aplica aos pontos. A diferença entre o ponto A e B é denotada como ⃗v = B - A, onde denotesv indica um vetor e A e B indicam pontos.
Agora, há algo que chamou um vetor de posição . Você pode considerar um vetor um ponto até certo ponto, quando diz que os vetores apontam da origem para um outro ponto. Em outras palavras: se todos os seus amigos souberem que você chama horários do dia como durações desde meia-noite (0 horas), você pode dizer "Nos encontramos às 6 horas". Eles saberiam que 0 horas + 6 horas = 6 horas e, portanto, quando encontrá-lo. Isso é de fato o que os tempos navais fazem. "Nos reunimos às seis e seiscentas horas" significa 6 horas.
Portanto, o vetor <1,2,3> aponta para o ponto (1,2,3), se você considerar a origem o ponto de ancoragem, e sim, o comprimento desse vetor é a distância desse ponto da origem.
Mas o vetor <1,2,3> também aponta de (1,1,1) a (2,3,4) e, nesse caso, seu comprimento indica a distância entre esses dois pontos.
Então, como você pode ver, um vetor tem um comprimento porque não é um ponto, mas um intervalo - um deslocamento.
fonte
Um vetor pode representar uma linha entre dois pontos no espaço 3D (direção e distância) ou uma localização no espaço 3D (comprimento é a distância da origem).
Se você tem o ponto A e o ponto B, BA = AB = a direção e a distância que você precisaria percorrer para ir de A a B.
fonte
Returns this vector with a magnitude of 1
isso não destrói as informações salvas no vetor? realmente queMagnitude
eNormalized
são o que fez me confundiu.O que o Unity diz sobre pontos versus vetores não faz sentido a longo prazo, porque as APIs de geometria apenas escolhem definições distintas para tornar a ferramenta mais acessível, elas não correspondem à forma como essas coisas são conceituadas na geometria. Dê uma olhada nas implementações das classes, se puder. Por ser arbitrário, conhecer sua definição é a única maneira de entender qual é o conceito. Divulgação completa, não tenho experiência com o Unity.
Um vetor é um ponto em um espaço vetorial , em que o conceito de um ponto na geometria é codificado por elementos do conjunto subjacente. Um espaço vetorial tem um vetor distinto, chamado origem ou 0 . Álgebra linear é uma tentativa de codificar um fragmento da geometria euclidiana com uma origem algebricamente.
A flecha e seu comprimento
Os movimentos em um espaço de pontos são freqüentemente interpretados como todas as flechas dos pontos de origem / antes dos pontos de destino / depois.
Uma função de dois argumentos pode ser aplicada a um argumento para produzir a função de um argumento - podemos falar de x +, a função que leva cada vetor y ao vetor x + y . Esta é a tradução associada com a adição de x . As setas associadas vão dos pontos y aos pontos x + y . Veja: aplicação parcial , currying .
Então, por que usamos apenas uma seta ? A seta da origem aponta para um vetor específico, x em x + - a origem é a identidade da adição do vetor. Assim, podemos recuperar a tradução x + apenas de seu valor x +0 = x .
Como representação gráfica do espaço, a representação da seta tem a ver com a nossa capacidade de extrapolar visual ou fisicamente o efeito de uma tradução do valor que a determina. Quando temos essa capacidade?
Dar uma norma ao espaço vetorial, tornando-o um espaço vetorial normalizado, é fornecer uma noção do comprimento de um vetor que faça sentido como sua distância de 0. Além disso, deve ser uma distância que satisfaça a desigualdade do triângulo, que é uma forte restrição de como os comprimentos de dois vetores se relacionam com os de sua soma. De comprimento, podemos definir a distância para fazer deste um espaço métrico , e uma geodésica é um caminho intrinsecamente reto, pois é o mais curto possível. A norma euclidiana induz a distância euclidiana e a geodésica é o segmento de linha das setas, mas se você desenhar as setas como geodésicas usando diferentes normas, você pode extrapolar o efeito geométrico da tradução das geodésicas para aprender sobre a geometria.
O significado de ponto e vetor
Em alguns casos, na geometria de jogos, seu espaço de pontos não é um espaço vetorial . Um espaço afim da dimensão n pode ser incorporado em um espaço projetivo da dimensão n . Mapas afins são reduzidos a projetividades. As projetividades também permitem que você faça FOV, pois acho que não é afim. As projetividades têm benefícios:
O espaço n projetivo sobre um campo pode ser construído a partir do espaço linear ( n +1) (espaço vetorial), tratando os pontos do espaço projetivo como as linhas através da origem do espaço linear. Os planos através da origem, por sua vez, fornecem linhas projetivas. Multiplicar vetores por uma matriz fixa é um mapa linear , é para isso que serve a multiplicação de matrizes. Os mapas lineares preservam a origem e são compatíveis com a incidência. Em particular, se f é um automorfismo linear ( correspondente a uma matriz invertível ( n +1) x ( n +1)), e duas linhas L, M através da origem abrangem um plano A , entãof L, f M são linhas através da origem que mede f A , de modo que f também preservará a incidência no espaço projetivo - uma matriz invertível tem uma projeção associada. A multiplicação de matrizes codifica a composição de mapas lineares e, portanto, das projetividades.
Removendo a origem do espaço linear, todos os pontos em uma determinada linha através da origem são múltiplos escalares um do outro. Explorando esse fato, a homogeneização escolhe um ponto linear para substituir cada ponto projetivo e uma matriz invertível para substituir cada transformação projetiva (como nos mapas afins 2D -> 2D como vídeo 3D -> mapas linear 3D ), maneira que os representantes são fechados sob produtos matriciais e vetor matricial e dão e são dados por coisas projetivas únicas. Esta descrição da construção do plano projetivo a partir do plano linear une algumas coisas.
Portanto, no pipeline da matriz modelo-vista-projeção, estamos usando vetores para representar os pontos do nosso espaço projetivo, mas o espaço projetivo não é um espaço vetorial, e nem todos os vetores no espaço vetorial que estamos usando representam pontos da nossa geometria (veja a figura do plano afim à direita ). Usamos matrizes de tradução em vez de soma vetorial, se queremos traduções. Às vezes, as pessoas chamam vetores de pontos projetivos ou afins, especialmente ao usar uma configuração nesse sentido.
fonte
O comprimento (ou magnitude) do vetor é
square root of (x*x+y*y+z*z)
. Os vetores são sempre considerados como um raio que passa da origem<0,0,0>
até o ponto descrito no vetor<x,y,z>
A documentação da unidade sobre isso é encontrada aqui .
fonte