OpenGL. Движущийся источник света

в своей программе я использую OpenTK с C#. И у меня проблема с источником света. Я не могу привязать его к камере. Он остается только в фиксированном положении. Вот код glControl1_Load():

     float[] light_ambient = { 0.2f, 0.2f, 0.2f, 1.0f };
        float[] light_diffuse = { 1.0f, 1.0f, 1.0f, 1.0f };
        float[] light_specular = { 1.0f, 1.0f, 1.0f, 1.0f };
        float[] spotdirection = { 0.0f, 0.0f, -1.0f };

        GL.Light(LightName.Light0, LightParameter.Ambient, light_ambient);
        GL.Light(LightName.Light0, LightParameter.Diffuse, light_diffuse);
        GL.Light(LightName.Light0, LightParameter.Specular, light_specular);

        GL.Light(LightName.Light0, LightParameter.ConstantAttenuation, 1.8f);
        GL.Light(LightName.Light0, LightParameter.SpotCutoff, 45.0f);
        GL.Light(LightName.Light0, LightParameter.SpotDirection, spotdirection);
        GL.Light(LightName.Light0, LightParameter.SpotExponent, 1.0f);

        GL.LightModel(LightModelParameter.LightModelLocalViewer, 1.0f);
        GL.LightModel(LightModelParameter.LightModelTwoSide, 1.0f);
        GL.Enable(EnableCap.Light0);
        GL.Enable(EnableCap.Lighting);
        GL.Enable(EnableCap.DepthTest);
        GL.Enable(EnableCap.ColorMaterial);
        GL.ShadeModel(ShadingModel.Flat);

glControl1_Paint():

        GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
        GL.MatrixMode(MatrixMode.Modelview);
        GL.LoadMatrix(ref cameramatrix);
        GL.Light(LightName.Light0, LightParameter.Position, new float[]{0.0f, 0.0f, 0.0f, 1.0f});

Если не ошибаюсь, координаты источника света хранятся в координатах пространства глаз. Итак, что случилось?


person Ali    schedule 11.04.2014    source источник


Ответы (1)


LoadIdentity вместо матрицы вашей камеры для просмотра модели. Ваш источник света всегда будет оставаться в одном и том же месте относительно вашей камеры.

«Если значение w не равно нулю, источник света является позиционным, а значения (x, y, z) определяют положение источника света в однородных координатах объекта. (См. Приложение F.) Это положение преобразуется матрицей представления модели и сохраняется. в координатах глаза».

подробнее здесь Найдите "Пример 5-7"

person Jean-Simon Brochu    schedule 11.04.2014
comment
да, я знаю о значении w, но LoadIdentity и LoadMatrix — это не одно и то же? Я не могу использовать LoadIdentity, потому что моя камера реализована как класс - person Ali; 12.04.2014
comment
Вовсе нет, если вы установите матрицу камеры в виде модели, ваше положение источника света будет зафиксировано в 3D-пространстве. Вы пробовали мое решение? Вы проверили пример, который я связал? - person Jean-Simon Brochu; 14.04.2014