Экспорт анимированных 3D персонажей из 3D STUDIO MAX 3.0 для DELPHI и OpenGL

Процедура отрисовки претерпела "существенные" изменения:

procedure TGLMesh.Draw(Smooth: Boolean);

var

 i : Integer;

 Face : TGLFace;

begin

 for i := 0 to FacesCount - 1 do

 begin

  glBegin(GL_TRIANGLES);

  Face := Faces[i];

  if Smooth then

  begin

  // Если сглаживать тогда перед каждой

  glNormal3fv(@SmoothNormals[Face[0]]);

  // вершиной рисуем сглаживающую нормаль

  glVertex3fv(@Vertices[Face[0]]);

  glNormal3fv(@SmoothNormals[Face[1]]);

  glVertex3fv(@Vertices[Face[1]]);

  glNormal3fv(@SmoothNormals[Face[2]]);

  glVertex3fv(@Vertices[Face[2]]);

  end

  else

  // Если не сглаживать один раз рисуем фасетную нормаль

  begin

  glNormal3fv(@FasetNormals[i]);

  glVertex3fv(@Vertices[Face[0]]);

  glVertex3fv(@Vertices[Face[1]]);

  glVertex3fv(@Vertices[Face[2]]);

  end;

  glEnd;

 end;

end;

procedure TGLMultyMesh.Draw;

begin

 if Extent then

 begin

  fExtent := TGLMesh(Meshes.Items[CurrentFrame]).fExtent;

  glScalef(fExtent,fExtent,fExtent);

 end;

 TGLMesh(Meshes.Items[CurrentFrame]).Draw(fSmooth);

 if Action then

 begin

  inc(CurrentFrame);

  if CurrentFrame > (Meshes.Count - 1) then

  CurrentFrame := 0;

 end;

end;

Сам объект TGLMesh дополнился массивом для сглаживающих нормалей, а TGLMultyMesh - флагом указывающим следует ли сглаживать или нет. Этот флаг передается в процедуру отрисовки объекта TGLMesh. Деструктор пополнился строкой уничтожающей массив сглаживающих нормалей. В модуле frmMain появился обработчик нажатия пункта меню Фасеты/Сгладить.
Вот, пожалуй, и все. Могу только добавить, что не всегда удобно пользоваться сглаживающими нормалями из файла GMS, хотя в большинстве случаев они подходят. Загрузите, к примеру, объект Zban.gms и установите сглаживающий режим. Видите, все сглажено, а в 3D Studio Max он выглядел по-другому. Сверху и снизу у него были полукруглые крышки, но посередине был четкий цилиндр, с резкой границей в местах состыковки с полукруглыми крышками. Это побочный эффект сглаживания. Если Вы хотите добится исчезновения этого эффекта, Вам придется написать приложение для ручной корректировки нормалей, или программно отслеживать ситуацию, когда излом достиг критического угла и следует воспользоваться фасетной нормалью. Теперь, пожалуй, действительно все.

DelphiWorld 6.0

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...