Другие языки программирования и технологии

3D - как рассчитать угол между камерой и полигоном?

Пишу свой 3D движок с нуля
Сейчас на стадии добавления света и теней
Для расчета цвета мне нужен угол падения взгляда на один полигон
Камера: позиция (px, py, pz) ротация (rx, ry, rz)
Полигон: вершина 1 (x1, y1, z1) вершина 2 (x2, y2, z2) вершина 3 (x3, y3, z3)
Поделитесь формулой :-)
Направление взгляда - прямая, полигон - плоскость. Набери в google "угол между прямой и плоскостью" и получишь множество ссылок с формулами и объяснениями этих формул.
Коля Бедарев
Коля Бедарев
54 752
Лучший ответ
А стоит ли ломиться в открытую дверь, когда существуют готовые алгоритмы раскраски (Phong, Blinn и т. п), которые написаны не дилетантами? :-/
направление взгляда не используют ибо получилось бы что при малейшем движением мыши цвет будет меняться (будто источник света прикреплён к мыши).

нужна позиция света - нормализованный вектр.
нужна нормаль вершины - тоже вектр.

если вектора направлены друг к другу, то цвет передаётся 100 процентов.

лучше бы ты делал всё на основе туториалов.

для базового освещения, затенения, нужна позиция источника света.

// sunAmbient - цвет затенения настраиваемый на CPU
// diffuseColor - тексель текстуры
float4 ambientColor = sunAmbient * diffuseColor;

// sunPosition - позиция ист. света
float4 sunLightDir = float4(sunPosition.xyz,0.f);

// diff - значение, которое будет затенять модель
float diff = max(dot( input.normal, sunLightDir ), 0.0f );
diff *= sunPower;

// sunDiffuse - цвет света
float4 diffuse = sunDiffuse;

// уменьшение интенсивности - затенение
diffuse *= diff;

// добавляем цвет текстуры
diffuse *= diffuseColor;

float4 color = saturate(ambientColor + diffuse);

позиция наблюдателя нужна для specular отражения
// если есть отражение света то вычисляем
if(specularLevel > 0.0f){
float4 Specular = float4(0.f,0.f,0.f,1.f);
Specular *= specularLevel * pow(saturate(dot(reflect(normalize(abs(eyePosition)), input.normal), -sunLightDir)), specularExponent);
color += saturate(Specular);
}

// добавляем shadowmap
color.xyz *= shadowColor.xyz;
color.a = 1.f;

return color;

----------------------------------------------------------
код шейдера естественно зависит от нужд того кто его создал, но я показал рабочий вариант.
Максим Дергач
Максим Дергач
30 070
я бы преобразовал координаты точек всех треугольников в систему координат камеры. В ней по нормали треугольника легко найти какую сторону треугольника видно и под каким углом.
IM
I M Best Bitch)))
2 681