about GMP Code@20190822
This is a brief explanation about GMP(2019-08-22). More details and history of GMP, please see https://sigma6289.tumblr.com.
random.seed(a=None, version=2)
Later I used the multi extrude function, but this command seems to initialize the random number generation. Do this first every time you run so that you always get a fresh random number.
def ~
So many def’s first, I re-defined the BPY command. Because, they are too long to use for me. For example, I want to make an object to ‘edit mode’, bpy command is,
bpy.ops.object.mode_set(mode='EDIT', toggle=False)
it’s tooooo long (for me). I defined it to ‘editMode()’, so I only call,
editMode()
That’s easy.
My code is not special method to make an object. It’s doing the operations instead of my hand. Add a primitive, Select face(s), Extrude(Multi Extrude), Resize, Rotate. Making a body first, apply Subdivision Surface modifier, Select some faces, Extrude(Multi Extrude),,,. In this code, I’m not using a command of Loop Tools, but it’s useful.
obj = bpy.context.object
get an object now selected,
me = obj.data
for getting more detail of mesh data. For accessing each polygon like this.
for p in me.polygons:
if p.area > 1.0:
print(p.index, p.area)
I often use for selecting some polygons,
p.area
p.normal
p.center
if I want to operate the vertices,
for v in me.vertices:
if v.co[0] < 0.0:
~
And materials, I use for selecting the polygons. There is a way to use vertex group for it, but in this way, sometimes I get un-expected result. So I use material index for selecting like this. Of course, it’s needs to be set materials before do it.
for p in me.polygons:
if p.material_index == 3:
p.select = True
The commands like Extrude, Translate, Resize, Rotate,,, are shown on info editor. Do something on a mesh, see here. It’s not perfect but you could find something hint.
------------------------- Code -------------------------
from bpy import *
import bpy
import math, mathutils, random
### Functions --
random.seed(a=None, version=2)
def add_material(obj, material_name, r, g, b):
material = bpy.data.materials.get(material_name)
if material is None:
material = bpy.data.materials.new(material_name)
material.use_nodes = True
principled_bsdf = material.node_tree.nodes.get('Principled BSDF')
if principled_bsdf is not None:
principled_bsdf.inputs[0].default_value = (r, g, b, 1)
obj.active_material = material
def makeMaterialsForParts(obj, colorName, colorNum):
for i in range(colorNum):
bpy.ops.object.material_slot_add()
r = random.random()
g = random.random()
b = random.random()
if i == 0:
r = 1.0
g = 1.0
b = 1.0
material_name = colorName + str(i)
add_material(obj, material_name, r, g, b)
def editMode():
bpy.ops.object.mode_set(mode='EDIT', toggle=False)
def objectMode():
bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
def deselectAllFace():
bpy.ops.mesh.select_all(action='DESELECT')
def selectAllFace():
bpy.ops.mesh.select_all(action='SELECT')
def faceSelectMode():
bpy.ops.mesh.select_mode(use_extend=False, use_expand=False, type='FACE', action='TOGGLE')
def ssDivide(dNum):
bpy.ops.object.modifier_add(type='SUBSURF')
bpy.context.object.modifiers["Subdivision"].levels = dNum
bpy.ops.object.modifier_apply(apply_as='DATA', modifier="Subdivision")
def selectByColor(colID, perc):
obj = bpy.context.object
me = obj.data
objectMode()
for p in me.polygons:
if p.material_index == colID and random.random() < perc:
p.select = 1
def ssModifier(vLevel):
bpy.ops.object.modifier_add(type='SUBSURF')
bpy.context.object.modifiers["Subdivision"].levels = 2
def delHalfAndMir():
editMode()
deselectAllFace()
objectMode()
obData = bpy.context.object.data
for p in obData.polygons:
if p.center[0] < 0.0:
p.select = 1
editMode()
bpy.ops.mesh.delete(type='FACE')
deselectAllFace()
objectMode()
for v in me.vertices:
if v.co[0] < 0.2:
v.co[0] = 0
objectMode()
bpy.ops.object.modifier_add(type='MIRROR')
def clearAllObjects():
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_global=False)
def extrudeOneStep(param):
random.seed(a=None, version=2)
bpy.ops.object.mextrude(off=param[0], offx=param[1], offy=param[2], offz=param[3], rotx=param[4], roty=param[5], rotz=param[6], nrotx=param[7], nroty=param[8], nrotz=param[9], sca=param[10], var1=param[11], var2=param[12], var3=param[13], var4=param[14], num=1, ran=1, opt2=False, opt3=False)
#bpy.ops.object.mextrude(off=0.817222, offx=0, offy=0, offz=0, rotx=0, roty=0, rotz=0, nrotx=0, nroty=0, nrotz=0, sca=0.919753, var1=0, var2=0, var3=0, var4=100, num=1, ran=1, opt1=True, opt2=True)
def multiExtrudeByMaterialNum(mltData):
oldNum = 1.0
for i in range(mltData[15]):
bairitu = math.sin((i + 1) * mltData[16]) * 0.7 + 1
newNum = bairitu/oldNum
param = [mltData[0], mltData[1], mltData[2], mltData[3], mltData[4], mltData[5], mltData[6], mltData[7], mltData[8], mltData[9], newNum, mltData[11], mltData[12], mltData[13], mltData[14]]
extrudeOneStep(param)
oldNum = newNum
def selectByNormalZ(nZ):
editMode()
deselectAllFace()
objectMode()
me = bpy.context.object.data
for p in me.polygons:
if p.normal[2] > nZ:
p.select = True
### -- Functions
# Main --
## Parameters
colNum = 6
symmetry = 1 # 1 = Symmetry, 0 = Asymmetry
bodyLength = 3
headLength = 4
stepDist = 3.0
bodyPhase = random.random() * 20 - 10
freq = random.random() * 10 + 5
rotFreq = random.random() * 5
rotPhase = random.random() * 20 - 10
rotStep = random.uniform(-30, 30)
pp = 5.0
baseScale = 0.8
print('bodyPhase =', bodyPhase)
print('freq =', freq)
print('rotFreq =', rotFreq)
print('rotPhase =', rotPhase)
print('rotStep =', rotStep)
##
### Clear All Objects
clearAllObjects()
### makebody
#bpy.ops.mesh.primitive_plane_add(enter_editmode=False, location=(0, 0, 0))
bpy.ops.mesh.primitive_cube_add(enter_editmode=False, location=(0, 0, 0))
editMode()
bpy.context.object.data.use_mirror_x = True
deselectAllFace()
objectMode()
obj = bpy.context.object
me = obj.data
#editMode()
#bpy.ops.transform.rotate(value=-1.5708, orient_axis='X', orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', constraint_axis=(True, False, False), mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)
### set each Color
## make colors
makeMaterialsForParts(obj, "newMaterials", colNum)
#editMode()
#setFaceColor(1)
oldScale = 1.0
objectMode()
me = bpy.context.object.data
for p in me.polygons:
if p.index == 0 or p.index == 2:
p.material_index = 0
else:
p.material_index = p.index
editMode()
deselectAllFace()
## body
selectByColor(3, 1.0)
bpy.ops.transform.resize(value=(2, 2, 2), orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)
for i in range(bodyLength):
objectMode()
for p in me.polygons:
if p.select == True:
bairitu = math.sqrt(p.area)
pp = bairitu * stepDist
#print(p.area)
#else:
# bairitu = 1.0
editMode()
newScale = (math.sin((i + bodyPhase) * freq) * 1.2 + 1.5)/oldScale * baseScale
rotDir = math.cos(math.radians(i * 10 * rotFreq + rotPhase))
if rotDir == 0:
rotAngle = 0
elif rotDir > 0:
rotAngle = rotStep
elif rotDir < 0:
rotAngle = -rotStep
#rotAngle = math.sin(math.radians(i * rotFreq * 10)) * 10
#print(newScale)
bpy.ops.mesh.extrude_region_shrink_fatten(MESH_OT_extrude_region={"use_normal_flip":False, "mirror":False}, TRANSFORM_OT_shrink_fatten={"value":-stepDist, "use_even_offset":False, "mirror":False, "use_proportional_edit":False, "proportional_edit_falloff":'SMOOTH', "proportional_size":1, "use_proportional_connected":False, "use_proportional_projected":False, "snap":False, "snap_target":'CLOSEST', "snap_point":(0, 0, 0), "snap_align":False, "snap_normal":(0, 0, 0), "release_confirm":False, "use_accurate":False})
bpy.ops.transform.resize(value=(newScale * 1.1, newScale, newScale), orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)
bpy.ops.transform.rotate(value=math.radians(rotAngle), orient_axis='Z', orient_type='VIEW', orient_matrix=((-4.93038e-32, -1, -2.22045e-16), (-2.22045e-16, -4.93038e-32, -1), (-1, -2.22045e-16, -4.93038e-32)), orient_matrix_type='VIEW', mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)
#print(oldScale, newScale, newScale/oldScale)
oldScale = newScale
#stepDist = stepDist * bairitu ** 2
deselectAllFace()
selectByColor(4, 1.0)
editMode()
bpy.ops.transform.resize(value=(1, 1, 1), orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', constraint_axis=(True, False, False), mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)
deselectAllFace()
## head
selectByColor(1, 1.0)
for i in range(headLength):
objectMode()
for p in me.polygons:
if p.select == True:
bairitu = math.sqrt(p.area)
pp = bairitu * stepDist
#print(p.area)
#else:
# bairitu = 1.0
editMode()
newScale = (math.sin((i + bodyPhase) * freq) * 1.0 + 1.0)/oldScale * baseScale
rotDir = math.cos(math.radians(i * -10 * rotFreq + rotPhase))
if rotDir == 0:
rotAngle = 0
elif rotDir > 0:
rotAngle = rotStep
elif rotDir < 0:
rotAngle = -rotStep
#rotAngle = math.sin(math.radians(i * rotFreq * 10)) * 10
#print(newScale)
bpy.ops.mesh.extrude_faces_move(MESH_OT_extrude_faces_indiv={"mirror":False}, TRANSFORM_OT_shrink_fatten={"value":-stepDist * 0.7, "use_even_offset":False, "mirror":False, "use_proportional_edit":False, "proportional_edit_falloff":'SMOOTH', "proportional_size":1, "use_proportional_connected":False, "use_proportional_projected":False, "snap":False, "snap_target":'CLOSEST', "snap_point":(0, 0, 0), "snap_align":False, "snap_normal":(0, 0, 0), "release_confirm":False, "use_accurate":False})
#bpy.ops.mesh.extrude_region_shrink_fatten(MESH_OT_extrude_region={"use_normal_flip":False, "mirror":False}, TRANSFORM_OT_shrink_fatten={"value":-stepDist, "use_even_offset":False, "mirror":False, "use_proportional_edit":False, "proportional_edit_falloff":'SMOOTH', "proportional_size":1, "use_proportional_connected":False, "use_proportional_projected":False, "snap":False, "snap_target":'CLOSEST', "snap_point":(0, 0, 0), "snap_align":False, "snap_normal":(0, 0, 0), "release_confirm":False, "use_accurate":False})
bpy.ops.transform.resize(value=(newScale, newScale, newScale), orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)
bpy.ops.transform.rotate(value=math.radians(rotAngle), orient_axis='Z', orient_type='VIEW', orient_matrix=((-4.93038e-32, -1, -2.22045e-16), (-2.22045e-16, -4.93038e-32, -1), (-1, -2.22045e-16, -4.93038e-32)), orient_matrix_type='VIEW', mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)
#print(oldScale, newScale, newScale/oldScale)
oldScale = newScale
#stepDist = stepDist * bairitu ** 2
deselectAllFace()
selectByColor(4, 1.0)
editMode()
bpy.ops.transform.resize(value=(0.9, 1, 1), orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', constraint_axis=(True, False, False), mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)
deselectAllFace()
#objectMode()
#for p in me.polygons:
# if p.material_index == 0 and random.random() < 0.25:
# p.select = True
#
#editMode()
#param = [3.0, 0,0,0,0,0,0,0,0,0,1.0,0,0,0,100]
#extrudeOneStep(param)
##bpy.ops.object.mextrude(off=2, rotx=0, roty=0, rotz=0, nrotx=-0.2, nroty=-0.3, nrotz=-0.8, sca=1.01, var1=0.290572, var2=-0.148377, var3=0, num=1, opt1=True, opt2=True)
#deselectAllFace()
### -- makebody
###
obj = bpy.context.object
me = obj.data
editMode()
faceSelectMode()
objectMode()
ssDivide(1)
if symmetry == 1:
delHalfAndMir()
editMode()
deselectAllFace()
selectByColor(4, 0.6)
#selectByNormalZ(-0.9)
editMode()
param = [1.0, 0,0,0,0,0,0,0,0,0,0.8,0,0,0,100]
extrudeOneStep(param)
bpy.ops.object.mextrude(off=1.0, rotx=0, roty=-10, rotz=0, nrotx=-10.2009, nroty=-10, nrotz=-3, sca=0.8, var1=0.2, var2=-0.148377, var3=0, num=7, opt1=True, opt2=True)
deselectAllFace()
selectByColor(5, 0.6)
#selectByNormalZ(0.9)
editMode()
param = [1.0, 0,0,0,0,0,0,0,0,0,0.4,0,0,0,100]
extrudeOneStep(param)
bpy.ops.object.mextrude(off=1.0, rotx=0, roty=0, rotz=10, nrotx=-0, nroty=-2.96754, nrotz=-8.53168, sca=0.9, var1=0, var2=-1.0, var3=0, num=1, opt1=True, opt2=True)
deselectAllFace()
#selectByColor(1, 0.3)
#editMode()
#mData = [0.6, 0, 0, 0, -10, 10, -10, 0, 10, 0, 1.0, 0, 0.5, 0, 100, 8, 0.6]
#multiExtrudeByMaterialNum(mData)
objectMode()
ssModifier(2)
bpy.ops.object.shade_smooth()
------------------------- Code -------------------------
0 notes