Войти
ПрограммированиеФорумГрафика

Нормали в GS (4 стр)

Страницы: 1 2 3 4 5 6 Следующая »
#45
14:05, 10 фев. 2020

Polyflow3d
> Кстати, а чего они так долго у тебя считаются ?
>
>
Это пересчет индексов треугольников идет, а не нормалей.
Нормали мгновенно считаются.
У меня треугольники последовательно в массиве лежат,
а для сглаженных нужно чтобы общие вершины были.
Вот это и есть поиск общих вершин. Считает CPU.

#46
15:22, 10 фев. 2020

Polyflow3d
> по этому нормал мап ляжет криво
Не использую нормали из приложений. Они потом расчитываются при загрузке.
Хотя возвожность использовать нормали из приложений оставил. Мало ли :)
Пока все совпадает.

#47
15:51, 10 фев. 2020

eDmk
> Вот это и есть поиск общих вершин.
сколько по времени на модельке с 1кк треугольников? :)

#48
16:17, 10 фев. 2020

Aroch
Это больной вопрос :)  102k поликов ~ 1 минута.
Работаем над алгоритмом.

#49
18:28, 10 фев. 2020

Всё-таки не очень понятно, зачем нужно общие вершины искать.
Я в своё время проходил по списку треугольников, считал нормаль для треугольника, добавлял её к каждой вершине треугольника. Потом (отдельным циклом по вершинам) делал нормализацию.
Получалось неидеально, но в целом неплохо. И работало относительно быстро.

#50
19:59, 10 фев. 2020

invis
> Всё-таки не очень понятно, зачем нужно общие вершины искать.
потому что у него смежные треугольники состоят из уникальных вершин хоть и имеющие одинаковые координаты.

#51
(Правка: 20:04) 20:00, 10 фев. 2020

Aroch
В точку! Разобранный на отдельные треугольники меш.

#52
(Правка: 21:10) 21:09, 10 фев. 2020

eDmk
> Это больной вопрос :)  102k поликов ~ 1 минута.
> Работаем над алгоритмом.
Чё. Что там у тебя за алгоритм? Обычно нормали через hash мапу мержат (TDictionary в делфи), и для 100К это должно занимать отсилы пол секунды.

#53
21:10, 10 фев. 2020

MrShoor
> Обычно нормали через hash мапу мержат
У меня индексы, а не нормали. Там алгоритм N^2. Иначе не получается пока, но мы работаем.

#54
21:12, 10 фев. 2020

eDmk
> У меня индексы, а не нормали.
Тьфу, я оговорился, имел ввиду вершины.

#55
(Правка: 21:19) 21:18, 10 фев. 2020

eDmk
Держи примерный код:

procedure BuildIndexedMesh(AInVertices: TList<TVertex>;  AOutVertices: TList<TVertex>; AOutIndices: TList<Integer>);
var i: Integer;
    indicesMap: TDictionary<TVertex, Integer>;
    ind: Integer;
begin
  indicesMap := TDictionary<TVertex, Integer>.Create;
  for i := 0 to AInVertices.Count - 1 do
  begin
    if not indicesMap.TryGetValue(AInVertices[i], ind) then
    begin
      ind := AOutVertices.Count;
      indicesMap.Add(AInVertices[i], ind);
      AOutVertices.Add(AInVertices[i]);
    end;
    AOutIndices.Add(ind);
  end;
  indicesMap.Free;
end;
набирал прям в браузере, поэтому возможны ошибки, но идея должна быть понятной.
#56
21:29, 10 фев. 2020

MrShoor
> Что там у тебя за алгоритм?
Вот :) Часть на асме написал для скорости.

+ Показать
#57
21:35, 10 фев. 2020

eDmk
AddNormalToSimilarPoints - тупой линейный перебор. Заменяешь на Dictionary как из поста выше, и все ускоряется в 100500 раз.

#58
22:49, 10 фев. 2020

eDmk
Вот примерно твой код, только через хешмапу:

procedure EnableSmoothNormals;
var
  i: Integer;
  N: TVec3;
  pointsMap: TDictionary<TVertex, TVec3>;
begin
  pointsMap := TDictionary<TVertex, TVec3>.Create;
  if (FNumPoints > 0) then
  begin
    // обнуляем нормали, закидываем вершины с нулевыми нормалями в Dictionary
    for i := Low(FPoints) to High(FPoints) do 
    begin
        FPoints[i].Normal := Zero;
        pointsMap.AddOrSetValue(FPoints[i], Zero);
    end;

    // Считаем нормали для треугольников
    for i := 0 to (FNumTriangles - 1) do
    begin
      // Читаем точки треугольника
      TriangleByIndex(i, FPLA);
      // Считаем нормаль
      N := Cross(FPLA.B - FPLA.A, FPLA.C - FPLA.A);
      // добавляем нормаль к точке
      pointsMap[FPLA.A] := pointsMap[FPLA.A] + N;
      pointsMap[FPLA.B] := pointsMap[FPLA.B] + N;
      pointsMap[FPLA.C] := pointsMap[FPLA.C] + N;
    end;//for

    //Вычисляем усредненную нормаль и записываем её в FPoints
    for i := Low(FPoints) to High(FPoints) do
    begin
      N := pointsMap[FPoints[i]];
      FPoints[i].Normal := normalize(N);
    end;

    // Расчет отрезков нормалей
    UpdateLines;

    // Обновим буферы
    SendNormalsBuffer;
    SendLinesBuffer;
  end;
  pointsMap.Free;
end;
#59
22:59, 10 фев. 2020

eDmk
Можно заюзать октодрево для ускорения поиска совпадающих вершин.

Страницы: 1 2 3 4 5 6 Следующая »
ПрограммированиеФорумГрафика