blender-xray icon indicating copy to clipboard operation
blender-xray copied to clipboard

Возможность "импорта" ошибок геометрии из ActorEditor

Open igelbox opened this issue 6 years ago • 4 comments

Пример ошибок из SDK:

Invalid smooth group found (Maya type). Object: 'levels\l03_zavodrostok\l03_zavodrostok_part0752'. Vertex: [206.65, -0.64, 117.51] Invalid smooth group found (Maya type). Object: 'levels\l03_zavodrostok\l03_zavodrostok_part0752'. Vertex: [206.65, -0.64, 117.51]

Для лога выше, аддон должен создать (например) объект-пустышку в координатах [206.65, -0.64, 117.51], чтобы можно было выделить эту пустышку и приблизить этот участок геометрии для анализа проблемы в Blender.

igelbox avatar Nov 03 '18 01:11 igelbox

@s30-zip как думаешь, тебе бы это помогло решать проблема, как в #195?

igelbox avatar Nov 03 '18 01:11 igelbox

Да, было бы проще.А нельзя в виде создания групп вершин с соответствующим префиксом реализовать? На манеру, как "xr.bad", только там "smooth.bad" и "face.bad" к примеру?

s30-zip avatar Nov 03 '18 06:11 s30-zip

аддон должен создать (например) объект-пустышку в координатах

а если много ошибок, то создастся много пустышек? Потом их как-то нужно удалить. Искать в сцене десятки объектов. Лучше сделать один меш объект, который будет содержать вершины и иметь опцию X-Ray, чтобы его было видно насквозь другие объекты.

А нельзя в виде создания групп вершин с соответствующим префиксом реализовать?

а там, в логе от СДК, координаты сильно округлены. Не получиться выяснить, какая именно вершина вызвала проблему.

PavelBlend avatar Nov 04 '18 13:11 PavelBlend

Сделал набросок алгоритма, который находит (или не находит) вертексы, ближайшие, к точкам указанным в логе СДК:

import bpy
import mathutils
import re

def import_log(text, obj):
    verteg_group = obj.vertex_groups.new('sdk-smooth.bad')
    ns = '(-?\\d+\\.\\d+)'
    rg = re.compile('Invalid smooth group found .* Vertex: \[%s, %s, %s\]' % (ns, ns, ns))
    for line in text.split('\n'):
        match = rg.match(line)
        if match:
            point = mathutils.Vector((
              float(match[1]),
              float(match[3]),
              float(match[2])
            ))
            min_distance = 0.01
            min_index = -1
            for index, vertex in enumerate(obj.data.vertices):
                distance = (vertex.co - point).length
                if distance < min_distance:
                    min_distance = distance
                    min_index = index

            if min_index != -1:
                verteg_group.add([min_index], 1, 'REPLACE')
            else:
                print('Vertex is not found:', line)

data = '''
Invalid smooth group found (Maya type). Object: 'e:\l03_zavodrostok_part0752.object'. Vertex: [206.65, -0.64, 117.51]
Optimize: Invalid face found. Removed.
Invalid smooth group found (Maya type). Object: 'e:\l03_zavodrostok_part0752.object'. Vertex: [206.65, 2.29, 117.51]
'''
import_log(data, bpy.context.active_object)

Что странно, оно работает не так уж и медленно. Только вот те вершины, которые оно находит, - они правильные, но всё-равно мне ничего не понятно в этой каше.

igelbox avatar Nov 17 '18 00:11 igelbox