Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с программой 3D

38K
02 июня 2009 года
MoDErahN
5 / / 15.06.2008
Народ, в общем трабл такой. Пишу прожку для моделирования 3D систем, все пашет нормально, кроме освещения.
Оно ведет себя жутко странно, вроде бы я его включаю до всех преобразований матриц, а в итоге оно отображаеться для всех объектов с разными векторами направления. Причем даже не с соответствующим вектором в системе координат самого объекта, а с каким-то неясно-непонятным вектором.
Вот ссыль на бинарник и модель: http://slil.ru/27717863
Запускаем прогу, тусим в "Визуализацию моделей", там правый клик на окошке с надписью "Новая модель" и выбираем "Открыть модель", выбираем файлик, тот что в архиве с прогой, и смело жмем "Начать визуализацию". Чтобы было проще увидеть в чем трабл, можно поставить скорость где-то на 0,1. Ориентация в пространстве просто мышкой.

Оно поворачивает источник света вместе с объектом, даже не вместе, а с удвоенным углом, т.е. если объект делает оборот вокруг своей оси (т.е. система координат в которой он рисуется делает 1 оборот относительно глобальной системы отсчета) источник света делает два оборота относительно глобальной системы отсчета. Со смещениями для точечных источников света вообще что-то непонятное твориться.

Как их железно прибить к глобальной системе координат? Чтобы на всех объектах освещенность отображалась с одинаковой стороны, при направленном источнике света, и со стороны центра глобальной системы координат при точечном источнике с координатами 0, 0, 0

Вот код самой процедуры отрисовки:
Код:
procedure TVM.WMPaint(var Msg: TWMPaint); //перехватчик сообщения отрисовки окна
var
  ps: TPaintStruct;
  ang: real;
begin
  //расчет реального времени
  TimerTime := GetTickCount - StartTime;
  RealTime := LRTime + TimerTime * TimeSpeed / 1000;

  //расчет координат камеры
  Cam.Eye.X := sin(camgorang) * camrad * cos(camvertang);
  Cam.Eye.Z := cos(camgorang) * camrad * cos(camvertang);
  Cam.Eye.Y := sin(camvertang) * camrad;

  BeginPaint(Handle, ps); //начало отрисовки

  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); //очистка буферов цвета и глубины

  glLoadIdentity;

  //установка камеры
  gluLookAt (Cam.Eye.X, Cam.Eye.Y, Cam.Eye.Z,
            Cam.Target.X, Cam.Target.Y, Cam.Target.Z,
            Cam.RVect.X, Cam.RVect.Y, Cam.RVect.Z);

  //установка освещения
  SetLights(TreeRoot);

  //отрисовка объектов (это рекурсивная процедура, которая производит смещения и повороты системы координат, потом выводит объект, а потом уже относительно него производит смещения системы координат, и выводит всех его потомков, и т.д., на кривизну рекурсии мне не намекать все прописано грамотно и на выходе из нее получаем все ту же глобальную систему координат, так что glLoadIdentity; в начале, это скорее перестраховка)
  GlobalPaint(TreeRoot);

  SwapBuffers(DC); //"выбрасываем" на экран

  EndPaint(Handle, ps); //завершаем отрисовку
end;


Вот вращение сферы под направленным светом, вид сверху.


Есть идеи?

Не стесняемся в предположениях, буду рад любой идее, уже часов 10 убил на попытки это отладить.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог