Нужна помощь в расчете "правильных" нормалей для примитивов.
По нету полазал, нашел несколько видов подсчета. Опробовал многие, но есть недочеты при
включении сферических текстур на таких примитивах как 4-х угольник (квадрат).
При определенных положениях камеры текстура ведет себя следующим образом:
Этот квадрат делится на свои составляющие - 2-а треугольника. У одного треугольника текстура переходит как надо, а у второго она растягивается до немыслимых размеров. Вот код для расчета нормалей который я использую:
procedure Normalize( var n:TVector );
var len:single;
begin
len := sqrt(n.x*n.x + n.y*n.y + n.z*n.z );
n.x := n.x / len;
n.y := n.y / len;
n.z := n.z / len;
end;
Вот второй код, менее глюков, но все равно наблюдается деление и растягивание:
var s : Extended;
begin
s := 1 / sqrt(sqr(v.X) + sqr(v.Y) + sqr(v.Z));
Result.x := v.x * s;
Result.y := v.y * s;
Result.z := v.z * s;
end;
Квадраты рисовал по средством и GL_QUADS и GL_TRIANGLES, результат одинаковый, как и ожидалось.
Нужен код для рисования трубы или бочки.
Что надо строить из треугольников знаю. Почти реализовал код рисования через GL_QUADS путем рисования плоскостей и их поворотом по оси. Но стоит проблема в расчете текстурных координат.
Код для рисования следующий, тут я реализовал наложение текстуры на КАЖДУЮ плоскость, а нужно 1-у текстуру на весь объект, нужен правильный расчет =) :
precision - количество граней
// боковые грани
glBegin(GL_QUADS);
for i:=0 to precision-1 do
begin
t := i*step;
tn := (i+1)*step;
GLTexCoord2f(1, 0);
glVertex3f(sin(t)*r1, cos(t)*r1, 0.0);
glTexCoord2f(1,1);
glVertex3f(sin(tn)*r1, cos(tn)*r1, 0.0);
glTexCoord2f(0,1);
glVertex3f(sin(tn)*r2, cos(tn)*r2, h);
glTexCoord2f(0,0);
glVertex3f(sin(t)*r2, cos(t)*r2, h);
end;
glEnd;