-
Здравствуйте, столкнулся со следующей проблемой: необходимо поставить сцену и камеру так, чтобы передняя плоскость параллелепипеда описывающего сцену совпадала бы с плоскостью окна. Проекция нужна перспективная, т.е. gluPerspective; Теперь подробнее и по пунктам: 1. Рассчитываются размеры сцены, пусть будет Width х Height х Long. 2. Размеры окна glViewport(0,0,scrWidth,scrHeight); scrWidth/scrHeight = Width/Height 2. Здесь необходимо рассчитать угол обзора gluPerspective(15,Width/Height,-25,Long) стандартные 90 градусов сильно искажают картинку находящуюся близко к краям. 3. Затем выбрать правильное положение камеры так, чтобы вершинка (Width,-Height,0) отображалась прямо в углу окна т.е. в (scrWidth,scrHeight). Что-то вроде gluLookAt(Width/2,Height/2,Long,Width/2,Height/2,0,0,1,0);
Как я понимаю для этого нужно рассчитывать угол обзора и положение камеры совместно, но рассчитать единую формулу я не смог.
-
Решил проблему наоборот, т.е. поставил камеру, объект в центре, а потом описал сцену которая передней плоскостью совпадала бы с экраном. Что-то вроде:
procedure TPhysics.UpdateRect(Width, Height: Integer);
var
winX, winY, winZ: GLdouble;
ln, rn, tn, bn, lf, rf, tf, bf, n, f: GLdouble;
begin
glGetDoublev(GL_MODELVIEW_MATRIX, @modelm);
glGetDoublev(GL_PROJECTION_MATRIX, @projm);
glGetIntegerv(GL_VIEWPORT, @viewp);
with Objects[0] do
gluProject(Pos[0],Pos[1],Pos[2]+R,@modelm,@projm,@viewp, winX, winY, winZ);
gluUnProject(0,Height,winZ,@modelm,@projm,@viewp,ln,tn,n);
gluUnProject(Width,0,winZ,@modelm,@projm,@viewp,rn,bn,n);
gluUnProject(0,Height,1,@modelm,@projm,@viewp,lf,tf,f);
gluUnProject(Width,0,1,@modelm,@projm,@viewp,rf,bf,f);
with Scene do
begin
Left.Point:=Vector(ln, tn, n);
Left.Normal:=VGetNormal(Vector(ln, tn, n), Vector(ln, bn, n), Vector(lf, tf, f));
Right.Point:=Vector(rn, tn, n);
Right.Normal:=VGetNormal(Vector(rn, tn, n), Vector(rn, bn, n), Vector(rf, tf, f));
Top.Point:=Vector(ln, tn, n);
Top.Normal:=VGetNormal(Vector(ln, tn, n), Vector(rn, tn, n), Vector(lf, tf, f));
Bottom.Point:=Vector(ln, bn, n);
Bottom.Normal:=VGetNormal(Vector(ln, bn, n), Vector(rn, bn, n), Vector(ln, bn, f));
Near.Point:=Vector(ln, tn, n);
Near.Normal:=VGetNormal(Vector(ln, tn, n), Vector(rn, tn, n), Vector(ln, bn, n));
Far.Point:=Vector(lf, tf, f);
Far.Normal:=VGetNormal(Vector(lf, tf, f), Vector(rf, tf, f), Vector(lf, bf, f));
end;
end;
Здесь вся сцена записывается в виде плоскостей состоящих из точки на плоскости и нормали этой плоскости. Если решение не разумное, подскажите разумнее. Спасибо.
|