Власне, виявляється, що у вас це не може бути "обома способами": якщо ваш намір не мати відчуття "абсолютної орієнтації" на сферу (тобто якщо гравці не завжди, наприклад, звернені до полюсів ), тоді вам потрібно мати поняття орієнтації гравця. Це тому, що, всупереч тому, що може запропонувати інтуїція, рух по сфері не зовсім як рух по площині, навіть не локально (цілком); внутрішня кривизна сфери означає, що гравці можуть робити дії, які будуть обертатися самі!
Для найбільш крайнього прикладу того, про що я говорю, уявіть, що гравець починається в точці на екваторі (для зручності ми уявимо годинник обличчям, нанесеним на екватор зверху, і поставимо гравця на 6 годин ), звернені «вгору» - тобто в бік Північного полюса. Припустимо, гравець прогуляється аж до Північного полюса; тоді вони будуть стикатися прямо до точки 12 годин. Тепер нехай гравець рухається прямо праворуч від Північного полюса назад до екватора; вони закінчуються в 3-й годині, але тому, що обличчя не змінюється, коли вони рухаються праворуч(ідея полягає в тому, що їх облицювання не змінюється незалежно від того, як вони рухаються), вони все одно стикаються з точкою 12 годин - тепер вони стикаються вздовж екватора! Тепер нехай вони рухаються «назад» назад до своєї початкової (6 годин) точки; тоді вони все ще будуть стикатися вздовж екватора, тож вони будуть звернені до точки 3 годин - просто переміщення по сфері без зміни своєї "особистої" орієнтації призвело до того, що вони повертаються з обличчя на північний полюс до звернені вздовж екватора! У певному сенсі це розробка старого «жарту, який мисливець рухає милю на південь, милі на захід, а потім милі на північ», - але тут ми використовуємо кривизну сфери для зміни зміни напрямку. Зауважте, що той самий ефект все ще відбувається навіть у значно менших масштабах;
На щастя, кватерніони (як ви самі зазначили) вирішують цю ситуацію; оскільки кватерніон являє собою довільне обертання, він фактично представляє довільну "точку плюс орієнтацію" на сфері: уявіть, що починається з "триосності" на початку і надає їй деяке довільне обертання, потім переміщуючи одну одиницю в будь-якому напрямку обертаються осей " Точки осі Z; невелика думка переконає вас, що це приведе вас до точки одиничної сфери з деякою «орієнтацією» (тобто деяким розташуванням осей X і Y вашої триассі), і що ви можете дістатися до кожної точки + орієнтації на поділіть сферу таким чином (просто призначте свою вісь Z для вказівки вздовж лінії від початку до точки на кулі, а потім транспортуйте тріакси назад до початку по цій лінії). Що ще, оскільки множення кватерніонів відповідає складу обертів, кожна операція, яку ви описуєте, може бути представлена шляхом множення вашої "поточної орієнтації" на відповідно обраний кватерніон: конкретно, оскільки (одиниця) кватерніона (qx, qy, qz, qw) означає "обертати навколо осі (qx, qy, qz) по дузі arccos (qw)", то (залежно від вашого конкретного вибору системи координат, і нехай c_a буде cos (альфа) і s_a - sin (альфа)) два три кватерніони M_x = (s_a, 0, 0, c_a), M_y = (0, s_a, 0, c_a) і M_z = (0, 0, s_a, c_a) представлятимуть "поворот (тобто переміщення) у напрямку I "Я зараз стикаюся з альфаю" і "обертаюсь у напрямку, ортогональному до того, з яким я зараз стикаюся з альфою". (Третій з цих кватерніонів представлятиме "обертати мого персонажа щодо власної осі"Cur_q = M_x * Cur_q
якщо гравець натиснув вгору, або Cur_q = M_y * Cur_q
якщо гравець натиснув праворуч (або, можливо, щось на зразок, Cur_q = M_yinv * Cur_q
якщо гравець натиснув ліворуч, де M_yinv - "зворотний" кватерніона M_y, що представляє обертання в інший бік). Зауважте, що ви повинні бути обережними, на якій стороні ви застосуєте обертання, чи потрібно попередньо розмножувати чи післяміряти; якщо бути відвертим, це може бути найпростіше вирішити з допомогою проб і помилок, спробувавши і множення, і побачити, що працює.
Перехід від оновленого кватерніона до точки на кулі (і до орієнтації вашого персонажа) теж досить простий: відповідно до відповідності останнього абзацу, все, що вам потрібно зробити, - це використовувати ваш кватерніон на основі векторів (1, 0,0), (0,1,0) і (0,0,1) вашого кадру через операцію 'обертання вектора кватерніоном' v → qvq -1 (де множення тут кватерніон помножується, і ми ідентифікуємо вектор v = (x, y, z) з 'виродженим кватерніоном' (x, y, z, 0)). Наприклад, позиція на одиничній сфері отримується просто перетворенням z вектора: pos = (qx, qy, qz, qw) * (0, 0, 1, 0) * (-qx, -qy, -qz, qw) = (qx, qy, qz, qw) * (qy, -qx, qw, qz) = (2 (qy * qw + qz * qx), 2 (qz * qy-qw * qx), (qz ^ 2 + qw ^ 2) - (qx ^ 2 + qy ^ 2), 0), так(2(qy*qw+qz*qx), 2(qz*qy-qw*qx), (qz^2+qw^2)-(qx^2+qy^2))
були б координати "перетвореного" користувача на одиничній сфері (а щоб отримати координати довільної сфери, звичайно, ви просто помножите їх на радіус сфери); подібні обчислення працюють для інших осей, щоб визначити, наприклад, напрямок обличчя користувача.