Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.27;
Скачать: CL | DM;

Вниз

Как задать SmoothNormal?   Найти похожие ветки 

 
Trimp   (2004-12-29 13:38) [0]

Продолжаю изучать OpenGl. У меня есть прога c  3d ландшафтом, просчитывается коллизия, к каждому треугольнику просчитана одна нормаль. Из-за этого кажется что ландшафт сделан из бумаги, так как переход яркости от одного треугольника к другому резкий. Мне нужно научиться задавать SmoothNormal, чтоб ландшафт был плавным. Расскажите как это сделать, а лучше скиньте процедуру просчёта SmoothNormal, пожалуйста.


 
Darthman ©   (2004-12-29 13:58) [1]

ShadeModel задай Smooth и будет сглаженно


 
Trimp   (2004-12-29 14:31) [2]

Darthman, увы не помогло. Я слышал, что вроде надо задавать нормаль не одну к треугольнику, а 3, к каждой вершине. Но каков алгоритм? Вот в чём вопрос, поэтому мне нужна процедура.


 
XProger ©   (2004-12-30 00:45) [3]

Сперва расчиай нормали к каждому треугольнику затем считай для каждой вершины как средне арифметическое между нормалями треугольников к которым она принадлежит.

 // Calc face normals
 for i := 0 to Header.Faces - 1 do
  with FNormal[i] do
   begin
   v1 := Vertex[Face[i, 0]];
   v2 := Vertex[Face[i, 1]];
   v3 := Vertex[Face[i, 2]];

   w1.X := v2.X - v1.X;
   w1.Y := v2.Y - v1.Y;
   w1.Z := v2.Z - v1.Z;

   w2.X := v3.X - v2.X;
   w2.Y := v3.Y - v2.Y;
   w2.Z := v3.Z - v2.Z;

   X := w2.Y * w1.Z - w2.Z * w1.Y;
   Y := w2.Z * w1.X - w2.X * w1.Z;
   Z := w2.X * w1.Y - w2.Y * w1.X;
   end;

 // Calc smooth normals
 for i := 0 to Header.Vertices - 1 do
  with VNormal[i] do
   begin
   X := 0;
   Y := 0;
   Z := 0;
   for j := 0 to Header.Faces - 1 do
    if (Face[j, 0] = i) or
       (Face[j, 1] = i) or
       (Face[j, 2] = i) then
     begin
     X := X + FNormal[j].X;
     Y := Y + FNormal[j].Y;
     Z := Z + FNormal[j].Z;
     end;

   d := sqrt(X*X + Y*Y + Z*Z);
   if d > 0 then
    begin
    X := X/d;
    Y := Y/d;
    Z := Z/d;
    end;
   end;

Что-то типа этого, но я угол не учитываю между гранями...

Затем отрисовка:

glBegin(GL_TRIANGLES);
 for i := 0 to Header.Faces - 1 do
  begin
  glNormal3fv(@VNormal[Face[i, 0]]);
  glVertex3fv(@Vertex[Face[i, 0]]);

  glNormal3fv(@VNormal[Face[i, 1]]);
  glVertex3fv(@Vertex[Face[i, 1]]);

  glNormal3fv(@VNormal[Face[i, 2]]);
  glVertex3fv(@Vertex[Face[i, 2]]);
  end;
glEnd;



Страницы: 1 вся ветка

Текущий архив: 2005.03.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.057 c
1-1110563318
redlord
2005-03-11 20:48
2005.03.27
перебор рантайм объектов


14-1110030629
Cosinus
2005-03-05 16:50
2005.03.27
Я возмущен!!! Посмотрите, пожалуста, может я неправ?


1-1110612969
Evgenos
2005-03-12 10:36
2005.03.27
ListBox.Color проблема


14-1110025641
TUser
2005-03-05 15:27
2005.03.27
Следить за процессом


6-1106305776
Yr2
2005-01-21 14:09
2005.03.27
Протокол работы PC с мобильным телефоном