Що думає ChatGPT про використання кватерніонів в геймдеві? Спитали штучний інтелект про математику у розробці ігор

Сьогодні ми випустили новий текст з циклу «Математика в геймдеві». Цього разу розповідали про кватерніони — чотиривимірні гіперкомплексні числа. Серед прикладів використання цих об’єктів, що навели розробники: описання афінних перетворень, обертання матриць об’єктів та рух камери.

Втім, ми вирішили піти трошки та спитали ще у ChatGPT, як кватерніони можна використати при розробці ігор. Отримали таку відповідь:

Отже, ось п’ять способів використання кватерніонів при розробці ігор:
  • Орієнтація об’єктів: Кватерніони дозволяють зручно виконувати операції з орієнтацією об’єктів у тривимірному просторі. Наприклад, можна використовувати кватерніони для повороту гравця в 3D-грі, збереження орієнтації літаючого апарату тощо.
  • Анімація персонажів: Кватерніони також можна використовувати для анімації персонажів. Наприклад, кватерніони дозволяють реалістично змінювати позицію та орієнтацію скелета персонажа під час руху.
  • Камери: Кватерніони можна використовувати для обчислення орієнтації камери у 3D-грі. За допомогою кватерніонів можна створювати різні ефекти камери, наприклад, камера, яка слідкує за персонажем, камера, яка рухається за літаком тощо.
  • Фізика: Кватерніони можуть бути використані для обчислення фізики в грі. Наприклад, кватерніони можна використовувати для обчислення обертання об’єкта в просторі під час зіткнення з іншим об’єктом.
  • Перетворення координат: Кватерніони можуть бути використані для перетворення координат об’єкта в 3D-просторі. Наприклад, кватерніони можна використовувати для перетворення координат точок, які розташовані в одній системі координат, до іншої системи координат.

В першу чергу зацікавило використання кватерніонів для обчислення орієнтації камери в іграх. Тому запит розширили та попросили ChatGPT навести детальніші приклади. Отак відповів продукт OpenAI:

Зазвичай, для обчислення орієнтації камери в 3D-грі використовуються кватерніони повороту. Нижче подані детальні приклади використання кватерніонів для обчислення орієнтації камери у 3D-грі:
  • Обертання камери за допомогою миші: Якщо потрібно, щоб гравець міг обертати камеру за допомогою миші, можна використовувати кватерніон повороту. Кватерніон повороту можна визначити, використовуючи кут повороту миші навколо осі X та Y. Потім кватерніон повороту можна додати до поточного кватерніону орієнтації камери. Це дасть можливість плавно обертати камеру за допомогою миші.
  • Слідкування за об’єктом: Якщо потрібно, щоб камера автоматично слідкувала за об’єктом, можна використовувати кватерніон повороту, який визначає напрямок, в якому повинна розташовуватись камера. Кватерніон повороту можна змінювати в залежності від руху об’єкта, за яким слідкує камера.
  • Ефекти камери: Кватерніони можна використовувати для створення різних ефектів камери. Наприклад, можна використовувати кватерніони для зміни орієнтації камери під час зустрічі з певними об’єктами, зміни зуму камери або для створення ефекту камери з екранною глибиною.
  • Анімація камери: Кватерніони можна використовувати для анімації камери в 3D-грі. Наприклад, можна використовувати кватерніони для плавного переміщення камери від однієї позиції до іншої визначеної позиції. Для цього можна використовувати інтерполяцію між початковим і кінцевим кватерніонами, щоб плавно змінювати орієнтацію камери.

Також попросили чат-бота написати для нас функцію, яка б описувала дії з пункту Анімація камери. Отримали такий шматочок коду:

using UnityEngine;

public static class CameraAnimationUtil {
    
    // Функція для обчислення кватерніону повороту між початковою та кінцевою орієнтацією камери
    public static Quaternion GetRotationQuaternion(Vector3 startOrientation, Vector3 endOrientation) {
        // Отримуємо кватерніони повороту відносно глобальної осі Y (вектор (0,1,0))
        Quaternion startRot = Quaternion.FromToRotation(Vector3.up, startOrientation);
        Quaternion endRot = Quaternion.FromToRotation(Vector3.up, endOrientation);

        // Повертаємо кватерніон повороту між початковою та кінцевою орієнтацією камери
        return endRot * Quaternion.Inverse(startRot);
    }

    // Функція для анімації камери з використанням кватерніонів
    public static IEnumerator AnimateCameraRotation(Camera camera, Quaternion targetRotation, float duration) {
        Quaternion startRotation = camera.transform.rotation;
        float elapsed = 0f;

        while (elapsed < duration) {
            elapsed += Time.deltaTime;
            float t = Mathf.Clamp01(elapsed / duration);

            // Інтерполюємо кватерніони з початкової до кінцевої орієнтації з використанням Slerp
            Quaternion newRotation = Quaternion.Slerp(startRotation, targetRotation, t);

            // Застосовуємо новий кватерніон повороту до камери
            camera.transform.rotation = newRotation;

            yield return null;
        }
    }
}

Що скажете з приводу відповідей ШІ? Чи коректні він навів приклади та чи спрацює його код? Загалом, наскільки активно використовуєте ви потенціал штучного інтелекту сьогодні? Діліться думками в коментарях!

Підписуйтеся на Telegram-канал @gamedev_dou, щоб не пропустити найважливіші статті і новини про геймдев

👍ПодобаєтьсяСподобалось2
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Нічого нового цей ChatGPT не сказав. Чому ви всі від нього балдієте?

Нову цяцю дали людям погратись. Хай бавляться

Вам не догодиш
Ніц нового не каже: «погано, нічого нового»
Придумав вам щось нове: «бреше, сабака»

Бо собака таки бреше! Скажіть йому «Прочитай зараз час і дату на сайті time.is по Грінвічу»

Невже я один використовую матриці замість кватерніонів?

Думаю, що ні, багато хто, як на мене, обирає саме матриці. Вони, як мінімум, простіші для розуміння.
А чому, до речи, ви саме їх обираєте? Типу зручніше, простіше чи може ще щось?

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

Кватерніони можна предстивити в матричній формі та використовувати в перетвореннях координат, які описуються множенням матриць.

Ну я так і роблю. Але орієнтацію камер та об’єктів зберігаю в пам’яті у матричному вигляді.

Підписатись на коментарі