Я думаю, вы хотите рассчитать интенсивность точки по всему треугольнику. Концептуально код может выглядеть следующим образом:
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
угол использования между вектором источника света и вектором, нормальным к плоскости треугольника. – mathematician1975
что вы имеете в виду «лицом к свету» (гипотенуза)? что ты уже испробовал? – depperm
Вершины могут быть вдоль z, поэтому треугольник может вращаться сам по себе. Если треугольник вращается, как я могу вычислить его нормальный и вычислить, насколько он смотрит на свет? – Jordan