Направленный источник света

Страницы работы

2 страницы (Word-файл)

Содержание работы

Directional Light - Направленный Источник света

Whenever you want to add light to your 3d-world (or single object), directional light is the easiest way of getting it. A Directional light is just a light which shinnes in one direction , and only that direction. If there is an object placed in the middle of the screen and you wish this object to be affected from directional light, shinning from the right side, there actually a very simple algorithm for this purpose. Now, lets try to make a vector that represents this direction (practical, when vectors are just an direction). If the light is shinning from the right, then it will affect anything on the left side of the light. Now, this vector would be defined as (1,0,0), since this would make the vector point to the left. Also keep in mind, that every face on our object has its own facenormal, and this normal is pointing directly out of this face. Now, imagine a face which normal is pointing directly against the directional light vector, that is, the facenormal is pointing directly to the right (the directional light is pointing left). Now, this would give our face a full color, since the face is turned zero degress away from the directional light. When the face is turned ninety degress away (which means that the lightrays cannot possibly hit the face), it receives no light-color at all. When its turned 180 degress away, the face is pointing the wrong way, which means that this face shouldn’t receive any light color as well. But how do we determine what angle the facenormal is from the directional vector? Simple, we know the dotproduct formular, which returns the cosinus of the angle to two vectors:

Всякий раз, когда Вы хотите добавить источник света в ваш 3D - мир (или единственный объект), направленный источник света - самый простой способ получения этого. Направленный источник света - только источник света, который сияет в одном направлении, и только в том направлении. Если имеется объект, помещенный в середину экрана, и Вы желаете, чтобы на этот объект падал свет из направленного источника света, освещенного с правой стороны, в этом случае фактически очень простой алгоритм для этой цели. Теперь, давайте сделаем вектор, который представляет это направление (практически, векторы - только направление). Если источник света светит справа, то это будет воздействовать на что - нибудь слева от источника света. Теперь, этот вектор был бы определен как (1,0,0), так как он будет делать направление вектора налево. Также имейте в виду, что каждая плоскость на нашем объекте имеет собственную нормаль, и эта нормаль указывает непосредственно из этой плоскости. Теперь, вообразите плоскость, нормаль которой указывает непосредственно против направленного светового вектора, то есть лицевая нормаль указывает непосредственно на право (направленный источник света указывает налево). Теперь, это дало бы нашей плоскости полный цвет, так как плоскость повернута на нуль градусов от направленного источника света. Когда плоскость повернута на девяносто градусов от (который означает это,  световые лучи не могут возможно попасть на плоскость), плоскость не получает никакого светового цвета вообще. Когда повернута на 180 градусов от, плоскость указывает неправильный способ, который означает что, эта плоскость не должна получить любой световой цвет также. Но как мы определяем то, на какой угол нормаль плоскость повернута относительно вектора направленного источника света? Просто, мы знаем формулу скалярного произведения, которая возвращает косинус угла двух векторов:

(Ax*Bx) + (Ay*By) + (Az*Bz) = cos(angle)

Now, you simply do as the above formular states. Insert the two vectors as either A or B, calculate and then the result will be cosinus of the angle between the two. There’s no reason to take inverse cosinus to get the excact angle since we know, that cosinus to zero degress equals one, and cosinus to 180 degress equals –1. Now, cosinus to 90 degress equals 0 and cosinus to –90 degress also equals 0, so we know that cosinus of angle have to be above 0 before the face recieves any color. All we have to do, is to implement the following code, and directional light should be working:

Теперь, Вы просто делаете как вышеупомянутой формуле. Вставьте два вектора  A и B, вычислите и тогда результат будет косинус угла между ними. Не имеется никакой причины брать арккосинус, чтобы получить точный угол, так как мы знаем, что косинус нуля градусов равняется единице, и косинус 180 градусов равняется минус 1. Теперь, косинус 90 градусов равняется 0, и косинус минус 90 градусов также равняется 0, так что мы знаем, что косинус угла должен быть больше чем 0 до того как плоскость получает любой цвет. Все, что мы должны делать, должны выполнить следующий код, и направленный источник света должен работать:

Color = ((directional.x * face.normal.x)+

(directional.y * face.normal.y)+

(directional.z * face.normal.z))*64

If (color > 0)

{

drawface(color); - фактически оттенок цвета света, а не сам цвет

}

We multiply the color by 64, since this is the number of shades one ”clean” color (red, green or blue) maximum can have (in mcga mode). The number could be higher or lower, depending on the number of shades. It makes no diffrence at the IF-statement wether its an interval from –1 to 1, or its from –256 to 256. The color still have to be above zero. Now, we should be able to do directional lightsources, and implement this in our code rather easy.

Мы умножаем цвет на 64, так как это - число оттенков на один "чистый" цвет (красный, зеленый или синий) максимум может иметь (в mcga методе). Число мог бы быть выше или ниже, в зависимости от числа оттенков. Это не делает никакого различия в IF-операторе так как интервал от -1 до 1, или от -256 до 256. Цвет все еще должен иметь вышеупомянутый нуль. Теперь, мы должны быть способны делать направленные источники освещения, и выполнять, это в нашем коде довольно просто.

Информация о работе