OpenGL Освещение и позиционирование - PullRequest
0 голосов
/ 21 февраля 2012

Я прошу прощения, потому что это кажется довольно простой проблемой, которая должна быть очевидной, но кажется, что я не в курсе.

Я пишу движок и использую Light 0 как "солнце" для сцены. Я считаю, в идеале, солнце будет постоянным источником света, а не вектором, поэтому w / четвертый индекс в векторе положения должен быть 1.0f.

Я устанавливаю точку обзора Орто сцены, затем устанавливаю свет в положение персонажа (x / y - координаты плоскости местности, положительный z направлен на камеру и указывает «высоту» на местности - сцена также поворачивается для изометрического изображения по оси x).

Персонаж всегда центрируется на экране - но я заметил, что по какой-то причине свет, кажется, светит в положении между координатами персонажа и мира 0,0,0. Чем дальше персонаж получает от мировых координат 0,0,0, тем больше / шире свет. Если символ находится в 0,0,0, свет очень маленький. Если персонаж движется к чему-то вроде 0,200,0, свет становится ОГРОМНЫМ.

Я просто пытаюсь намочить ноги и получить «свет», который следует за персонажем (а затем настроить положение и т. Д., Позже, чтобы создать солнце).

        Graphics.BeginRenderingLayer();
        {
            Video.MapRenderingMode();

            Graphics.BeginLightingLayer( Graphics.AmbientR, Graphics.AmbientG, Graphics.AmbientB, Graphics.DiffuseR, Graphics.DiffuseG, Graphics.DiffuseB, pCenter.X, pCenter.Y, pCenter.Z );
            {
                Graphics.BeginRenderingLayer();
                {
                    Graphics.CenterCamera( pCenter.X, pCenter.Y, pCenter.Z );
                    RenderMap( pWorld, pCenter, pCoordinate );
                }
                Graphics.EndRenderingLayer();

                Graphics.BeginRenderingLayer();
                {
                    Graphics.DrawMan( pCenter );
                }
                Graphics.EndRenderingLayer();
            }
            Graphics.EndLightingLayer();
        }
        Graphics.EndRenderingLayer();

Graphics.BeginRenderingLayer = PushMatrix, EndRenderingLayer = PopMatrix Video.MapRenderingMode = Ортопроекция и поворот сцены / увеличение CenterCamera выполняет перевод в противоположность X / Y / Z, так что символ теперь находится по центру X / Y / Z в середине экрана.

Есть мысли? Может быть, я немного запутал здесь свой код?

1 Ответ

0 голосов
/ 21 февраля 2012

Я считаю, в идеале, солнце будет постоянным источником света, а не вектором, поэтому w / четвертый индекс в векторе положения должен быть 1.0f.

Что касается всего происходящего в основных человеческих масштабах, Солнце бесконечно далеко. Это в значительной степени окончательный «направленный свет». Поэтому, если вы не проезжаете сотни или тысячи миль, различия в направлении солнечного света будут совершенно не важны.

Короче говоря: вы должны использовать направленный свет, как и все остальные.

...