Если трехмерный вектор представляет точку, как она может иметь длину?

27

Я пытаюсь понять векторную арифметику (и особенно ее использование в движке Unity). Я не могу понять, как вектор может иметь длину (величину), даже если он представляет только точку (положение и направление)?

Означает ли это, что величина - это просто расстояние от начальной точки (0, 0, 0)? Или я что-то упустил?

Мухаммед Нурельдин
источник
14
Рассмотрим скаляр, также известный как число. Это может означать абсолютное значение, разницу, процент и т. Д.
Питер - Унбан Роберт Харви
1
Normalizedв контексте означает новый вектор, который сохраняет, Directionно имеет значение Magnitude1. То есть Normalizedвектор создается путем масштабирования исходного вектора.
Theraot
@Theraot, Большое спасибо, это предложение мне очень помогло!
Мухаммед Нурельдин
19
Это не так. Это представляет смещение. Он указывает только на некоторую точку, если вы считаете его вектором положения , и в этом случае он обозначает смещение из (0, 0, 0). Длина такого вектора положения - это расстояние от точки до начала координат.
Полигном
1
@ Петр Боюсь, я не согласен с тобой. Стандартные алгебраические определения вектора в значительной степени означают, что это не точка. часто полезно рассматривать это как таковое, поскольку векторы положения могут использоваться для представления точек, но они не являются точками. «5 метров» - это всегда расстояние (или длина), оно никогда не будет временем или цветом. Часто полезно использовать разные символы - лично я никогда бы не использовал (5, 5, 5) для обозначения вектора , я бы всегда использовал (5, 5, 5) ^ T (T для транспонированного) или использовал правильное представление столбцов где поддерживается. Потому что высказывание вектора - это точка, вносящая неточности.
Полигном

Ответы:

20

Означает ли это, что величина - это просто расстояние от исходной точки (0, 0, 0)?

Т.Л., д - р ответ может быть: Да, вы можете себе представить, как он.

Но я не уверен, может ли это привести к неправильному пониманию.


Вектор - это не точка, и между ними есть принципиальная разница!

Тот факт, что вектор обычно представлен как «стрелка», может создать неправильное впечатление. На самом деле вектор - это не единственная стрелка. Точнее было бы сказать, что вектор - это набор всех стрелок, имеющих одинаковую длину и направление . (Стрелка, которая обычно окрашивается, является лишь одним из представителей всех этих стрел). Но я не хочу вдаваться в скучные детали математики здесь.

Что еще более важно, существует существенная разница между точкой и вектором, которая становится очевидной в графическом программировании при преобразовании точки или вектора. Я не знаком с Unity, но, бросив быстрый взгляд на документацию, они моделируют самое важное различие между точкой и вектором в Matrix4x4классе. Он имеет две разные функции:

Разница, грубо говоря, в том, что вектор не переводится, тогда как точка есть. Представьте себе следующую матрицу 4х4:

1.0   0.0   0.0   1.0
0.0   1.0   0.0   2.0
0.0   0.0   1.0   3.0
0.0   0.0   0.0   1.0

Описывает перевод о (1,2,3). Теперь, когда у вас есть следующий псевдокод

Vector3 tp = matrix.MultiplyPoint (new Vector3(2,3,4));
Vector3 tv = matrix.MultiplyVector(new Vector3(2,3,4));

Тогда tpбудет (3,4,5), где tvеще будет (2,3,4). Перевод вектора не меняет его (потому что, как упоминалось выше, это набор всех стрелок одинаковой величины и направления).


Тот факт, что Unity использует Vector3класс как для векторов, так и для точек, является законным, но может сбивать с толку. Другие библиотеки специально различают Point3Dи Vector3D, иногда с общей базой, как Tuple3D.

