Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Камера и Frustum Culling


Автор: dvamaster 7.4.2011, 11:23
Программная 3D отрисовка.

Задача: Вычислить плоскости отсечения произвольной камеры.
Цель: Отсечение до проекцирования.

Подскажите как вычислить плоскости (точка + нормаль) отсечения по видимости (Frustum Culling) произвольной камерой заданной двумя векторами, точкой и углом (вектор направления взгляда, вектор направления верха камеры и точки положения, угол обзора).

Для стандарной камеры (находящейся в нулевой точке, направленной по положительной оси Z, верх камеры направлен по положительной оси Y) вычислить не проблема. Угол обзора и точка положения не вызывает проблем...

Как имея характеристики камеры (т.е. вектор направления взгляда, вектор направления верха камеры) повернуть плоскости отсечения?

используемые типы
Код

  TVertex = record
    x, y, z: TFloat;
  end;

  TNormal = record
    x, y, z: TFloat;
  end;

  TPlane = record
    Point: TVertex;
    Normal: TNormal;
  end;


Будет лучше если подскажите как повернуть уже высчитаные плоскости (в будущем пригодится)

Автор: dvamaster 7.4.2011, 12:07
А может есть исходники функции OpenGL gluLookAt

Добавлено через 10 минут и 11 секунд
нашел вот это кому интересно

http://www.glscene.ru/forum_viewtopic.php?7.49124.10

Код

function LookAtCamera(campos,objpos: TVector):TMatrix;  
 var look, up, left: TVector;  
 begin  
   result:=IdentityHmgMatrix;  
   look:=VectorSubtract(objpos,campos);  
   look[3]:=0;  
   NormalizeVector(look);  
   left:=vectormake(1,0,0,0);  
   up:=VectorCrossProduct(left,look);  
   NormalizeVector(up);  
   left:=VectorCrossProduct(look,up);  
   NormalizeVector(left);  
   campos[3]:=1;  
   result[0]:=left;  
   result[1]:=up;  
   result[2]:=look;  
   result[3]:=campos;  
 end;

Автор: dvamaster 7.4.2011, 12:46
Код

function CreateLookAtMatrix(const eye, center, normUp: TVector): TMatrix;  
 var  
   XAxis, YAxis, ZAxis, negEye: TVector;  
   M: TMatrix;  
 begin  
   ZAxis := VectorSubtract(center, eye);  
   NormalizeVector(ZAxis);  
   XAxis := VectorCrossProduct(ZAxis, normUp);  
   NormalizeVector(XAxis);  
   YAxis := VectorCrossProduct(XAxis, ZAxis);  
   M[0] := XAxis;  
   M[1] := YAxis;  
   M[2] := VectorNegate(ZAxis);  
   M[3] := NullHmgPoint;  
   TransposeMatrix(M);  
   negEye := VectorNegate(eye);  
   negEye[3] := 1;  
   negEye := VectorTransform(negEye, M);  
   M[3] := negEye;  
   Result := M;  
 end; 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)