#目次
0.平面を生成する
1.立方体を生成する
2.四角錐を生成する
3.多角形を生成する
4.モディファイアを使う
5.ランダムな形状のメッシュを生成する
6.波状のメッシュを生成する
#0.平面を生成する
.py
import bpy
#平面を形成する頂点と面を定義する
verts = [(0,0,0),(0,5,0),(5,5,0),(5,0,0)]
faces = [(0,1,2,3)]
#メッシュを定義する
mesh = bpy.data.meshes.new("Plane_mesh")
#頂点と面のデータからメッシュを生成する
mesh.from_pydata(verts,[],faces)
mesh.update(calc_edges=True)
#メッシュのデータからオブジェクトを定義する
obj = bpy.data.objects.new("Plane", mesh)
#オブジェクトの生成場所をカーソルに指定する
obj.location = bpy.context.scene.cursor.location
#オブジェクトをシーンにリンク(表示)させる
bpy.context.scene.collection.objects.link(obj)
.py
import bpy
#立方体を形成する頂点と面を定義する
verts = [(0,0,0),(0,5,0),(5,5,0),(5,0,0),(0,0,5),(0,5,5),(5,5,5),(5,0,5)]
faces = [(0,1,2,3), (4,5,6,7), (0,4,5,1), (1,5,6,2), (2,6,7,3), (3,7,4,0)]
#メッシュを定義する
mesh = bpy.data.meshes.new("Cube_mesh")
#頂点と面のデータからメッシュを生成する
mesh.from_pydata(verts,[],faces)
mesh.update(calc_edges=True)
#メッシュのデータからオブジェクトを定義する
obj = bpy.data.objects.new("Cube", mesh)
#オブジェクトの生成場所をカーソルに指定する
obj.location = bpy.context.scene.cursor.location
#オブジェクトをシーンにリンク(表示)させる
bpy.context.scene.collection.objects.link(obj)
#2.四角錐を生成する
.py
import bpy
#四角錐を形成する頂点と面を定義する
verts = [(0,0,0),(0,5,0),(5,5,0),(5,0,0),(2.5,2.5,4.5)]
faces = [(0,1,2,3), (0,4,1), (1,4,2), (2,4,3), (3,4,0)]
#メッシュを定義する
mesh = bpy.data.meshes.new("Pyramid_mesh")
#頂点と面のデータからメッシュを生成する
mesh.from_pydata(verts,[],faces)
mesh.update(calc_edges=True)
#メッシュのデータからオブジェクトを定義する
obj = bpy.data.objects.new("Pyramid", mesh)
#オブジェクトの生成場所をカーソルに指定する
obj.location = bpy.context.scene.cursor.location
#オブジェクトをシーンにリンク(表示)させる
bpy.context.scene.collection.objects.link(obj)
#3.多角形を生成する
.py
import bpy
import math
#何角形か指定する
p = 5
#中心を起点に頂点を配置する
verts = [(0,0,0)]
for i in range(0,p + 1):
x = 2 *math.pi / p * i
verts.append([math.cos(x),math.sin(x),0])
#中心と円周上の2点の合計3点で面を形成する
faces = []
for i in range(0,p):
faces.append([0,i + 1,i + 2])
mesh = bpy.data.meshes.new("Polygon_mesh")
mesh.from_pydata(verts, [], faces)
obj = bpy.data.objects.new("Polygon", mesh)
bpy.context.scene.collection.objects.link(obj)
#編集モードにする
bpy.context.view_layer.objects.active = obj
bpy.ops.object.mode_set(mode='EDIT')
#重複頂点を削除する
bpy.ops.mesh.remove_doubles()
#オブジェクトモードに戻る
bpy.ops.object.mode_set(mode='OBJECT')
#4.モディファイアを使う
.py
import bpy
verts = [(0,0,0),(0,5,0),(5,5,0),(5,0,0),(0,0,5),(0,5,5),(5,5,5),(5,0,5)]
faces = [(0,1,2,3), (7,6,5,4), (0,4,5,1), (1,5,6,2), (2,6,7,3), (3,7,4,0)]
mesh = bpy.data.meshes.new("Cube_mesh")
mesh.from_pydata(verts,[],faces)
mesh.update(calc_edges=True)
obj = bpy.data.objects.new("Cube", mesh)
obj.location = bpy.context.scene.cursor.location
#サブディビジョンサーフェスを適応する
obj.modifiers.new("subd", type='SUBSURF')
#サブディビジョンサーフェスのレベルを決定する
obj.modifiers['subd'].levels = 3
bpy.context.scene.collection.objects.link(obj)
#スムーズシェードを適応する
mypolys = mesh.polygons
for p in mypolys:
p.use_smooth = True
.py
import bpy
import random
verts = []
faces = []
#meshに関する変数
numX = 20
numY = 20
#波の形状に関する変数
amp = 0.5
scale = 1
#頂点座標を生成する
for i in range (0, numX):
for j in range(0,numY):
x = scale * i
y = scale * j
z = (i*random.random())*amp
vert = (x,y,z)
verts.append(vert)
#4つの頂点から面を生成する
count = 0
for i in range (0, numY *(numX-1)):
if count < numY-1:
A = i
B = i+1
C = (i+numY)+1
D = (i+numY)
face = (A,B,C,D)
faces.append(face)
count = count + 1
else:
count = 0
mesh = bpy.data.meshes.new("random mesh")
mesh.from_pydata(verts,[],faces)
mesh.update(calc_edges=True)
obj = bpy.data.objects.new("random mesh",mesh)
obj.location = bpy.context.scene.cursor.location
bpy.context.scene.collection.objects.link(obj)
#サブディビジョンサーフェスを適応する
obj.modifiers.new("subd", type='SUBSURF')
obj.modifiers['subd'].levels = 3
#スムーズシェードを適応する
mypolys = mesh.polygons
for p in mypolys:
p.use_smooth = True
#6.波状のメッシュを生成する
.py
import bpy
import math
verts = []
faces = []
# meshに関する変数
numX = 10
numY = 10
#波の形状に関する変数
freq = 1
amp = 1
scale = 1
#頂点座標を生成する
for i in range (0, numX):
for j in range(0,numY):
x = scale * i
y = scale * j
z = scale*((amp*math.cos(i*freq))+(amp*math.sin(j*freq)))
vert = (x,y,z)
verts.append(vert)
#4つの頂点から面を生成する
count = 0
for i in range (0, numY *(numX-1)):
if count < numY-1:
A = i
B = i+1
C = (i+numY)+1
D = (i+numY)
face = (A,B,C,D)
faces.append(face)
count = count + 1
else:
count = 0
mesh = bpy.data.meshes.new("wave")
mesh.from_pydata(verts,[],faces)
mesh.update(calc_edges=True)
obj = bpy.data.objects.new("wave",mesh)
obj.location = (0,0,0)
bpy.context.scene.collection.objects.link(obj)
#サブディビジョンサーフェスを適応する
obj.modifiers.new("subd", type='SUBSURF')
obj.modifiers['subd'].levels = 3
#スムーズシェードを適応する
mypolys = mesh.polygons
for p in mypolys:
p.use_smooth = True