So I know how to create polyhedral dices (dices used in D&D for example), but I don't know how to "stylize" them. For example, I use a code to create normal ph (polyhedral) dices that I found on another answer, here it is:
import bpy
import bmesh
from mathutils import Vector
import random
from math import pi, asin, atan2, cos, sin, radians
# parameters
n = 18 # number of points on sphere
rat = (n - 2) / n # how far along the radius to bisect
u_segments = 32 # UV sphere settings
v_segments = 32
thickness = 0.2 # solidify thickness
TOL = 1e-5
points = [Vector((0, 0, 1))]
for i in range(n - 1):
theta = random.random() * radians(360)
phi = 2 * asin(random.random() * 2 - 1)
points.append(Vector((cos(theta) * cos(phi),
sin(theta) * cos(phi),
sin(phi))))
while True:
# Determine the total force acting on each point.
forces = []
for i in range(len(points)):
p = points[i]
f = Vector()
ftotal = 0
for j in range(len(points)):
if j == i: continue
q = points[j]
# Find the distance vector, and its length.
dv = p - q
dl = dv.length
dl3 = dl * dl * dl
fv = dv / dl3
# Add to the total force on the point p.
f = f + fv
# Stick this in the forces array.
forces.append(f)
# Add to the running sum of the total forces/distances.
ftotal = ftotal + f.length
fscale = 1 if ftotal <= 0.25 else 0.25 / ftotal
# Move each point, and normalise. While we do this, also track
# the distance each point ends up moving.
dist = 0
for i in range(len(points)):
p = points[i]
f = forces[i]
p2 = (p + fscale * f).normalized()
dv = p - p2
dist = dist + dv.length
points[i] = p2
# Done. Check for convergence and finish.
if dist < TOL: # TOL
break
context = bpy.context
scene = context.scene
# make one point north pole.
R = points[0].rotation_difference(Vector((0, 0, 1))).to_matrix()
points = [R * p for p in points]
bm = bmesh.new()
#bmesh.ops.create_icosphere(bm, diameter=1, subdivisions=5 )
bmesh.ops.create_uvsphere(bm,
diameter=1,
u_segments=u_segments,
v_segments=v_segments)
for p in points:
print("-" * 80)
ret = bmesh.ops.bisect_plane(bm,
geom=bm.faces[:]+bm.edges[:]+bm.verts[:],
plane_co= rat * p,
plane_no=-p,
clear_outer=False,
clear_inner=True)
# fill the holes
edges = [e for e in ret["geom_cut"] if isinstance(e, bmesh.types.BMEdge)]
bmesh.ops.contextual_create(bm, geom=edges)
me = bpy.data.meshes.new("dice")
bm.to_mesh(me)
ob = bpy.data.objects.new("dice", me)
scene.objects.link(ob)
scene.objects.active = ob
ob.select = True
ob.location = scene.cursor_location
Now, this code can create perfect functioning dices of any size (by size I mean the amount of "numbers" (sides)), but it can't help me any further. And by further I mean on how do I create dices that look like this:

Should I just create abnormal looks on one side and the just copy it to every side or should I do something more? I know I need to watch out for the weight on every side so that the dices don't stop on just one side more often than the other...