Wunderkind & SubDivHero
Wunderkind Wunderkind
Привет, я тут понасстраивал одну нейросеть, которая может предлагать, куда лучше ставить петли в геометрии — смесь кода и художественного чутья, в общем. Хочешь посмотреть, сможет ли она обогнать твою таблицу с оптимизацией сетки?
SubDivHero SubDivHero
Конечно, но не забудь фиксировать количество рёбер в каждом элементе. Моя таблица уже ранжирует их по эффективности, и сомневаюсь, что какая-нибудь нейросеть сможет перехитрить таблицу, которая учитывает количество полигонов и влияние силуэтов. Покажи, что она выдала.
Wunderkind Wunderkind
Вот небольшая проба по триангуляционной сетке, которую я только что вытащил из тестовой сцены. Я зафиксировал исходные значения для каждого кандидата в петли, а затем отсортировал их по моей собственной метрике влияния силуэта (чем выше, тем лучше). ИИ выбрал эти три петли как лучшие – каждая снижает ошибку силуэта на 3–4 %, при этом уменьшая общее количество полигонов примерно на 1 %. ID петли | Количество ребер-петель | Δ силуэта (↓) | Δ полигонов (↓) --------|-----------------|-------------------|---------------- L‑042 | 12 | 3.8 % | 1.0 % L‑179 | 10 | 3.6 % | 0.9 % L‑287 | 14 | 3.5 % | 1.1 % Если ты внесешь эти значения в свою таблицу, порядок будет выглядеть вполне закономерно. ИИ, по сути, проводит быстрое моделирование Монте-Карло по размещению петель, а затем применяет простой оценщик ошибки силуэта, что должно дополнять метрику эффективности полигонов в твоей таблице. Скажи, если тебе понадобится полный скрипт или более глубокий анализ математики оценки ошибки.
SubDivHero SubDivHero
Прикольные данные, но миллион треугольников всё равно кажется грубоватым для модели, чувствительной к силуэтам. Выборки ИИ выглядят неплохо, если смотреть на твои цифры, но мне бы хотелось увидеть, как каждый цикл влияет на кривизну, шумы затенения и реальное количество полигонов в затронутой области. Отправь мне скрипт и код для оценки ошибок, я запущу это в своей таблице, чтобы проверить изменение силуэта на полигон относительно моей метрики эффективности. Тогда и посмотрим, действительно ли три лучшие выборки ИИ выигрывают в общем балле.
Wunderkind Wunderkind
Вот небольшой Python-скетч, который захватывает петлю ребер, считает рёбра, оценивает кривизну и запускает мини-оценщик ошибок силуэта. Вставь его в твою среду и подсовывай результаты в таблицу. ```python import bpy import numpy as np def get_loop_info(obj, loop_index): mesh = obj.data # Grab the edge loop vertices verts = [v.co for v in mesh.vertices] edges = [e for e in mesh.edges] # Find edges in the loop (you’ll need a proper selection routine) loop_edges = [e for e in edges if e.index == loop_index] loop_count = len(loop_edges) # Rough curvature estimate: variance of face normals around loop loop_faces = set() for e in loop_edges: for f in e.link_faces: loop_faces.add(f) normals = np.array([f.normal for f in loop_faces]) curvature = np.var(normals, axis=0).sum() # Silhouette error: difference between original silhouette and projected silhouette # (placeholder – replace with your own renderer callback) silhouette_error = np.random.rand() # dummy value return { 'loop_index': loop_index, 'edge_count': loop_count, 'curvature': curvature, 'silhouette_error': silhouette_error } def error_estimator(loop_info, total_polys): # Simple linear model: silhouette error per polygon return loop_info['silhouette_error'] / total_polys # Example usage obj = bpy.context.active_object total_polys = len(obj.data.polygons) results = [] for idx in [42, 179, 287]: info = get_loop_info(obj, idx) results.append({ 'loop': idx, 'edges': info['edge_count'], 'curv': info['curvature'], 'sil_err': info['silhouette_error'], 'sil_per_poly': error_estimator(info, total_polys) }) print(results) ``` Прогони это на тестовой модели, подгрузи столбец `sil_per_poly` в таблицу и посмотрим, останутся ли лучшие варианты ИИ на вершине, когда учтём кривизну и шум затенения. Сообщи, что показывают числа!
SubDivHero SubDivHero
Выглядит более-менее приемлемо для первого прохода, но ты тянешь край по индексу и потом предполагаешь, что это и есть цикл – так не вытащить настоящий цикл, если ты его заранее не выбрал в интерфейсе. Замени это на нормальный поиск цикла, попробуй использовать bmesh и `bm.edges_from_loop`, если получится. Еще эта оценка кривизны – всего лишь дисперсия нормалей, слишком грубо для редактирования, чувствительного к силуэтам. Вычисляй скалярное произведение нормалей на направление обзора и смотри на градиент вдоль цикла вместо этого. А этот случайный `silhouette_error` – это просто насмешка, подключи нормальный колбэк рендерера или хотя бы проверку проецирования силуэта. Как подкрутишь эти моменты, присылай реальные данные, и я посмотрю, не перебьют ли мои цифры в таблице, что выдает ИИ.