Якщо 3D-вектор являє собою точку, як він може мати довжину?


27

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

Чи означає це, що величина просто її відстань від точки початку (0, 0, 0)? Або я щось пропускаю?


14
Розглянемо скаляр, також відомий як число. Це може означати абсолютне значення, різницю, відсоток тощо
Пітер - Унбан Роберт Харві

1
Normalizedв контексті означає новий вектор, який зберігає, Directionале має Magnitudeзначення 1. Тобто Normalizedвектор створюється шляхом масштабування вихідного вектора.
Тераот

@Theraot, дуже дякую, що пропозиція мені дуже допомогла!
Мухаммед Нурелдін

19
Це не так. Він являє собою переміщення. Це вказує лише на деяку точку, якщо ви вважаєте його вектором положення , і в цьому випадку він позначає зміщення від (0, 0, 0). Довжина такого вектора позиції - це відстань точки до початку.
Полігном

1
@Peter Я боюся, що мені доведеться погодитися з тобою. Стандартні алгебраїчні визначення вектора в значній мірі означають, що це не суть. його часто корисно вважати таким, оскільки вектори позицій можуть використовуватися для представлення точок, але вони не є точками. "5 метрів" - це завжди відстань (або довжина), це ніколи не буде ні часом, ні кольором. Часто корисно використовувати різні символи - я особисто ніколи б не використовував (5, 5, 5) для позначення вектора , я завжди використовував би (5, 5, 5) ^ T (T для транспозиції) або використовував належне представлення стовпців де підтримується. Тому що вимова вектора - це пункт, вводить неточності.
Полігном

Відповіді:


20

Чи означає це, що величина просто відстань від точки початку (0, 0, 0)?

Відповідь доктора може бути: Так, ви можете уявити це так.

Але я не впевнений, чи це може не призвести до неправильного розуміння.


Вектор - це не точка, і між ними є вирішальна різниця!

Той факт, що вектор зазвичай представлений як "стрілка", може створювати неправильне враження. Вектор - це насправді не одна стрілка. Точніше було б сказати, що вектор - це набір усіх стрілок, які мають однакову довжину і напрямок . (Стрілка, яку зазвичай малюють, - це лише один представник усіх цих стрілок). Але я не хочу надто заглиблюватися у нудні тут деталі математики.

Більш важливо, що між точкою і вектором є вирішальна різниця, що стає очевидним у графічному програмуванні при перетворенні точки або вектора. Я не знайомий з Unity, але з швидкого огляду документації вони моделюють найважливішу різницю між точкою та вектором у Matrix4x4класі. Він має дві різні функції:

Різниця полягає, грубо кажучи, у тому, що вектор не перекладається, тоді як точка - це. Уявіть таку матрицю 4x4:

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.


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с.
користувач1118321

Так, що ви маєте на увазі, починаючи з афінного простору 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;

Він, як правило, представляє лише положення, тобто там, де він знаходиться в 3d просторі.

Якщо у вас є ця змінна:

Vector3 mDirection;

Він, як правило, представляє напрямок. Зазвичай ці вектори є одиничними векторами, тобто векторами довжиною 1 (але це не завжди потрібно). Одиничний вектор і нормалізований вектор - це одне і те ж, вони обоє довжини 1. Ці вектори часто використовуються з іншими векторами для зміни своїх позицій.

При нормалізації вектора ви втрачаєте його довжину (його величину), але напрямок залишається колишнім. Бувають ситуації, коли вам потрібен лише напрямок (наприклад, коли ви хочете перемістити об’єкт у цьому напрямку), а величина (не одиниця довжини) у векторі вводить несподівані результати обчислення.

Якщо вам потрібен звичайний вектор для одного обчислення, ви можете використовувати myVec3.normalized, це не вплине myVec3, і якщо ви плануєте часто використовувати цей нормалізований вектор, ви, ймовірно, повинні створити змінну:

Vector3 myVec3Normalized = myVec3.normalized;

щоб уникнути повторних викликів normalizedметоду.

І якщо ви бачите змінні:

Vector3 mVelocity;

Він, як правило, представляє силу / швидкість: ці вектори представляють напрямок і важлива їх величина (їх довжина). Вони також можуть бути представлені за допомогою Vector3 mDirection;та float mSpeed;.

Все це використовується з огляду на їх місцеве походження, яке може бути (0, 0, 0), або може бути іншою Позицією.


