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;
Проблема с программой 3D
Оно ведет себя жутко странно, вроде бы я его включаю до всех преобразований матриц, а в итоге оно отображаеться для всех объектов с разными векторами направления. Причем даже не с соответствующим вектором в системе координат самого объекта, а с каким-то неясно-непонятным вектором.
Вот ссыль на бинарник и модель: http://slil.ru/27717863
Запускаем прогу, тусим в "Визуализацию моделей", там правый клик на окошке с надписью "Новая модель" и выбираем "Открыть модель", выбираем файлик, тот что в архиве с прогой, и смело жмем "Начать визуализацию". Чтобы было проще увидеть в чем трабл, можно поставить скорость где-то на 0,1. Ориентация в пространстве просто мышкой.
Оно поворачивает источник света вместе с объектом, даже не вместе, а с удвоенным углом, т.е. если объект делает оборот вокруг своей оси (т.е. система координат в которой он рисуется делает 1 оборот относительно глобальной системы отсчета) источник света делает два оборота относительно глобальной системы отсчета. Со смещениями для точечных источников света вообще что-то непонятное твориться.
Как их железно прибить к глобальной системе координат? Чтобы на всех объектах освещенность отображалась с одинаковой стороны, при направленном источнике света, и со стороны центра глобальной системы координат при точечном источнике с координатами 0, 0, 0
Вот код самой процедуры отрисовки:
Код:
Вот вращение сферы под направленным светом, вид сверху.
Есть идеи?
Не стесняемся в предположениях, буду рад любой идее, уже часов 10 убил на попытки это отладить.