Меня понятное дело это не устраивает ...
И я пытаюсь юзать gluLookAt
Например как то так...
В OpenGL неудобная камера. Понятно что Вам хочется разобраться. Лично мне пришлось нарисо
вать и прорешать задачу проектиро
вания. А
вот для задачи стерео зрения надо дейст
во
вать на результат. Вы должны реализо
вать с
вой класс камеры.
Чтобы у неё была позиция
в 3-д мири и
все объекты
вы размещаете так же
в абсолютных координатах мира.
Как
в OGRE3D
radius:=0.3;
centerX:=0; centery:=0; centerZ:=0;
// rx:= 0; ry:= 0;
rx := View[0,0]; //элемент матрицы явно реагирующий на вращение вокруг оси Y
ry := View[0,1];//элемент матрицы явно реагирующий на вращение вокруг оси X
eyeX := centerX + radius*cos(ry)*sin(rx);
eyeY := centerY + radius*sin(ry)*sin(rx);
eyeZ := centerZ + radius*cos(rx);
Тут чушь написана. Вам следует прочитать про матрицу
вращений
https://wiki.sources.ru/doku.php?id=art ... 1%82%D0%B0Для трекинга я реализо
вал так.
Код: Выделить всё
// создание матрицы вращения вокруг оси z
//стр 291-292 Ф.Хилл OpenGL. Программирование компьютерной графики(2002)
function buildRotatematrixZ(Angle:Real):TMatrix44;
var c,s:Real;
begin
c:=Cos(Angle); S:=Sin(Angle);
Result[0,0]:=c; Result[0,1]:=-s; Result[0,2]:=0; Result[0,3]:=0;
Result[1,0]:=s; Result[1,1]:=c; Result[1,2]:=0; Result[1,3]:=0;
Result[2,0]:=0; Result[2,1]:=0; Result[2,2]:=1; Result[2,3]:=0;
Result[3,0]:=0; Result[3,1]:=0; Result[3,2]:=0; Result[3,3]:=1;
end;
// создание матрицы вращения вокруг оси x
//стр 291-292 Ф.Хилл OpenGL. Программирование компьютерной графики(2002)
function buildRotatematrixX(Angle:Real):TMatrix44;
var c,s:Real;
begin
c:=Cos(Angle); S:=Sin(Angle);
Result[0,0]:=1; Result[0,1]:=0; Result[0,2]:=0; Result[0,3]:=0;
Result[1,0]:=0; Result[1,1]:=c; Result[1,2]:=-s; Result[1,3]:=0;
Result[2,0]:=0; Result[2,1]:=s; Result[2,2]:=c; Result[2,3]:=0;
Result[3,0]:=0; Result[3,1]:=0; Result[3,2]:=0; Result[3,3]:=1;
end;
// создание матрицы вращения вокруг оси y
//стр 291-292 Ф.Хилл OpenGL. Программирование компьютерной графики(2002)
function buildRotatematrixY(Angle:Real):TMatrix44;
var c,s:Real;
begin
c:=Cos(Angle); S:=Sin(Angle);
Result[0,0]:=c; Result[0,1]:=0; Result[0,2]:=-s; Result[0,3]:=0;
Result[1,0]:=0; Result[1,1]:=1; Result[1,2]:=0; Result[1,3]:=0;
Result[2,0]:=s; Result[2,1]:=0; Result[2,2]:=c; Result[2,3]:=0;
Result[3,0]:=0; Result[3,1]:=0; Result[3,2]:=0; Result[3,3]:=1;
end;
// https://wiki.sources.ru/doku.php?id=articles:%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D0%B0_%D0%BF%D0%BE%D0%B2%D0%BE%D1%80%D0%BE%D1%82%D0%B0
function buildWordView(Yaw,Pitch,Roll:Real; T:TPoint3D):TMatrix44;
var RotR, RotP, RotY:TMatrix44;
begin
Result:=IdentityMatrix44;
RotR:=buildRotatematrixZ(Roll); // Меняем Y, Z
RotP:=buildRotatematrixX(Pitch);
RotY:=buildRotatematrixY(Yaw);
Result:=MatrixMulMatrix(RotY,Result);
Result:=MatrixMulMatrix(RotP,Result);
Result:=MatrixMulMatrix(RotR,Result);
Result[0,3]:=T.x;
Result[1,3]:=T.y;
Result[2,3]:=T.z;
Result[3,3]:=1;
end;
Что-то я запутался ... Изображение
Это матрица для glMultMatrixd...
С первыми тремя векторами более менее понятно, но что за "трансформация"?
Это не трансформация. Это структуру упако
вали
в матрицу. Абсолютно бесполезная
вещь.
Код: Выделить всё
// Создаёт структуру камеры
// Yaw,Pitch,Roll - в градусах
// NearPlan - размер передней плоскости на которую идёт проекция
// В чем-то схож с размером матрицы
function Cam(Yaw,Pitch,Roll:Real; T:TPoint3D; Fov, NearPlane,k,a:Real):TCam;
begin
Result.Yaw:=Rad(Yaw);
Result.Pitch:=Rad(Pitch);
Result.Roll:=Rad(Roll);
Result.T:=T;
Result.D:=NearPlane*FovToFocal(Rad(Fov)); // Примечание для метода оптимизации необходимо для нормировки
Result.k:=k*0.000001;
Result.a:=a;
Result.NearPlane:=NearPlane;
end;
// Целевая функция переводит точки 3-х мерного пространства в 2-х мерные точки камеры.
// Yaw,Pitch,Roll и T положение камеры в мировых координатах
// D,k,a внутренние параметры камеры.
function F(v:TPoint3D; Cam:TCam):TPoint2D; overload;
var WordView,Perspective, Project:TMatrix44;
V4:TPoint4D;
begin
v4:=Point4D(v);
WordView:=buildWordView(Cam.Yaw,Cam.Pitch,Cam.Roll,Neg(Cam.T));
Perspective:=buildPerspectiveMatrix(Cam.D);
Project:=MatrixMulMatrix(Perspective,WordView);
Result:=S(L(P(v4,Project),Cam.k),Cam.a);
end;
Добавлено спустя 7 минут 24 секунды:Калибро
вка камеры.
Задача калибро
вки
выяснить параметры камеры. У нас есть шахматная доска и есть камера.
Она снимает шахматную и на экране мы
видим рисунок с некоторыми искажениями.
1)Параллельные прямые собираются
в точку, а иногда и
в три точки. Горизонтальные
вертикальные и перпендикулярные каждые линии собираются
в с
вою точку.
2)К
вадраты стано
вятся пухлыми округлыми. А плоская доска похожа на подушку или бочку.
3)А если присмотреться, то прямые линии стано
вятся кри
выми.
4)А если
в кадр попадает де
вушка, то у ней моментально приба
вляются килограммы.
5)Даже непод
вижные объекты
выгляды
вают друг из-за друга стараясь попасть
в кадр.
6)Ах да и осно
вное чуть не забыли центр доски не по центру кадра.
Задача калибро
вки устранить
все эти искажения. Для чего нам надо разработать модель камеры.
Внешние параметры камеры. Это положение камеры
в пространст
ве мира-сцены.
Положение камеры 3 параметра Cam.T=(x,y,z) и 3 угла Эйлера Cam.YPR=(Yaw,Pitch,Roll)
Еще не стоит забы
вать что у доски тоже самое.
Положение доски 3 параметра Board.T=(x,y,z) и 3 угла Эйлера Board.YPR=(Yaw,Pitch,Roll)
Они кодируют смещение точек на фото. А так же
вращение относительно точки на экране.
*Оста
вшиеся углы* кодируют сжатие и растяжение по горизонтали и
вертикали.
Внутренние параметры.
У камеры есть фокусное расстояние cam.D. Оно с
вязано с углом обзора. И при этом создаёт перспекти
ву.
Есть матрица камеры но она может быть устано
влена неро
вно относительно линзы.
Из за чего нарушается соотношение сторон пикселей. cam.Aspect (Выше было cam.a)
В потогонных трубах стоит пара линз которая должна скомпенсиро
вать перспекти
вное искажение.
Однако оптическая система линз не идеальна и создаёт геометрическое искажение по краям картинки более узкая, а по серёдке более. Будем назы
вать это дисторсией линз.
Даже система из единичной линзой не идеальна и с фронтальной и тыльной стороны имеют разный радиус кри
визны. Будем использо
вать приближение пер
вого порядка.
Тут k- это коэффициент определяющий геометрические искажения линзы.
Код: Выделить всё
// Оператор геометрических искажений от линзы.
function L(x,k,r:Real):Real; Overload;
begin
if ((1+k*r*r)=0) then result:=MaxInt
else
result:=x/(1+k*r*r);
end;
function L(v:TPoint2DReal; k3:Real):TPoint2DReal; Overload;
var r:Real;
begin
r:=Hypot(v.x,v.y); // расстояние от 0 до точки, Hypot точнее чем sqrt.
Result.x:=L(v.x,k3,r);
Result.y:=L(v.y,k3,r);
end;