2015-07-28 1 views
1

У меня есть 3 вершины, образующие треугольник:мера, сколько треугольник сталкиваются свет

var a = [0, 0, 0]; 
var b = [1, 0, 0]; 
var c = [1, 1, 0]; 

и свет:

var d = [0, 1, 1]; 

enter image description here

Как можно вычислить, если треугольник лицо свет или нет, и сколько?

+2

угол использования между вектором источника света и вектором, нормальным к плоскости треугольника. – mathematician1975

+0

что вы имеете в виду «лицом к свету» (гипотенуза)? что ты уже испробовал? – depperm

+0

Вершины могут быть вдоль z, поэтому треугольник может вращаться сам по себе. Если треугольник вращается, как я могу вычислить его нормальный и вычислить, насколько он смотрит на свет? – Jordan

ответ

2

Я думаю, вы хотите рассчитать интенсивность точки по всему треугольнику. Концептуально код может выглядеть следующим образом:

var vector1 = Vector(c, a); // a vector from a -> c 
var vector2 = Vector(b, a); // a vector from a -> c 
var normal = cross(vector1, vector2); 

// normalize the vector, i.e length of the normal vector is 1 
normal = normalize(normal); 

var vectorToLightSource = Vector(lightSourceVector, a); // Any point could be taken. The result would vary some. 
vectorToLightSource = normalize(vectorToLightSource); 

// This will be a value between -1 and 1, but light can't be negative 
var intensity = dotProduct(normal, vectorToLightSource); 
intensity = intensity > 0 ? intensity : 0; 

Теперь вы можете взять цвет треугольника быть color = lightSourceColor*intensity.

Код, приведенный выше, очень псевдо; такие функции, как cross, normalize и т. д. Для этого я рекомендую использовать библиотеку геометрии, или, если вы как линейной алгебры можно построить их самостоятельно :)

Для справки:

cross: https://en.wikipedia.org/wiki/Cross_product

dotProduct: https://en.wikipedia.org/wiki/Dot_product

normalize: https://en.wikipedia.org/wiki/Unit_vector

Смежные вопросы