8
9

More than 3 years have passed since last update.

[Blender×Python] オリジナルオブジェクトのつくりかた

Last updated at Posted at 2021-01-08

目次

0.平面を生成する
1.立方体を生成する
2.四角錐を生成する
3.多角形を生成する
4.モディファイアを使う
5.ランダムな形状のメッシュを生成する
6.波状のメッシュを生成する

0.平面を生成する

01.png

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)

1.立方体を生成する

02.png

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.四角錐を生成する

03.png

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.多角形を生成する

04.png

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.モディファイアを使う

05.png

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

5.ランダムな形状のメッシュを生成する

07.png

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.波状のメッシュを生成する

08.png

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

参考サイト
Nathan's Blender Python Notebook

8
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9