...решил проверить своё
размышление насчёт существенной матрицы в трехмерной конформальной геометрической алгебре.
Провёл натурный эксперимент, с помощью
GAViewer.
# -----------------------------------------------------------------------------
# A .geo file to demonstrate projective geometry in geometric algebra.
# -----------------------------------------------------------------------------
# Setting of a camera.
campos [34*e3]
camori [2.354459e+000*e2^e3 + -1.214139e-001*e3^e1 + 9.428185e-002*e1^e2]
# -----------------------------------------------------------------------------
# Create a projected point.
console M=color(c3ga_point(1,1,5),0,1,1),
# -----------------------------------------------------------------------------
# Create a fixed camera origin and projection plane.
console dynamic{ Ofixed=color(no,0,0,0),}
console dynamic{ Pfixed=color(c3ga_point(1,0,1)^c3ga_point(0,1,1)^c3ga_point(1,1,1)^ni,0.1,0.1,0.1,0.5),}
console dynamic{ Lfixed=color(Ofixed^M^ni,1,1,0),}
console dynamic{ Ifixed=normalize(dual(dual(Lfixed)^dual(Pfixed)));}
console dynamic{ Afixed=color(c3ga_point((e3ga)(Ifixed.no)),0,0.5,0.5),}
# -----------------------------------------------------------------------------
# Create a dynamic camera translation and rotation.
console dynOffset=color(c3ga_point(2,0,-0.5),1,1,1),
console dynamic{ dynTV=tv((e3ga)dynOffset);}
console ctrl_range(dynAngleA = 0.0, -1.5707963267948966, 1.5707963267948966);
console dynamic{ dynRotorA = cos(dynAngleA)+(sin(dynAngleA)*e1^e3);}
console dynamic{ dynVersor = dynTV dynRotorA;}
# -----------------------------------------------------------------------------
# Create a dynamic camera origin and projection plane.
console dynamic{ Odynamic=vp(dynVersor,no);}
console dynamic{ Pdynamic=color(vp(dynVersor,c3ga_point(1,0,1)^c3ga_point(0,1,1)^c3ga_point(1,1,1)^ni),0.9,0.9,0.9,0.5),}
console dynamic{ Ldynamic=color(Odynamic^M^ni,1,1,0),}
console dynamic{ Idynamic=normalize(dual(dual(Ldynamic)^dual(Pdynamic)));}
console dynamic{ Adynamic=color(c3ga_point((e3ga)(Idynamic.no)),0,0.5,0.5),}
# Place dynamic camera projection into fixed camera frame.
console dynamic{ Adynamicfixed=red(ivp(dynVersor,Adynamic)),}
# -----------------------------------------------------------------------------
# Verifying an equivalent to essential matrix equation.
console dynamic{ mustbezero1 = Ofixed^Afixed^(dynVersor no inverse(dynVersor))^(dynVersor Adynamicfixed inverse(dynVersor))^ni;}
# The same equation, but a with only one versor product.
console dynamic{ mustbezero2 = Ofixed^Afixed^(dynVersor (no^Adynamicfixed) inverse(dynVersor))^ni;}Можно двигать точку M (проецируемую на обе камеры), белую точку - центр проекции перемещаемой камеры и движок dynAngleA - угол поворота камеры.
В процессе перемещения в консоли можно проверить правильность моих предположений, набрав mustbezero1 и mustbezero2. Оба должны давать ответ "ans = 0" всё время.
Результатом доволен. ;)
Теперь это надо свести к задаче наименьших квадратов.