本文整理汇总了Python中BPyMesh.meshCalcNormals方法的典型用法代码示例。如果您正苦于以下问题:Python BPyMesh.meshCalcNormals方法的具体用法?Python BPyMesh.meshCalcNormals怎么用?Python BPyMesh.meshCalcNormals使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类BPyMesh
的用法示例。
在下文中一共展示了BPyMesh.meshCalcNormals方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: write
# 需要导入模块: import BPyMesh [as 别名]
# 或者: from BPyMesh import meshCalcNormals [as 别名]
#.........这里部分代码省略.........
break
if has_quads:
oldmode = Mesh.Mode()
Mesh.Mode(Mesh.SelectModes['FACE'])
me.sel = True
tempob = scn.objects.new(me)
me.quadToTriangle(0) # more=0 shortest length
oldmode = Mesh.Mode(oldmode)
scn.objects.unlink(tempob)
Mesh.Mode(oldmode)
# Make our own list so it can be sorted to reduce context switching
faces = [ f for f in me.faces ]
if EXPORT_EDGES:
edges = me.edges
else:
edges = []
if not (len(faces)+len(edges)+len(me.verts)): # Make sure there is somthing to write
continue # dont bother with this mesh.
if EXPORT_ROTX90:
me.transform(ob_mat*mat_xrot90)
else:
me.transform(ob_mat)
# High Quality Normals
if EXPORT_NORMALS and faces:
if EXPORT_NORMALS_HQ:
BPyMesh.meshCalcNormals(me)
else:
# transforming normals is incorrect
# when the matrix is scaled,
# better to recalculate them
me.calcNormals()
# # Crash Blender
#materials = me.getMaterials(1) # 1 == will return None in the list.
materials = me.materials
materialNames = []
materialItems = materials[:]
if materials:
for mat in materials:
if mat: # !=None
materialNames.append(mat.name)
else:
materialNames.append(None)
# Cant use LC because some materials are None.
# materialNames = map(lambda mat: mat.name, materials) # Bug Blender, dosent account for null materials, still broken.
# Possible there null materials, will mess up indicies
# but at least it will export, wait until Blender gets fixed.
materialNames.extend((16-len(materialNames)) * [None])
materialItems.extend((16-len(materialItems)) * [None])
# Sort by Material, then images
# so we dont over context switch in the obj file.
if EXPORT_KEEP_VERT_ORDER:
pass
elif faceuv:
try: faces.sort(key = lambda a: (a.mat, a.image, a.smooth))
示例2: export_map
# 需要导入模块: import BPyMesh [as 别名]
# 或者: from BPyMesh import meshCalcNormals [as 别名]
def export_map(filepath):
pup_block = [\
('Scale:', PREF_SCALE, 1, 1000, 'Scale the blender scene by this value.'),\
('Face Width:', PREF_FACE_THICK, 0.01, 10, 'Thickness of faces exported as brushes.'),\
('Grid Snap', PREF_GRID_SNAP, 'snaps floating point values to whole numbers.'),\
'Null Texture',\
('', PREF_NULL_TEX, 1, 128, 'Export textureless faces with this texture'),\
'Unseen Texture',\
('', PREF_INVIS_TEX, 1, 128, 'Export invisible faces with this texture'),\
]
if not Draw.PupBlock('map export', pup_block):
return
Window.WaitCursor(1)
time= sys.time()
print 'Map Exporter 0.0'
file= open(filepath, 'w')
obs_mesh= []
obs_lamp= []
obs_surf= []
obs_empty= []
SCALE_MAT= Mathutils.Matrix()
SCALE_MAT[0][0]= SCALE_MAT[1][1]= SCALE_MAT[2][2]= PREF_SCALE.val
dummy_mesh= Mesh.New()
TOTBRUSH= TOTLAMP= TOTNODE= 0
for ob in Object.GetSelected():
type= ob.type
if type == 'Mesh': obs_mesh.append(ob)
elif type == 'Surf': obs_surf.append(ob)
elif type == 'Lamp': obs_lamp.append(ob)
elif type == 'Empty': obs_empty.append(ob)
if obs_mesh or obs_surf:
# brushes and surf's must be under worldspan
file.write('\n// entity 0\n')
file.write('{\n')
file.write('"classname" "worldspawn"\n')
print '\twriting cubes from meshes'
for ob in obs_mesh:
dummy_mesh.getFromObject(ob.name)
#print len(mesh_split2connected(dummy_mesh))
# Is the object 1 cube? - object-is-a-brush
dummy_mesh.transform(ob.matrixWorld*SCALE_MAT) # 1 to tx the normals also
if PREF_GRID_SNAP.val:
for v in dummy_mesh.verts:
co= v.co
co.x= round(co.x)
co.y= round(co.y)
co.z= round(co.z)
# High quality normals
BPyMesh.meshCalcNormals(dummy_mesh)
# Split mesh into connected regions
for face_group in BPyMesh.mesh2linkedFaces(dummy_mesh):
if is_cube_facegroup(face_group):
write_cube2brush(file, face_group)
TOTBRUSH+=1
elif is_tricyl_facegroup(face_group):
write_cube2brush(file, face_group)
TOTBRUSH+=1
else:
for f in face_group:
write_face2brush(file, f)
TOTBRUSH+=1
#print 'warning, not exporting "%s" it is not a cube' % ob.name
dummy_mesh.verts= None
valid_dims= 3,5,7,9,11,13,15
for ob in obs_surf:
'''
Surf, patches
'''
surf_name= ob.getData(name_only=1)
data= Curve.Get(surf_name)
mat = ob.matrixWorld*SCALE_MAT
# This is what a valid patch looks like
"""
// brush 0
{
patchDef2
#.........这里部分代码省略.........
示例3: redux
# 需要导入模块: import BPyMesh [as 别名]
# 或者: from BPyMesh import meshCalcNormals [as 别名]
#.........这里部分代码省略.........
w1*=2
w2= 1-w1
new_loc_smart= v2co*w2 + smart_offset_loc*w1
if new_loc_smart.x != new_loc_smart.x: # NAN LOCATION, revert to between
new_loc_smart= None
return new_loc_smart, between, v1co*0.99999 + v2co*0.00001, v1co*0.00001 + v2co*0.99999
class collapseFace(object):
__slots__ = 'verts', 'normal', 'area', 'index', 'orig_uv', 'orig_col', 'uv', 'col' # , 'collapse_edge_count'
def __init__(self, f):
self.init_from_face(f)
def init_from_face(self, f):
self.verts= f.v
self.normal= f.no
self.area= f.area
self.index= f.index
if DO_UV:
self.orig_uv= [uv_key(uv) for uv in f.uv]
self.uv= f.uv
if DO_VCOL:
self.orig_col= [col_key(col) for col in f.col]
self.col= f.col
collapse_edges= collapse_faces= None
# So meshCalcNormals can avoid making a new list all the time.
reuse_vertNormals= [ Vector() for v in xrange(len(me.verts)) ]
while target_face_count <= len(me.faces):
BPyMesh.meshCalcNormals(me, reuse_vertNormals)
if DO_WEIGHTS:
#groupNames, vWeightDict= BPyMesh.meshWeight2Dict(me)
groupNames, vWeightList= BPyMesh.meshWeight2List(me)
# THIS CRASHES? Not anymore.
verts= list(me.verts)
edges= list(me.edges)
faces= list(me.faces)
# THIS WORKS
#verts= me.verts
#edges= me.edges
#faces= me.faces
# if DEBUG: DOUBLE_CHECK= [0]*len(verts)
me.sel= False
if not collapse_faces: # Initialize the list.
collapse_faces= [collapseFace(f) for f in faces]
collapse_edges= [collapseEdge(ed) for ed in edges]
else:
for i, ed in enumerate(edges):
collapse_edges[i].init_from_edge(ed)
# Strip the unneeded end off the list
collapse_edges[i+1:]= []
for i, f in enumerate(faces):
collapse_faces[i].init_from_face(f)
# Strip the unneeded end off the list
示例4: solidify
# 需要导入模块: import BPyMesh [as 别名]
# 或者: from BPyMesh import meshCalcNormals [as 别名]
def solidify(me, PREF_THICK, PREF_SKIN_SIDES=True, PREF_REM_ORIG=False, PREF_COLLAPSE_SIDES=False):
# Main code function
me_faces = me.faces
faces_sel= [f for f in me_faces if f.sel]
BPyMesh.meshCalcNormals(me)
normals= [v.no for v in me.verts]
vertFaces= [[] for i in xrange(len(me.verts))]
for f in me_faces:
no=f.no
for v in f:
vertFaces[v.index].append(no)
# Scale the normals by the face angles from the vertex Normals.
for i in xrange(len(me.verts)):
length=0.0
if vertFaces[i]:
for fno in vertFaces[i]:
try:
a= Ang(fno, normals[i])
except:
a= 0
if a>=90:
length+=1
elif a < SMALL_NUM:
length+= 1
else:
length+= angleToLength(a)
length= length/len(vertFaces[i])
#print 'LENGTH %.6f' % length
# normals[i]= (normals[i] * length) * PREF_THICK
normals[i] *= length * PREF_THICK
len_verts = len( me.verts )
len_faces = len( me_faces )
vert_mapping= [-1] * len(me.verts)
verts= []
for f in faces_sel:
for v in f:
i= v.index
if vert_mapping[i]==-1:
vert_mapping[i]= len_verts + len(verts)
verts.append(v.co + normals[i])
#verts= [v.co + normals[v.index] for v in me.verts]
me.verts.extend( verts )
#faces= [tuple([ me.verts[v.index+len_verts] for v in reversed(f.v)]) for f in me_faces ]
faces= [ tuple([vert_mapping[v.index] for v in reversed(f.v)]) for f in faces_sel ]
me_faces.extend( faces )
# Old method before multi UVs
"""
has_uv = me.faceUV
has_vcol = me.vertexColors
for i, orig_f in enumerate(faces_sel):
new_f= me_faces[len_faces + i]
new_f.mat = orig_f.mat
new_f.smooth = orig_f.smooth
orig_f.sel=False
new_f.sel= True
new_f = me_faces[i+len_faces]
if has_uv:
new_f.uv = [c for c in reversed(orig_f.uv)]
new_f.mode = orig_f.mode
new_f.flag = orig_f.flag
if orig_f.image:
new_f.image = orig_f.image
if has_vcol:
new_f.col = [c for c in reversed(orig_f.col)]
"""
copy_facedata_multilayer(me, faces_sel, [me_faces[len_faces + i] for i in xrange(len(faces_sel))])
if PREF_SKIN_SIDES or PREF_COLLAPSE_SIDES:
skin_side_faces= []
skin_side_faces_orig= []
# Get edges of faces that only have 1 user - so we can make walls
edges = {}
# So we can reference indicies that wrap back to the start.
ROT_TRI_INDEX = 0,1,2,0
ROT_QUAD_INDEX = 0,1,2,3,0
for f in faces_sel:
f_v= f.v
for i, edgekey in enumerate(f.edge_keys):
if edges.has_key(edgekey):
edges[edgekey]= None
else:
if len(f_v) == 3:
edges[edgekey] = f, f_v, i, ROT_TRI_INDEX[i+1]
else:
#.........这里部分代码省略.........
示例5: write
# 需要导入模块: import BPyMesh [as 别名]
# 或者: from BPyMesh import meshCalcNormals [as 别名]
#.........这里部分代码省略.........
# We have a valid mesh
if me.faces:
# Add a dummy object to it.
has_quads = False
for f in me.faces:
if len(f) == 4:
has_quads = True
break
if has_quads:
oldmode = Mesh.Mode()
Mesh.Mode(Mesh.SelectModes['FACE'])
me.sel = True
tempob = scn.objects.new(me)
me.quadToTriangle(0) # more=0 shortest length
oldmode = Mesh.Mode(oldmode)
scn.objects.unlink(tempob)
Mesh.Mode(oldmode)
# Make our own list so it can be sorted to reduce context switching
faces = [ f for f in me.faces ]
edges = me.edges
if not (len(faces)+len(edges)+len(me.verts)): # Make sure there is somthing to write
continue # dont bother with this mesh.
me.transform(ob_mat)
# High Quality Normals
if faces:
if EXPORT_NORMALS_HQ:
BPyMesh.meshCalcNormals(me)
else:
# transforming normals is incorrect
# when the matrix is scaled,
# better to recalculate them
me.calcNormals()
# # Crash Blender
#materials = me.getMaterials(1) # 1 == will return None in the list.
materials = me.materials
materialNames = []
materialItems = materials[:]
if materials:
for mat in materials:
if mat: # !=None
materialNames.append(mat.name)
else:
materialNames.append(None)
# Cant use LC because some materials are None.
# materialNames = map(lambda mat: mat.name, materials) # Bug Blender, dosent account for null materials, still broken.
# Possible there null materials, will mess up indicies
# but at least it will export, wait until Blender gets fixed.
materialNames.extend((16-len(materialNames)) * [None])
materialItems.extend((16-len(materialItems)) * [None])
# Sort by Material, then images
# so we dont over context switch in the obj file.
if faceuv:
try: faces.sort(key = lambda a: (a.mat, a.image, a.smooth))
except: faces.sort(lambda a,b: cmp((a.mat, a.image, a.smooth), (b.mat, b.image, b.smooth)))
elif len(materials) > 1:
示例6: vertexFakeAO
# 需要导入模块: import BPyMesh [as 别名]
# 或者: from BPyMesh import meshCalcNormals [as 别名]
def vertexFakeAO(me, PREF_BLUR_ITERATIONS, PREF_BLUR_STRENGTH, PREF_CLAMP_CONCAVE, PREF_CLAMP_CONVEX, PREF_SHADOW_ONLY, PREF_SEL_ONLY):
Window.WaitCursor(1)
Ang= Mathutils.AngleBetweenVecs
BPyMesh.meshCalcNormals(me)
vert_tone= [0.0] * len(me.verts)
vert_tone_count= [0] * len(me.verts)
min_tone=0
max_tone=0
for i, f in enumerate(me.faces):
fc= f.cent
fno = f.no
for v in f.v:
vno=v.no # get a scaled down normal.
dot= vno.dot(v.co) - vno.dot(fc)
vert_tone_count[v.index]+=1
try:
a= Ang(vno, fno)
except:
continue
# Convex
if dot>0:
a= min(PREF_CLAMP_CONVEX, a)
if not PREF_SHADOW_ONLY:
vert_tone[v.index] += a
else:
a= min(PREF_CLAMP_CONCAVE, a)
vert_tone[v.index] -= a
# average vert_tone_list into vert_tonef
for i, tones in enumerate(vert_tone):
if vert_tone_count[i]:
vert_tone[i] = vert_tone[i] / vert_tone_count[i]
# Below we use edges to blur along so the edges need counting, not the faces
vert_tone_count= [0] * len(me.verts)
for ed in me.edges:
vert_tone_count[ed.v1.index] += 1
vert_tone_count[ed.v2.index] += 1
# Blur tone
blur = PREF_BLUR_STRENGTH
blur_inv = 1.0 - PREF_BLUR_STRENGTH
for i in xrange(PREF_BLUR_ITERATIONS):
# backup the original tones
orig_vert_tone= list(vert_tone)
for ed in me.edges:
i1= ed.v1.index
i2= ed.v2.index
val1= (orig_vert_tone[i2]*blur) + (orig_vert_tone[i1]*blur_inv)
val2= (orig_vert_tone[i1]*blur) + (orig_vert_tone[i2]*blur_inv)
# Apply the ton divided by the number of faces connected
vert_tone[i1]+= val1 / max(vert_tone_count[i1], 1)
vert_tone[i2]+= val2 / max(vert_tone_count[i2], 1)
min_tone= min(vert_tone)
max_tone= max(vert_tone)
#print min_tone, max_tone
tone_range= max_tone-min_tone
if max_tone==min_tone:
return
for f in me.faces:
if not PREF_SEL_ONLY or f.sel:
f_col= f.col
for i, v in enumerate(f):
col= f_col[i]
tone= vert_tone[v.index]
tone= (tone-min_tone)/tone_range
col.r= int(tone*col.r)
col.g= int(tone*col.g)
col.b= int(tone*col.b)
Window.WaitCursor(0)