「Dev:Py/Scripts/Cookbook/Code snippets/Materials and textures」の版間の差分
< Dev:Py | Scripts | Cookbook | Code snippets
細 (moved Dev:2.5/Py/Scripts/Cookbook/Code snippets/Materials and textures to Dev:Py/Scripts/Cookbook/Code snippets/Materials and textures: remove version namespace) |
細 (1版 をインポートしました) |
(相違点なし)
|
2018年6月29日 (金) 04:43時点における最新版
Materials and textures
Materials
This program adds a red, opaque material and a blue, semi-transparent one, add assigns them to a cube an sphere, respectively.
#----------------------------------------------------------
# File material.py
#----------------------------------------------------------
import bpy
def makeMaterial(name, diffuse, specular, alpha):
mat = bpy.data.materials.new(name)
mat.diffuse_color = diffuse
mat.diffuse_shader = 'LAMBERT'
mat.diffuse_intensity = 1.0
mat.specular_color = specular
mat.specular_shader = 'COOKTORR'
mat.specular_intensity = 0.5
mat.alpha = alpha
mat.ambient = 1
return mat
def setMaterial(ob, mat):
me = ob.data
me.materials.append(mat)
def run(origin):
# Create two materials
red = makeMaterial('Red', (1,0,0), (1,1,1), 1)
blue = makeMaterial('BlueSemi', (0,0,1), (0.5,0.5,0), 0.5)
# Create red cube
bpy.ops.mesh.primitive_cube_add(location=origin)
setMaterial(bpy.context.object, red)
# and blue sphere
bpy.ops.mesh.primitive_uv_sphere_add(location=origin)
bpy.ops.transform.translate(value=(1,0,0))
setMaterial(bpy.context.object, blue)
if __name__ == "__main__":
run((0,0,0))
Textures
This program creates a material with two textures: an image texture mapped to color and alpha, and a procedural bump texture. Use this pic like texture and change the name in color.png:
#----------------------------------------------------------
# File texture.py
#----------------------------------------------------------
import bpy, os
def run(origin):
# Load image file. Change here if the snippet folder is
# not located in you home directory.
realpath = os.path.expanduser('~/snippets/textures/color.png')
try:
img = bpy.data.images.load(realpath)
except:
raise NameError("Cannot load image %s" % realpath)
# Create image texture from image
cTex = bpy.data.textures.new('ColorTex', type = 'IMAGE')
cTex.image = img
# Create procedural texture
sTex = bpy.data.textures.new('BumpTex', type = 'STUCCI')
sTex.noise_basis = 'BLENDER_ORIGINAL'
sTex.noise_scale = 0.25
sTex.noise_type = 'SOFT_NOISE'
sTex.saturation = 1
sTex.stucci_type = 'PLASTIC'
sTex.turbulence = 5
# Create blend texture with color ramp
# Don't know how to add elements to ramp, so only two for now
bTex = bpy.data.textures.new('BlendTex', type = 'BLEND')
bTex.progression = 'SPHERICAL'
bTex.use_color_ramp = True
ramp = bTex.color_ramp
values = [(0.6, (1,1,1,1)), (0.8, (0,0,0,1))]
for n,value in enumerate(values):
elt = ramp.elements[n]
(pos, color) = value
elt.position = pos
elt.color = color
# Create material
mat = bpy.data.materials.new('TexMat')
# Add texture slot for color texture
mtex = mat.texture_slots.add()
mtex.texture = cTex
mtex.texture_coords = 'UV'
mtex.use_map_color_diffuse = True
mtex.use_map_color_emission = True
mtex.emission_color_factor = 0.5
mtex.use_map_density = True
mtex.mapping = 'FLAT'
# Add texture slot for bump texture
mtex = mat.texture_slots.add()
mtex.texture = sTex
mtex.texture_coords = 'ORCO'
mtex.use_map_color_diffuse = False
mtex.use_map_normal = True
#mtex.rgb_to_intensity = True
# Add texture slot
mtex = mat.texture_slots.add()
mtex.texture = bTex
mtex.texture_coords = 'UV'
mtex.use_map_color_diffuse = True
mtex.diffuse_color_factor = 1.0
mtex.blend_type = 'MULTIPLY'
# Create new cube and give it UVs
bpy.ops.mesh.primitive_cube_add(location=origin)
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.uv.smart_project()
bpy.ops.object.mode_set(mode='OBJECT')
# Add material to current object
ob = bpy.context.object
me = ob.data
me.materials.append(mat)
return
if __name__ == "__main__":
run((0,0,0))
Multiple materials
This program adds three materials to the same mesh.
#----------------------------------------------------------
# File multi_material.py
#----------------------------------------------------------
import bpy
def run(origin):
# Create three materials
red = bpy.data.materials.new('Red')
red.diffuse_color = (1,0,0)
blue = bpy.data.materials.new('Blue')
blue.diffuse_color = (0,0,1)
yellow = bpy.data.materials.new('Yellow')
yellow.diffuse_color = (1,1,0)
# Create mesh and assign materials
bpy.ops.mesh.primitive_uv_sphere_add(
segments = 16,
ring_count = 8,
location=origin)
ob = bpy.context.object
ob.name = 'MultiMatSphere'
me = ob.data
me.materials.append(red)
me.materials.append(blue)
me.materials.append(yellow)
# Assign materials to faces
for f in me.faces:
f.material_index = f.index % 3
# Set left half of sphere smooth, right half flat shading
for f in me.faces:
f.use_smooth = (f.center[0] < 0)
if __name__ == "__main__":
run((0,0,0))
UV layers
This program adds two UV layers to a mesh.
#----------------------------------------------------------
# File uvs.py
#----------------------------------------------------------
import bpy
import os
def createMesh(origin):
# Create mesh and object
me = bpy.data.meshes.new('TetraMesh')
ob = bpy.data.objects.new('Tetra', me)
ob.location = origin
# Link object to scene
scn = bpy.context.scene
scn.objects.link(ob)
scn.objects.active = ob
scn.update()
# List of verts and faces
verts = [
(1.41936, 1.41936, -1),
(0.589378, -1.67818, -1),
(-1.67818, 0.58938, -1),
(0, 0, 1)
]
faces = [(1,0,3), (3,2,1), (3,0,2), (0,1,2)]
# Create mesh from given verts, edges, faces. Either edges or
# faces should be [], or you ask for problems
me.from_pydata(verts, [], faces)
# Update mesh with new data
me.update(calc_edges=True)
# First texture layer: Main UV texture
texFaces = [
[(0.6,0.6), (1,1), (0,1)],
[(0,1), (0.6,0), (0.6,0.6)],
[(0,1), (0,0), (0.6,0)],
[(1,1), (0.6,0.6), (0.6,0)]
]
uvMain = createTextureLayer("UVMain", me, texFaces)
# Second texture layer: Front projection
texFaces = [
[(0.732051,0), (1,0), (0.541778,1)],
[(0.541778,1), (0,0), (0.732051,0)],
[(0.541778,1), (1,0), (0,0)],
[(1,0), (0.732051,0), (0,0)]
]
uvFront = createTextureLayer("UVFront", me, texFaces)
# Third texture layer: Smart projection
bpy.ops.mesh.uv_texture_add()
uvCyl = me.uv_textures.active
uvCyl.name = 'UVCyl'
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.uv.cylinder_project()
bpy.ops.object.mode_set(mode='OBJECT')
# Set Main Layer active
me.uv_textures["UVMain"].active = True
me.uv_textures["UVMain"].active_render = True
me.uv_textures["UVFront"].active_render = False
me.uv_textures["UVCyl"].active_render = False
return ob
def createTextureLayer(name, me, texFaces):
uvtex = me.uv_textures.new()
uvtex.name = name
for n,tf in enumerate(texFaces):
datum = uvtex.data[n]
datum.uv1 = tf[0]
datum.uv2 = tf[1]
datum.uv3 = tf[2]
return uvtex
def createMaterial():
# Create image texture from image. Change here if the snippet
# folder is not located in you home directory.
realpath = os.path.expanduser('~/snippets/textures/color.png')
tex = bpy.data.textures.new('ColorTex', type = 'IMAGE')
tex.image = bpy.data.images.load(realpath)
tex.use_alpha = True
# Create shadeless material and MTex
mat = bpy.data.materials.new('TexMat')
mat.use_shadeless = True
mtex = mat.texture_slots.add()
mtex.texture = tex
mtex.texture_coords = 'UV'
mtex.use_map_color_diffuse = True
return mat
def run(origin):
ob = createMesh(origin)
mat = createMaterial()
ob.data.materials.append(mat)
return
if __name__ == "__main__":
run((0,0,0))