Пусть в нашей сцене в Blender на меше есть два полигона, и мы хотим проверить в одну ли сторону смотрят их нормали, и развернуть одну из них, если они разнонаправленны. Мы можем проделать все это при помощи Blender Python API.
Для начала создадим объект BMesh и перенесем в него геометрию текущего активного объекта.
Если мы находимся в режиме редактирования, мы можем сделать это одной командой.
|
1 |
bm = bmesh.from_edit_mesh(bpy.context.object.data) |
Приведем в соответствие индексы полигонов.
|
1 |
bm.faces.ensure_lookup_table() |
Возьмем два полигона для сверки их нормалей.
|
1 2 3 4 5 |
face1 = bm.faces[0] # <BMFace(0x000001A909562C50), index=0, totverts=4> face2 = bm.faces[1] # <BMFace(0x000001A909562C88), index=1, totverts=4> |
Вычислим скалярное произведение для их векторов нормалей.
|
1 2 3 |
dot_product = face1.normal.dot(face2.normal) # -1.0 |
Если скалярное произведение двух векторов меньше нуля, значит они направлены противоположно. Следовательно, нормали наших полигонов тоже направлены в противоположные стороны.
Чтобы сонаправить обе нормали, развернем нормаль на втором полигоне на 180 градусов.
|
1 2 |
if dot_product < 0: face2.normal_flip() |
Обновим данные по нормалям в BMesh.
|
1 |
bm.normal_update() |
И теперь мы можем вернуть измененную геометрию из BMesh в объект в сцене. Заодно очистим ненужный нам больше объект BMesh.
|
1 2 |
bmesh.update_edit_mesh(bpy.context.object.data) bm.free() |
Таким образом мы проверили направление нормалей у двух выбранных полигонов активного меша. И раз нормали у них направлены в противоположные стороны, мы развернули нормаль на втором полигоне и теперь обе нормали смотрят в одну сторону.

.blend file on Patreon