2
$\begingroup$

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 ?"

$\endgroup$
1
  • 1
    $\begingroup$ 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 blender.stackexchange.com/a/214722/15543 $\endgroup$
    – batFINGER
    Commented Jul 7, 2021 at 17:58

1 Answer 1

7
$\begingroup$

"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)
$\endgroup$
1
  • $\begingroup$ 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! $\endgroup$
    – Nand 27
    Commented Jul 7, 2021 at 20:49

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .