Takunojiの日記

自分が勉強したプログラム技術メモ

Blender Python 本番2〜頂点と面の作り〜

前回は、メッシュオブジェクト(2Dの面)を作ってみました。
ただし、参考にしたサイトの内容に関しては中途半端になっておりましたので続きをやります。

A grid of vertices

の部分から始めます。(Z軸は3Dの時、XとY軸のみの場合は2D)
まぁ一言でvertex(頂点)は(X軸, Y軸, (Z軸))の値で構成されます。実際のコードは以下です。
例①: Vector ( (0, -1 / math.sqrt(9), 0) ) # X: 0, Y: 1/3, Z:0
例②: verts = [(-1,-1,0), (1,-1,0), (1,1,0), (-1,1,0)]

上記の様なコードで表現します。
※サイトに出てくる「range()」は後日
 ちなみに、「bpy.app.debug = True」を1行いれるとデバック情報がコンソールに出力されます。こんな感じです。

f:id:Takunoji:20180129213620p:plain

Understanding faces

 今度は「面」です。「mesh(メッシュ)のことじゃね?なんでfaces?」と思う方も多いと思います。自分も思いました(笑)
メッシュ(mesh) = バーテックス「vertex(2D)」 + フェイシズ(faces)なのです。
下のコードをみてください

# Looping to create the grid
verts = [(-1,-1,0), (1,-1,0), (1,1,0), (-1,1,0)]
faces = [(0,1,2,3)]

# Create Mesh Datablock
mesh = bpy.data.meshes.new(name)
mesh.from_pydata(verts, , faces)

4つの「頂点」(vertes)を設定してから、一つの「面」(faces)を設定しています、
「[」「]」で囲まれた部分に()が「,」でくぎられて設定されています。
参考にしたサイトは頂点を左下の点から時計回りに点の順番を指定するルール」と記載していますが、いまいち理解できませんでした。

とりあえず、理解したのは→「頂点」と「面」を用意してあげればオブジェクトは作成できるということでした。
結局のところは、自分でコーディングしてみないとわからないと思います。
サンプルコードです。参考サイトのものをちょっといじったものです。

import bpy

# Settings
name = 'Gridtastic'
rows = 5
columns = 10
size = 1

# Utility functions
def vert(column, row):
print('""" Create a single vert """')
print((column * size, row * size, 0))
return (column * size, row * size, 0)


def face(column, row):
print('""" Create a single face """')
print((column* rows + row,
(column + 1) * rows + row,
(column + 1) * rows + 1 + row,
column * rows + 1 + row))

return (column* rows + row,
(column + 1) * rows + row,
(column + 1) * rows + 1 + row,
column * rows + 1 + row)

# Looping to create the grid
verts = [(-1,-1,0), (1,-1,0), (1,1,0), (-1,1,0)]
faces = [(0,1,2,3)]

# Create Mesh Datablock
mesh = bpy.data.meshes.new(name)
mesh.from_pydata(verts, , faces)

# Create Object and link to scene
obj = bpy.data.objects.new(name, mesh)
bpy.context.scene.objects.link(obj)

# Select the object
bpy.context.scene.objects.active = obj
obj.select = True

次回は、繰り返しを使用して面などを作成しようと思います。
参考サイトのfor文の部分です。

そんなわけで、次回はpythonの文法的な事をやります