Як знайти положення камери за трьома точками впросторі

знайти
Вже якийсь час у моїй голові сидить ідея скрипта для Блендера, який би знаходив положення камери у просторі за відомими точками.

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

Підкажіть, у якому напрямку копати? Скрипт писатиметься на третьому пітоні, може їсти якісь корисні пакети?

У многочлен тільки парні ступеня z, коефіцієнт при z 8 дорівнює (a 2 + b 2 + c 2-2 * a * b * c-1) 2. Цікаво, що це таке.

Mrrl: Сказати, що все гладко поки не можна, працює не дуже стабільно. Може похибка обчислень накопичується, може позначатися дуалізм рішень полінома парного ступеня. з п'яти точок зазвичай 3 визначаються приблизно нормально, 2 плавають - ближча з двох точок може виявитися більш далекою, або взагалі точка вилітає за межі сцени.

Рішення виконується заміною змінних поліномів a1*z^8 + a2*z^6 + a3*z^4 + a4*z^2 + a5 = 0 на z1 = z^8, z2 = z^6, z3 = z^4 , z4 = z^2 і подальшого обчислення зворотної матриці лінійної системи, складеної з даних 5-ти точок. Для рішення виконуються умови z3

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

Множинність не дає мені спокою проте - вона сидить в рівняннях теореми косінусів, геометрично можна ось таку картинку відразуУявити:

положення
Неважко помітити, що точки А3 і A3' задовольняють будь-яким умовам теореми косінусів, не просто в окремій парі точок, а й у складнішій їх сукупності (в даному випадку 3 точки).

Mrrl: Мені здається – коріння швидше за все буде близьким, що випливає і з геометричної ілюстрації задачі – чи розташована точка n на dZ ближче чи далі ніж її сусіди за сукупністю?

Брати безліч точок не хочеться - все-таки обчислювальна складність алгоритму помітна, обчислення всіх коефіцієнтів одного рівняння - це близько тисячі операцій складання та множення, система з 4-х ур для однієї точки разом з рішенням зворотної матриці - вже понад 5 тис операцій, а має працювати в реальному часі на iPad/iPhone. Та й реперні крапки ще треба десь узяти, особливо у перших ітераціях.

З іншого боку, в моделі не використовується найважливіше правило - те, що центр камери, точка в просторі та проекція точки, знаходяться на одній прямій. Проекція точки може бути виражена в умовних реальних координатах через піксельні відповідно до матриць повороту камери: C + (cos(Rz)*cos(Ry)*Ux - sin(Rx)*sin(Ry)*cos (Rz)-Uy*cos(Rx)*sin(Rz), sin(Rz)*cos(Ry)*Ux-sin(Rx)*sin(Ry)*sin(Rz)+Uy*cos( Rx)*cos(Rz), -Ux*sin(Ry)-cos(Ry)*sin(Rx) ) де Rx,Ry,Rz - шукані значення кутів повороту камери (від положення по осі Z ), С - шуканий центр камери, U обчислюється з піксельних координат точки як (tg(uv.x-W/2)/W*fov_x,tg(uv.y-H/2)/H*fov_y))

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