Форум: "Игры";
Текущий архив: 2005.03.27;
Скачать: [xml.tar.bz2];
ВнизКак задать SmoothNormal? Найти похожие ветки
← →
Trimp (2004-12-29 13:38) [0]Продолжаю изучать OpenGl. У меня есть прога c 3d ландшафтом, просчитывается коллизия, к каждому треугольнику просчитана одна нормаль. Из-за этого кажется что ландшафт сделан из бумаги, так как переход яркости от одного треугольника к другому резкий. Мне нужно научиться задавать SmoothNormal, чтоб ландшафт был плавным. Расскажите как это сделать, а лучше скиньте процедуру просчёта SmoothNormal, пожалуйста.
← →
Darthman © (2004-12-29 13:58) [1]ShadeModel задай Smooth и будет сглаженно
← →
Trimp (2004-12-29 14:31) [2]Darthman, увы не помогло. Я слышал, что вроде надо задавать нормаль не одну к треугольнику, а 3, к каждой вершине. Но каков алгоритм? Вот в чём вопрос, поэтому мне нужна процедура.
← →
XProger © (2004-12-30 00:45) [3]Сперва расчиай нормали к каждому треугольнику затем считай для каждой вершины как средне арифметическое между нормалями треугольников к которым она принадлежит.
// Calc face normals
for i := 0 to Header.Faces - 1 do
with FNormal[i] do
begin
v1 := Vertex[Face[i, 0]];
v2 := Vertex[Face[i, 1]];
v3 := Vertex[Face[i, 2]];
w1.X := v2.X - v1.X;
w1.Y := v2.Y - v1.Y;
w1.Z := v2.Z - v1.Z;
w2.X := v3.X - v2.X;
w2.Y := v3.Y - v2.Y;
w2.Z := v3.Z - v2.Z;
X := w2.Y * w1.Z - w2.Z * w1.Y;
Y := w2.Z * w1.X - w2.X * w1.Z;
Z := w2.X * w1.Y - w2.Y * w1.X;
end;
// Calc smooth normals
for i := 0 to Header.Vertices - 1 do
with VNormal[i] do
begin
X := 0;
Y := 0;
Z := 0;
for j := 0 to Header.Faces - 1 do
if (Face[j, 0] = i) or
(Face[j, 1] = i) or
(Face[j, 2] = i) then
begin
X := X + FNormal[j].X;
Y := Y + FNormal[j].Y;
Z := Z + FNormal[j].Z;
end;
d := sqrt(X*X + Y*Y + Z*Z);
if d > 0 then
begin
X := X/d;
Y := Y/d;
Z := Z/d;
end;
end;
Что-то типа этого, но я угол не учитываю между гранями...
Затем отрисовка:
glBegin(GL_TRIANGLES);
for i := 0 to Header.Faces - 1 do
begin
glNormal3fv(@VNormal[Face[i, 0]]);
glVertex3fv(@Vertex[Face[i, 0]]);
glNormal3fv(@VNormal[Face[i, 1]]);
glVertex3fv(@Vertex[Face[i, 1]]);
glNormal3fv(@VNormal[Face[i, 2]]);
glVertex3fv(@Vertex[Face[i, 2]]);
end;
glEnd;
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2005.03.27;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.038 c