Marco13
источник
3
Вы уверены, что «вектор - это набор всех стрелок, имеющих одинаковую длину и направление», имеет смысл математически? Похоже, вы говорите о некоторых классах эквивалентности, но векторные пространства - это не то, что я когда-либо читал, определяя как классы эквивалентности. - Как бы то ни было, вы поднимаете очень важную ... гм, точку , с различием между векторными пространствами и аффинными пространствами , которые являются математическими названиями для типов всех векторов / всех точек, соответственно.
оставил около
3
A vector is, in fact, not a single arrowВы правы, представляя Vector3 одной стрелкой, это именно то, что смутило меня. +1 за упоминание этого критического предложения.
Мухаммед Нурельдин
@leftaroundabout Существуют различные возможные определения для векторов (помимо того, что они "некоторый n-кортеж ..." или около того). В линейной алгебре представьте множество всех стрелок и отношение (эквивалентность! -) «Имеет одинаковую длину и направление». Факторизация множества всех стрелок этим соотношением приводит к классам эквивалентности. Я не хотел придираться к математическим деталям (я тоже не математик), но надеялся прояснить, что вектор не является «стрелкой, начинающейся с (0,0,0)». Точка (...): вектор не имеет «позиции».
Marco13
2
Это еще более усложняется использованием термина информатики vectorдля обозначения массива или множества! В C ++ вы можете иметь, std::vector<Vector3>например. vectorИз Vectorс.
user1118321
Итак, что вы имеете в виду, начиная с аффинного пространства X , вы определяете для любых двух точек ( p , q ) стрелку sA ( X ) как кратчайший путь (т.е. дифференцируемая функция с минимальной интегрированной абсолютной производной) s : [0,1] → X такое, что s (0) = p и s (1) = q . Тогда пространство векторов - это множество классов эквивалентности A ( X ) / ~, где s ~ σ, если ∂ s / ∂ t = ∂ σ/ ∂ t для всех t ∈] 0,1 [? Это имеет смысл, хотя я не думаю, что вы можете использовать это как определение векторов, потому что дифференциация уже зависит от них.
оставил около
36

Означает ли это, что величина - это просто расстояние от исходной точки (0, 0, 0)?

Это именно так.

Среди прочего, вектор может представлять точку (положение), направление и / или скорость, в зависимости от контекста.

Если у вас есть эта переменная:

Vector3 mPosition;

Как правило, он представляет только положение, то есть где он находится в трехмерном пространстве.

Если у вас есть эта переменная:

Vector3 mDirection;

Это обычно представляет направление. Как правило, эти векторы являются единичными векторами, то есть векторами длины 1 (но это не всегда необходимо). Единичный вектор и нормализованный вектор - это одно и то же, они оба имеют длину 1. Эти векторы часто используются с другими векторами для изменения их позиций.

При нормализации вектора вы теряете его длину (величину), но направление остается прежним. Существуют ситуации, когда вам нужно только направление (например, когда вы хотите переместить объект в этом направлении), и наличие величины (не единичной длины) в векторе может привести к неожиданным результатам расчета.

Если вам нужен вектор нормали для одного вычисления, вы можете использовать myVec3.normalizedего, это не повлияет myVec3, и если вы собираетесь часто использовать этот нормализованный вектор, вам, вероятно, следует создать переменную:

Vector3 myVec3Normalized = myVec3.normalized;

чтобы избежать повторных вызовов normalizedметода.

И если вы видите переменные:

Vector3 mVelocity;

Как правило, оно представляет собой силу / скорость: эти векторы представляют направление, и их величина (их длина) важна. Они также могут быть представлены с помощью Vector3 mDirection;и float mSpeed;.

Все они используются с учетом их локального происхождения, которое может быть (0, 0, 0) или может быть другой позицией.

Vaillancourt
источник
4
Он уничтожает часть информации, содержащейся в векторе, и эта информация является величиной. Однако направление остается прежним.
6
@Eldy Точнее заметить, что myVec3.normalizedвозвращается новый Vector3, имеющий то же направление, но величину 1 myVec3, без изменений
Caleth
4
@ NPSF3000 Те бы рывком и ударять , не существует единого мнения по именам за пределами этого. Мы все рады, что придурки не обычны.
Theraot
1
@ NPSF3000 Некоторые предполагают, что 4-е, 5-е и 6-е производные позиции должны быть мгновенными, трескаться и трещать! :-D en.wikipedia.org/wiki/Snap,_Crackle_and_Pop#Physics
gbmhunter
1
Может измениться these vector are unit vectorsк direction vectors are unit vectorsили что - то? Потому что, как сейчас, читатель может запутаться, думая, что theseотносится и к предыдущим примерам, mPosition и к mDirection . (Это, как я прочитал это в первую очередь.)
Supr
8

Означает ли это, что величина - это просто расстояние от исходной точки (0, 0, 0)?

Вы можете видеть это таким образом, но только видение этого может привести к неправильному пониманию.


Прежде всего, вектор - это не точка, а точка - это не вектор.

Разница между вектором и точкой такая же, как между продолжительностью и временем суток . Первый - это интервал времени, последний - это один момент времени. Очевидно, что 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), и в этом случае его длина обозначает расстояние между этими двумя точками.


