Конференция "Игры" » Расчет угла обзора и растояния под размеры окна [Delphi, Windows]
 
  • Galiaf (22.08.10 16:49) [0]
    Здравствуйте, столкнулся со следующей проблемой: необходимо поставить сцену и камеру так, чтобы передняя плоскость параллелепипеда описывающего сцену совпадала бы с плоскостью окна.
    Проекция нужна перспективная, т.е. 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);

    Как я понимаю для этого нужно рассчитывать угол обзора и положение камеры совместно, но рассчитать единую формулу я не смог.
  • Galiaf (26.08.10 14:28) [1]
    Решил проблему наоборот, т.е. поставил камеру, объект в центре, а потом описал сцену которая передней плоскостью совпадала бы с экраном. Что-то вроде:

    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;


    Здесь вся сцена записывается в виде плоскостей состоящих из точки на плоскости и нормали этой плоскости.

    Если решение не разумное, подскажите разумнее. Спасибо.
 
Конференция "Игры" » Расчет угла обзора и растояния под размеры окна [Delphi, Windows]
Есть новые Нет новых   [118604   +26][b:0][p:0.001]