Вектори розвитку ігор


19

Я новачок у програмуванні та ігровому програмуванні. Я читав щось про вектори та математику, але у мене виникає питання - де я використовую вектори в ігровому програмуванні? Може, хтось може навести простий приклад, коли ви використовуєте вектори (у 2D)?

Я знайшов приклади, але в основному вони знаходяться в консолі, де вони виводять цифри, і великих прикладах, яких я не розумію.


Основні вектори TL; DR є частиною теми лінійної алгебри та ведуть до матриць. За допомогою Matricies та Linear Algebra ви пишете що завгодно - від вирішувача тральщиків до 3D-проекції світу, щоб побачити, який об’єкт знаходиться під курсором. Лінійна алгебра є єдиною найбільш корисною і необхідною галуззю математики для будь-якого розробника ігор. Вивчіть це зараз; ти не пошкодуєш.
Роберт Массайолі

Дякую всім за чудові відповіді! Але чому щось подібне не використовує векторні в цьому підручнику ?: zetcode.com/tutorials/javagamestutorial Або один розробник не використовує інший ні?
vqwer

Важко сказати, напевно, автор хотів зробити це простим та основним для початківців.
Майк Семдер

Насправді автор їх використовує, подивіться на масив точок class Star тут
Maik Semder

Також тут буде Point2Dвикористовуватисяclass ResizeRectangle
Maik Semder

Відповіді:


31

Що таке вектори?

Вектори - це набори координат різної розмірності. Кожна координата у векторі представляє деяке абсолютне положення у тому напрямку простору, в якому знаходиться вектор.

  • 1-D вектор буде {1} . Це може бути, наприклад, позиція при X = 1. Або час t = 1.
  • 2-D вектор буде {-4,3} . Це може бути, наприклад, положення на -4 на осі X і 3 на осі Y. Це також може бути температура (3 градуси) у положенні (-4 метри) назад на осі X.
  • 3-D вектор буде {1,2,3} . Це може бути положення в просторі 1 вздовж осі X, 2 назад на осі Y і 3 вгору по осі Z. Або це може бути 1 червоний, 2 зелений та 3 синій кольори. Або це може бути положення XY ( {1,2} ) у певний час T ( {3} ).

Зауважте, що у всіх випадках ми присвоювали значення векторам нашої проблеми. У той час як ви зазвичай знайдете векторів, які використовуються для геометрії в іграх, немає ніяких причин ви не можете зробити щось інше з ними.

Чому я використовую вектори?

По-перше, вам ніколи не доведеться користуватися векторами. Поки ви відстежуєте х і у, або будь-які координати, які вас цікавлять, якимось чином ви все в порядку.

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

Для простого прикладу їх розглянемо крапковий добуток .

Припустимо, у вас є радарна система в грі в стилі зверху вниз. Кожен ворог, який з’явиться в секторі РЛС (якийсь пиріг у формі 2D), повинен отримати на екрані маленьку червону крапку. Отже, вам потрібно розібратися, які вороги є у вашій радіолокаційній частині.

Ви можете перевірити, чи є вороги всередині трикутника. Ви також можете перевірити, чи містяться вороги в перетині двох напівпросторів літаків / ліній, що визначають дві сторони радіолокаційного сектора.

Або ви можете просто використовувати крапковий продукт, щоб зробити перевірку. Ось як:

  1. Створіть вектор, що йде від центру радара назустріч "передній частині радара". Нормалізуйте це.
  2. Створіть вектор, що йде від центру радіолокатора до об'єкта, на який ми хочемо перевірити радіолокаційну видимість. Нормалізуйте це.
  3. Візьміть крапковий добуток двох нормалізованих векторів.
  4. Візьміть аркоскозин цього виробу і перевірте, чи не менший він від половини кута ширини радара. Якщо це так, намалюйте шматочок.

Це дуже зручно, а також тепер ви можете легко мати радари, які вказують у різні боки (просто змініть вектор вперед) та мають різну ширину (просто змініть кут ширини радара) - і ви можете повторно використовувати той самий код і для цих випадків !

Чому ще я використовую вектори?

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

За допомогою векторної математики ми представляємо кожну як точку та матрицю перетворення 3x3. Планета використовує свою трансформацію, корабель використовує свою трансформацію і трансформацію планети, і безпілотник використовує свою трансформацію і перетворення корабля і трансформацію планети.

Коли планета рухається, ви змінюєте її перетворення, і корабель і безпілотник автоматично розміщуються «безкоштовно». Набагато чистіший код.

Досі не переконаний. Вектори також є власним представленням для положення, геометрії та руху, якими користуються майже всі графічні бібліотеки - і, звичайно, OpenGL та DirectX. Ви, швидше за все, не підете без використання ними.

Висновок Вектори - це потужний інструмент для написання чіткого коду, який вирішує геометричні задачі чисто та елегантно.


14

Прикладом 2D є координати екрану, він ідентифікує піксель на екрані та має x- та y-компонент [x, y], тобто положення верхнього лівого верхнього екрана [0, 0]

Інший приклад. Уявіть, що текст прокручується від правої межі екрана до лівої межі екрана. Тепер вам потрібно визначити швидкість прокручуваного тексту в пікселях в секунду, тобто [-20, 0], що означає, що текст прокручує 20 пікселів вліво за секунду і ніколи не змінює висоту.

