Thursday, November 28, 2013

Хоёр векторын хоорондох өнцөгийг олох

Өгөгдсөн хоёр векторын хоорондох өнцөгийг скаляр үржвэрийн чанарыг ашиглан олох боломжтой байдаг. Энэ өнцөгийг олох нь 3D програмчлалд объектийн гэрэлтүүлгийн тооцоололд чухал ач холбогдолтой.
скаляр үржвэрийн геометр хөрвүүлэлтийн чанарыг нь санацгаая

    dot(v1, v2) = |v1| |v2| cos(theta);

эндээс хувиргаад

    cos(theta) = dot(v1, v2) / |v1| |v2|
    theta = arccos(dot(v1, v2) / |v1| |v2|)

гэж олж болно. | | буюу хоёр хашилт(модуль) нь  векторын уртыг олох үйлдэл юм. theta нь мэдээж хоёр векторын хоорондох өнцөг.

яг скаляр үржвэрийг нь буюу dot(v1, v2) -г алгебрийн аргаар талбаруудыг нь хооронд нь үржээд тэдгээрийн нийлбэрийг нь олох замаар утгыг нь гаргаж авч болно. Дэлгэрэнгүйг эндээс хараарай.

Жишээ нь өнгөний цайралтын (brightness) утгыг олоход гадаргуун цэгээс гэрэл хүртэл чиглэсэн вектор (negative incident vector) болон гадаргуун нормал гэсэн хоёр векторыг ашигладаг. Энэ хоёр векторын хоорондох өнцөгийн өнгөний цайралтын түвшинг тодорхойлно. Тэгвэл GLSL-ээр дээрхи томъёог хэрэглэн бодож олоё.

float brightness = dot(normal, negaIncidentVector) / (length(normal) * length(negaIncidentVector));




Мөн Ламбертийн diffuse ойлтын утгад гадаргуун нормал болон гэрлийн зүг заасан векторуудын хоорондох өнцөгийн косинусыг нь параметр болгон авдаг. гадаргуун нормал болон гэрлийн чиглэл хоёрыг хоёуланг нь нормчилж байгаад ашигладаг тул
    dot(normal, light) = |normal| |light| cos(theta) = 1 * 1 * cos(theta) = cos(theta)
cos(theta) ийн утгыг дангаар нь хэрэглэдэг гэсэн үг.