2

This question might seem weird but, I would go with it since I don't know what to call this.

So I know that blender has a poke face option, which is very handy to make tower structures by combining it with a wireframe modifier.

enter image description here

I ran into a problem where the faces has to be in this pattern.

enter image description here I don't know a way to make this without using a knife tool. Since I have a lot of faces it wouldn't be ideal to use the knife tool.

So my question is that "is there a way to make this topology in a easy way ?"

Nand 27
  • 599
  • 2
  • 9
  • 1
    Since it's for a tower, can we presume that it is only vertical faces, with the extra poke edge being horizontal? Could do something akin to https://blender.stackexchange.com/a/214722/15543 – batFINGER Jul 07 '21 at 17:58

1 Answers1

7

"Scaffold Poke" Bmesh script.

Of the selected quad faces, bisect all vertical edges, then poke the face.

enter image description here Result on defaults: Cube and UV Sphere

Similarly to

https://blender.stackexchange.com/a/118497/15543

select faces in edit mode run script,

  • of those faces reduce to only quads.

  • Find all the connected edges aligned with the Z axis, and bisect them

  • Any selected face now with 6 verts is "scaffold poked" by poking the ngon

Test script.

import bpy
import bmesh
from mathutils import Vector

context = bpy.context ob = context.edit_object me = ob.data bm = bmesh.from_edit_mesh(me) axis = Vector((0, 0, 1)) faces = [f for f in bm.faces if f.select and len(f.verts) == 4]

def aligned(e): d = (e.verts[1].co - e.verts[0].co).normalized() return abs(d.dot(axis)) > 0.5

bmesh.ops.bisect_edges(bm, edges=[e for e in bm.edges if any(f.select for f in e.link_faces) and aligned(e) ], cuts=1, )

poke

bmesh.ops.poke( bm,
faces=[f for f in faces if len(f.verts) == 6], )

bmesh.update_edit_mesh(me)

or alternatively instead of poking

  • Add a new vert at face center

  • List the faces edges, remove face and make tris from edge verts + center verts.

Replace from #poke

# poke
for f in faces:
if len(f.edges) != 6:
    f.select_set(False)
    continue
v = bm.verts.new(f.calc_center_median())
v.normal = f.normal
edges = f.edges[:]
bm.faces.remove(f)
for e in edges:
    f = bm.faces.new([v] + e.verts[:])
    f.select_set(True)

bm.normal_update() bmesh.update_edit_mesh(me)

batFINGER
  • 84,216
  • 10
  • 108
  • 233
  • that worked ! it's very handy to have python for these stuff but still hard to write it on my own. anyway thanks for your quick reply! :D Have a nice day! – Nand 27 Jul 07 '21 at 20:49