Ще один більш просунутий приклад: уявіть двовимірну гру, яка повинна працювати у різних роздільних здатностях екрана 800x600, 1024x768 тощо. Це легко зробити внутрішньо за допомогою ширини екрана від 0,0 до 1,0 та висоти від 0,0 до 1,0, щоб відключити логіку гри від фактичної роздільної здатності екрана. Тепер, коли ви малюєте на екрані, ви просто перемножуєте внутрішній вектор на вектор роздільної здатності:

screen_pos = internal_pos * screen_ressolution

Зауважте, всі 3 змінні є двовимірними векторами, вони мають x- та y-компонент, тобто для цього Internal_pos [0,5, 0,25]:

[400, 150] = [0.5, 0.25] * [800, 600]

Отже внутрішнє положення [0,5, 0,25] перетворюється на фактичне положення екрану [400, 150]

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


Чи не вектор є одновимірним масивом, як якийсь список? Коли ми говоримо про роздільну здатність екрана, чи не говоримо ми про багатовимірний масив (по одній координаті для кожної осі X і Y)? Просто щоб переконатися, що "вектор" тут не змішується з матрицею. =)
Буде Маркуйлер

@Заповні дані про пікселі для екрана можна трактувати як багатовимірний масив, в основному растрову карту, але значення для ширини та висоти, іншими словами роздільна здатність, не можуть
Maik Semder

2
Зауважте, що вектор часто трактується зовсім по-різному в математиці та програмуванні. Математично кажучи, вектор не є багатовимірним масивом, хоча його компоненти відносно деякої бази разом визначають такий масив. Сам вектор є координатним інваріантом. Операція неscreen_pos = internal_pos * screen_resolution є інваріантною координатою так, як ви її написали, вона могла бути більш доцільно записати , де лінійне відображення (яке можна записати як матрицю, в даному випадку діагональну). screen_pos = map_to_screen * internal_posmap_to_screen
близько

6

Ось чудове пояснення векторів розвитку ігор на блозі Wolfire Games:

http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-1/


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

1

Вектор - це сутність, яка має як значення, так і напрямок. Приклади векторів реального світу та ігор на основі фізики включають швидкість та імпульс. Властивості, які мають лише значення, але не мають напряму, називаються скалярами і включають розташування, масу, щільність тощо.

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


Швидкість є скалярною, її довжина вектора швидкості
Майк Семдер

Правильно - зафіксовано
Еран Гальперін

1
а місце розташування зазвичай розглядається як векторне, відстань є скалярною.
Ali1S232

Позицію можна вважати як скаляром (або сукупністю скалярів), так і вектором, що спрямований від початкової точки осі.
Еран Гальперін

1

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

Для базових речей не дуже важливо, чи вважаєте ви ці числа векторами чи ні, але якщо ви хочете займатися будь-якою фізикою, вам слід вивчити векторну математику.


Позиція - не вектор
Еран Гальперін

Ні швидкість, ні її скалярна, швидкість - вектор
Майк Семдер

2
@Eran Galperin Я знаю, що це досить поширена думка серед математиків. Відмінність точки і відповідного вектора позиції, проте, досить академічне. Немає жодних практичних причин суєти з приводу розрізнення.
aaaaaaaaaaaa

1
Є практичні причини, коли ви працюєте з 4D однорідними координатами та матрицями, ви повинні зробити це розмежування. Хоча це не стосується обсягу цього питання.
Майк Семдер

@eBusiness це не "погляд", це факт. А я фізик за освітою, а не математик.
Еран Гальперін

0

Дуже просто, що завгодно з позицією чи напрямком, що є скрізь у грі, вони використовують вектори. Вектор - це як точка

struct Point2
{
float x, y;
};

struct Vector2
{
float x, y;
};

Однак різниця дійсно зводиться до цього. Точка - лише крапка, а вектор - Стрілка.

якщо у вас є

Point2.x = 5;

Point2.y = 10;

ваша приказка, що я маю на увазі в цьому місці x 5 і y 10.

проте коли ви оголошуєте вектор ...

Vector2.x = 5;

Vector2.y = 10; 

Ваше дійсно кажу, що ми оголошуємо стрілку від 0,0 до х 5, у 10;

Ви навіть можете мати точку, з якої ваш вектор вказує, бути точкою в просторі з будь-якого місця, наприклад, давайте використовувати точку та вектор для переміщення нашого об'єкта, ми будемо використовувати Point2 для зберігання його розташування, а vector2 для переміщення його .

point2.x = 10;

point2.y = 15;

тепер ви можете використовувати вектор для переміщення цієї точки, скажімо, ми хочемо перемістити цю точку вгору по осі х 10 одиниць, щоб у вас був

vector2.x = 10;

vector2.y = 0;

point2 += vector2;

тепер точка перемістилася туди, куди сказала це ваша векторна стрілка.

Справа зараз є

point2.x = 20;

point2.y = 15;

Останнє, що слід зазначити, іноді вектор використовується як точка, і навпаки, тільки тому, що вони містять один і той же тип даних.


Точка - вектор. Це вектор від походження до точки П.
Качка комуністична

1
@Duck технічно кажучи, це неправильно, посилаючись на однорідні координати, цей вектор можна знайти, віднімаючи координату origin_point від позиції_point, але це не робить їх рівними: v = pos - originтому v != posоскільки походження є точкою{0, 0, 0, 1}
Maik Semder

@Duck: Точка не вектор, а точка, а початок визначає вектор, що так само добре, як і більшість часу, якщо ваше походження становить 0.

@Duck, то чому ти назвав це своєю точкою P? LOL
EddieV223
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.