Итак, как вы можете видеть, вектор имеет длину, потому что это не точка, а интервал - смещение.

Polygnome
источник
Связанное чтение: Торсор
Бастер
5

Вектор может представлять собой линию между двумя точками в трехмерном пространстве (направление и расстояние) или местоположением в трехмерном пространстве (длина - это расстояние от начала координат).

Если у вас есть точка A и точка B, то BA = AB = направление и расстояние, которое вам нужно будет пройти, чтобы добраться от A до B.

Ян Янг
источник
Спасибо, но тогда что значит использовать Vector3.Normalized? документация гласит: Returns this vector with a magnitude of 1разве это не разрушает информацию, сохраненную в векторе? на самом деле это Magnitudeи то Normalized, что заставило меня запутаться.
Мухаммед Нурельдин
Будь то точка в пространстве или стрелка, указывающая скорость - все это в вашей голове. Одни и те же данные представляют оба.
всевозможный
@MohammedNoureldin Нормализованный вектор - это единица длины единицы (то есть 1). Да, если вы нормализуете вектор, вы потеряете информацию о длине или величине. Если вам нужны оба (полезно во многих случаях), вы получите длину вектора, а затем нормализуете его.
Ян Янг
1

То, что 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 видео линейных карт ), таким образом, способ, которым представители замкнуты под матрично-матричными и матрично-векторными произведениями и дают и задаются уникальными проективными вещами. Это описание построения проективной плоскости из линейной плоскости связывает некоторые вещи вместе.

Итак, в конвейере матрицы модель-вид-проекция мы используем векторы для представления точек нашего проективного пространства, но проективное пространство не является векторным пространством, и не все векторы в векторном пространстве, которые мы используем, представляют точки нашей геометрии (см. рисунок аффинной плоскости справа ). Мы используем матрицы перевода вместо векторной суммы, если мы хотим переводы. Иногда люди называют векторы проективных или аффинных точек, особенно при использовании установки в этом ключе.

Loki Clock
источник
2
+1. Но я чувствую, что большинство людей, которые понимают язык, который вы используете, уже знают ответ на оригинальный вопрос, поэтому я рекомендую скорректировать ответ для случайных читателей.
Питер - Унбан Роберт Харви
@ Петр Мне было трудно решать все. Я хотел бы сделать его более доступным, но не знаю, как это сделать без каких-либо подробностей. Однако, когда я впервые работал с OpenGL, я задумался о значении однородных матриц, перспективных матриц и о том, как матрицы перевода были обнаружены как альтернатива переводу путем суммирования, поэтому возможно, что это не слишком далеко в глубину. Формализм - это язык, и, давая правильные формулировки, я думаю, как будут обсуждаться концепции. Тем не менее, это очень непрозрачно, чтобы быть кратким, так что это больше похоже на список чтения вики.
Часы Локи
Я добавил несколько ссылок, в частности, видео аффинных карт, выполненных в более высоком измерении в виде линейных карт. Надеюсь, это поможет.
Часы Loki
хороший. заслуживает большего количества голосов.
Питер - Унбан Роберт Харви
-1

Длина (или величина) вектора равна square root of (x*x+y*y+z*z). Векторы всегда рассматриваются в качестве луча , проходящего от начала <0,0,0> через точку , описанную в векторе<x,y,z>

Документация единства по этому вопросу находится здесь .

Stephan
источник
Извините, но это совершенно неправильно. Если у меня есть две точки A и B, то v = BA - это вектор, который идет от A к B. В этом случае v вообще не проходит через начало координат. Вектор не точка. он может быть использован , чтобы представлять точку (как положение вектора), но это нечто иное. Пожалуйста, разберитесь в алгебраических основах.
Полигном,
Я обновил ответ, чтобы устранить путаницу, но я даю ссылку на документацию о том, что такое Vector3 в Unity, и мой ответ соответствовал всем ответам с более высоким рейтингом, включая ваш собственный.
Стефан
Если вы внимательно прочитаете документацию Unity, вы заметите, что в ней никогда не упоминается источник, потому что источник в любом случае не имеет никакого отношения к длине вектора. Вектор между (1,1,1) и (2,3,4) равен <1,2,3> и имеет длину sqrt (1 ^ 2 + 2 ^ 2 + 3 ^ 3) = ~ 3,9, что это расстояние между этими двумя точками. Это даже не касается происхождения вообще . Я смущен , как вы могли бы подумать мой ответ согласен с вами, потому что это не так, вообще .
Полигном