Я пытаюсь понять векторную арифметику (и особенно ее использование в движке Unity). Я не могу понять, как вектор может иметь длину (величину), даже если он представляет только точку (положение и направление)?
Означает ли это, что величина - это просто расстояние от начальной точки (0, 0, 0)? Или я что-то упустил?
Normalized
в контексте означает новый вектор, который сохраняет,Direction
но имеет значениеMagnitude
1. То естьNormalized
вектор создается путем масштабирования исходного вектора.Ответы:
Т.Л., д - р ответ может быть: Да, вы можете себе представить, как он.
Но я не уверен, может ли это привести к неправильному пониманию.
Вектор - это не точка, и между ними есть принципиальная разница!
Тот факт, что вектор обычно представлен как «стрелка», может создать неправильное впечатление. На самом деле вектор - это не единственная стрелка. Точнее было бы сказать, что вектор - это набор всех стрелок, имеющих одинаковую длину и направление . (Стрелка, которая обычно окрашивается, является лишь одним из представителей всех этих стрел). Но я не хочу вдаваться в скучные детали математики здесь.
Что еще более важно, существует существенная разница между точкой и вектором, которая становится очевидной в графическом программировании при преобразовании точки или вектора. Я не знаком с Unity, но, бросив быстрый взгляд на документацию, они моделируют самое важное различие между точкой и вектором в
Matrix4x4
классе. Он имеет две разные функции:Matrix4x4.MultiplyVector
а такжеMatrix4x4.MultiplyPoint
Разница, грубо говоря, в том, что вектор не переводится, тогда как точка есть. Представьте себе следующую матрицу 4х4:
Описывает перевод о (1,2,3). Теперь, когда у вас есть следующий псевдокод
Тогда
tp
будет (3,4,5), гдеtv
еще будет (2,3,4). Перевод вектора не меняет его (потому что, как упоминалось выше, это набор всех стрелок одинаковой величины и направления).Тот факт, что Unity использует
Vector3
класс как для векторов, так и для точек, является законным, но может сбивать с толку. Другие библиотеки специально различаютPoint3D
иVector3D
, иногда с общей базой, какTuple3D
.источник
A vector is, in fact, not a single arrow
Вы правы, представляя Vector3 одной стрелкой, это именно то, что смутило меня. +1 за упоминание этого критического предложения.vector
для обозначения массива или множества! В C ++ вы можете иметь,std::vector<Vector3>
например.vector
ИзVector
с.Это именно так.
Среди прочего, вектор может представлять точку (положение), направление и / или скорость, в зависимости от контекста.
Если у вас есть эта переменная:
Как правило, он представляет только положение, то есть где он находится в трехмерном пространстве.
Если у вас есть эта переменная:
Это обычно представляет направление. Как правило, эти векторы являются единичными векторами, то есть векторами длины 1 (но это не всегда необходимо). Единичный вектор и нормализованный вектор - это одно и то же, они оба имеют длину 1. Эти векторы часто используются с другими векторами для изменения их позиций.
При нормализации вектора вы теряете его длину (величину), но направление остается прежним. Существуют ситуации, когда вам нужно только направление (например, когда вы хотите переместить объект в этом направлении), и наличие величины (не единичной длины) в векторе может привести к неожиданным результатам расчета.
Если вам нужен вектор нормали для одного вычисления, вы можете использовать
myVec3.normalized
его, это не повлияетmyVec3
, и если вы собираетесь часто использовать этот нормализованный вектор, вам, вероятно, следует создать переменную:чтобы избежать повторных вызовов
normalized
метода.И если вы видите переменные:
Как правило, оно представляет собой силу / скорость: эти векторы представляют направление, и их величина (их длина) важна. Они также могут быть представлены с помощью
Vector3 mDirection;
иfloat mSpeed;
.Все они используются с учетом их локального происхождения, которое может быть (0, 0, 0) или может быть другой позицией.
источник
myVec3.normalized
возвращается новый Vector3, имеющий то же направление, но величину 1myVec3
, без измененийthese vector are unit vectors
кdirection vectors are unit vectors
или что - то? Потому что, как сейчас, читатель может запутаться, думая, чтоthese
относится и к предыдущим примерам,mPosition
и кmDirection
. (Это, как я прочитал это в первую очередь.)Вы можете видеть это таким образом, но только видение этого может привести к неправильному пониманию.
Прежде всего, вектор - это не точка, а точка - это не вектор.
Разница между вектором и точкой такая же, как между продолжительностью и временем суток . Первый - это интервал времени, последний - это один момент времени. Очевидно, что 6 часов - это не то же самое, что 6 часов. Вы не скажете: «Гонка длится 1 час», и вы не скажете: «Давайте встретимся в 13 часов». Гонка длится один час - интервал - и вы встречаетесь в 13 часов - определенный момент времени.
То же самое относится к векторам и точкам. Вектор - это интервал - смещение, если хотите. Он указывает в определенном направлении, и да, он имеет длину.
Таким образом, точки и векторы взаимосвязаны, так же как продолжительность и время суток. Гонка начинается в 13 часов и заканчивается в 15 часов. Оба являются точками во времени. Но 15 часов - 13 часов = 2 часа, продолжительность. Гонка длится два часа, а не 2 часа.
То же касается и очков. Разница между точками A и B обозначается как ⃗v = B - A, где ⃗v обозначает вектор, а A и B обозначает точки.
Теперь есть то, что называется вектором позиции . Вы можете рассматривать вектор как точку в определенной степени, когда говорите, что векторы указывают от начала координат до определенной другой точки. Другими словами: если все ваши друзья знают, что вы называете время суток продолжительностью с полуночи (0 часов), вы можете сказать: «Мы встречаемся в 6 часов». Они будут знать, что 0 часов + 6 часов = 6 часов и, следовательно, когда встретиться с вами. Это фактически то, что делают морские времена. «Мы встречаемся в шестьсот часов» означает 6 часов.
Таким образом, вектор <1,2,3> указывает на точку (1,2,3), если вы рассматриваете начало координат как точку привязки, и да, длина этого вектора - это расстояние этой точки от начала координат.
Но вектор <1,2,3> также указывает от (1,1,1) до (2,3,4), и в этом случае его длина обозначает расстояние между этими двумя точками.
Итак, как вы можете видеть, вектор имеет длину, потому что это не точка, а интервал - смещение.
источник
Вектор может представлять собой линию между двумя точками в трехмерном пространстве (направление и расстояние) или местоположением в трехмерном пространстве (длина - это расстояние от начала координат).
Если у вас есть точка A и точка B, то BA = AB = направление и расстояние, которое вам нужно будет пройти, чтобы добраться от A до B.
источник
Returns this vector with a magnitude of 1
разве это не разрушает информацию, сохраненную в векторе? на самом деле этоMagnitude
и тоNormalized
, что заставило меня запутаться.То, что Unity говорит о точках против векторов, бессмысленно в долгосрочной перспективе, потому что геометрические API просто выбирают четкие определения, чтобы сделать инструмент более доступным, они не соответствуют тому, как эти вещи концептуализируются в геометрии. Посмотрите на реализацию классов, если можете. Поскольку это произвольно, знать его определение - единственный способ понять, что такое концепция. Полное раскрытие, у меня нет опыта Unity.
Вектор - это точка в векторном пространстве , в которой понятие точки в геометрии кодируется элементами базового набора. Векторное пространство имеет выделенный вектор, называемый началом координат или 0 . Линейная алгебра - это попытка кодировать фрагмент евклидовой геометрии с началом координат алгебраически.
Стрелка и ее длина
Движения через пространство точек часто интерпретируются как все стрелки от исходных / до точек до их цели / после точек.
Функция двух аргументов может быть применена к одному аргументу для получения функции одного аргумента - мы можем говорить о x +, функции, которая переводит каждый вектор y в вектор x + y . Это перевод, связанный с добавлением х . Связанные стрелки идут от точек y к точкам x + y . Смотрите: частичное применение , карри .
Так почему же мы используем только одну стрелку ? Стрелка от начала координат указывает на определенный вектор, х в x + - начало координат - это тождественность сложения векторов. Таким образом, мы можем восстановить перевод x + только из его значения x + 0 = x .
Как графическое представление пространства, представление стрелки связано с нашей способностью визуально или физически экстраполировать эффект перевода от определяющего его значения. Когда у нас есть эта способность?
Чтобы придать векторному пространству норму, превратив его в нормированное векторное пространство , нужно дать представление о длине вектора, которая имеет смысл как его расстояние от 0. Кроме того, это должно быть расстояние, удовлетворяющее неравенству треугольника, которое является сильное ограничение на то, как длины двух векторов соотносятся с их суммой. Из длины мы можем определить расстояние, чтобы сделать это метрическим пространством , а геодезическая - это путь, который является прямым по своей сути, поскольку он максимально короткий. Евклидова норма индуцирует евклидово расстояния и геодезические отрезки стрел, но если вы рисуете стрелки , как геодезические , используя различные нормыВы можете экстраполировать геометрический эффект перевода из геодезических, чтобы узнать о геометрии.
Значение точки и вектора
В некоторых случаях при выполнении игровой геометрии ваше пространство точек не является векторным пространством . Аффинное пространство размерности n может быть вложено в проективное пространство размерности n . Аффинные карты сводятся к проективности. Проективность также позволяет вам делать FOV, я думаю, что это не аффинно. Проективность имеет преимущества:
Проективное n- пространство над полем можно построить из линейного ( n +1) -пространства (векторного пространства), рассматривая точки проективного пространства как прямые, проходящие через начало линейного пространства. Плоскости через начало координат в свою очередь дают проективные линии. Умножение векторов на фиксированную матрицу - это линейное отображение , для этого и нужно умножение матриц. Линейные карты сохраняют происхождение и совместимы с частотой. В частности, если f - линейный автоморфизм ( соответствующий обратимой ( n +1) x ( n +1) матрице), и две прямые L, M через начало координат охватывают плоскость A , тоf L, f M - линии через начало координат, охватывающие f A , поэтому f сохранит попадание и на проективное пространство - обратимая матрица имеет связанную проективность. Матричное умножение кодирует композицию линейных отображений и, следовательно, проективных функций.
Удаляя начало координат из линейного пространства, все точки на данной прямой через начало координат являются скалярными кратными друг другу. Используя этот факт, гомогенизация выбирает линейную точку для каждой проективной точки и обратимую матрицу для каждого проективного преобразования (как в этом 2D -> 2D аффинных картах как 3D -> 3D видео линейных карт ), таким образом, способ, которым представители замкнуты под матрично-матричными и матрично-векторными произведениями и дают и задаются уникальными проективными вещами. Это описание построения проективной плоскости из линейной плоскости связывает некоторые вещи вместе.
Итак, в конвейере матрицы модель-вид-проекция мы используем векторы для представления точек нашего проективного пространства, но проективное пространство не является векторным пространством, и не все векторы в векторном пространстве, которые мы используем, представляют точки нашей геометрии (см. рисунок аффинной плоскости справа ). Мы используем матрицы перевода вместо векторной суммы, если мы хотим переводы. Иногда люди называют векторы проективных или аффинных точек, особенно при использовании установки в этом ключе.
источник
Длина (или величина) вектора равна
square root of (x*x+y*y+z*z)
. Векторы всегда рассматриваются в качестве луча , проходящего от начала<0,0,0>
через точку , описанную в векторе<x,y,z>
Документация единства по этому вопросу находится здесь .
источник