4
Це знищує частину інформації, що міститься у векторі, і ця інформація є величиною. Однак напрямок залишається однаковим.

6
@Eldy Точніше, що зауважити, що myVec3.normalizedповертає новий Vector3, що має той самий напрямок, але величина 1. myVec3не змінюється
Caleth

4
@ NPSF3000 Це були б ривка і прикол , немає єдиної думки щодо імен, крім цього. Ми всі раді, що ривки не звичайні.
Тераот

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 . (Ось як я прочитав це спочатку.)
Супр

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), і в цьому випадку його довжина позначає відстань між цими двома точками.


Отже, як ви бачите, вектор має довжину, тому що це не точка, а інтервал - зміщення.


Пов'язане читання: Torsors
Buster

5

Вектор може представляти лінію між двома точками в 3d-просторі (напрям і відстань) або місце в 3d-просторі (довжина - відстань від початку).

Якщо у вас є точка 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 . Це пов'язаний з перекладом w / додавання x . Асоційовані стрілки проходять від точок у до точок х + у . Див.: Часткове нанесення , присипка .

То чому ми використовуємо лише одну стрілку ? Стрілка від початку позначає конкретний вектор, x у 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 лінійні карти відео ) у такому Таким чином, представники закриваються під матрицею-матрицею та матрично-векторними продуктами і дають і задаються унікальними проекційними речами. Цей опис побудови проективної площини з лінійної площини пов'язує деякі речі разом.

Отже, у матриці матриці перегляд-проекція ми використовуємо вектори для представлення точок нашого проективного простору, але проективний простір - це не векторний простір, і не всі вектори в векторному просторі, який ми використовуємо, представляють точки нашої геометрії (див. малюнок афінної площини справа ). Ми використовуємо матриці перекладу замість векторної суми, якщо хочемо перекладів. Іноді люди називають вектори проективних або афінних точок, особливо при використанні установки в цій вені.


2
+1. Але я відчуваю, що більшість людей, які розуміють мову, якою ви користуєтеся, вже знаєте відповідь на початкове запитання, тому рекомендую коригувати відповідь для випадкових читачів.
Пітер - Унбан Роберт Харві

@Peter Мені важко було вирішити все. Я хотів би зробити це більш доступним, але не знаю, як це зробити без деталізації. Однак, коли я вперше працював з OpenGL, я задумався про значення однорідних матриць, перспективних матриць та про те, як матриці перекладу були розкриті як альтернатива перекладу шляхом підсумовування, тому можливо, це не надто далеко до глибокого кінця. Формалізм - це мова, і, якщо правильно сформулювати фразу, я думаю, як обговорити ці поняття. Однак бути дуже непрозорим, щоб бути стислим, тому це більше нагадує список для читання Wiki.
Годинник Локі

Я додав деякі посилання, зокрема відео афінних карт, що робляться у більш високому вимірі як лінійні карти. Сподіваємось, це допоможе.
Годинник Локі

приємно. заслуговує більшої кількості нагород.
Пітер - Унбан Роберт Харві

-1

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

Документація про єдність щодо цього можна знайти тут .


Вибачте, але це абсолютно неправильно. Якщо у мене є дві точки A і B, то v = BA - вектор, який переходить від A до B. v в цьому випадку взагалі не переходить через початок. Вектор - це не точка. він може бути використаний , щоб представляти точку (як положення вектора), але це щось інше. Будь ласка, зрозумійте алгебраїчні основи прямо.
Полігном

Я оновив відповідь, щоб усунути плутанину, але я пропоную посилання на документацію того, що таке Vector3 в Unity, і моя відповідь відповідала всім відповідям з більш високого рейтингу, включаючи вашу власну.
Стефан

Якщо ви уважно прочитаєте документацію на єдність, то помітите, що вона ніколи не згадує про походження, тому що походження взагалі не має нічого спільного з довжиною вектора. Вектор між (1,1,1) і (2,3,4) дорівнює <1,2,3> і має довжину sqrt (1 ^ 2 + 2 ^ 2 + 3 ^ 3) = ~ 3,9, що - відстань між цими двома точками. Це навіть ніколи не торкається походження взагалі . Я збентежений , як ви могли б подумати моя відповідь згоден з вами, тому що це не так, взагалі .
Полігном
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.