Blender Python Basic and Script 〜基本とスクリプト〜
前回は、ブレンダーのインストールからPythonでのハローワールド
オブジェクトの移動までやりました。
今回は、オブジェクトのプロパティを変更してみようと思います。
プロパティとはオブジェクトの持っている情報のことです。
前回の「移動」に関しては位置情報のプロパティを変更して移動しました。
プロパティ一覧はこちら
Context Access (bpy.context) — Blender 2.73.0 b4d8fb5 - API documentation
英語が苦手な人はこのまま進んでください。
ちなみに自分も見たけどプロパティの操作方法がわかりませんでした。
とりあえず、前回の「location」の操作
>bpy.context.object.location = (2,0,0)
これでCubeが移動します。
次は、角度を変更します。
>bpy.context.object.ratation_euler = (1,0,0)
>bpy.context.object.rotation_euluer = (0,1,0)
>bpy.context.object.rotation_euler = (0,0,1)
回転する向きが変わるようです。
>bpy.context.object.rotation_euler = (2,0,0)
そして、変形するために「オブジェクトモード」(デフォルト)から「エディットモード」に変更します。
>bpy.ops.mode_set(mode='EDIT', toggle=False)
ちょっと長いですが点の移動を行います。
>bpy.ops.transform.translate(value=(-0.383242, -0.874999, -0.00590833), constraint_axis=(False, False, False), constraint_orientation='GLOBAL', mirror=False, proportional='DISABLED', proportional_edit_falloff='SMOOTH', proportional_size=1)
ちなみにこれも選択している点を操作するスクリプトになります。
そして、点の選択方法は1行でやっているスクリプトが見つかりませんでした。
https://blender.stackexchange.com/questions/23113/select-vertices-of-mesh-in-python
mport bpy,bmesh
ob = bpy.data.objects['Cube']
mesh=bmesh.from_edit_mesh(bpy.context.object.data)
for v in mesh.verts:
v.select = True
# trigger viewport update
bpy.context.scene.objects.active = bpy.context.scene.objects.active
今日はここまでにします。
Eclipse セットアップ
- Java Install Eclipse〜開発ツールのインストール〜
- TensorFlow C++環境〜EclipseにCDTをインストール〜
- Setup OpenGL with Java〜JOGLを使う準備 for Eclipse〜
- Eclipse Meven 開発手順〜プロジェクトの作成〜
- Java OpenCV 環境セットアップ(on Mac)
- Java Basic
- Java Basic Level 1 〜Hello Java〜
- Java Basic Level2 〜Arithmetic Calculate〜
- Java Basic Level3 〜About String class〜
- Java Basic Level 4〜Boolean〜
- Java Basic Level 5〜If Statement〜
- Java Basic Summary from Level1 to 5
- Java Basic Level 6 〜Traning of If statement〜
- Java Basic Level8 〜How to use for statement〜
- Java Basic Level 8.5 〜Array〜
- Java Basic Level 9〜Training of for statement〜
- Java Basic Level 10 〜While statement 〜
- Java Basic Swing〜オブジェクト指向〜
- Java Basic Swing Level 2〜オブジェクト指向2〜
- サンプル実装〜コンソールゲーム〜
- Java Basic インターフェース・抽象クラスの作り方
- Java Basic クラスとは〜Step2_1〜
- Java Basic JUnit 〜テストスイートの作り方〜
Blender Python BMesh 〜点から面へ〜
前回は、点(Vertex)を作成し線を作成して座標の確認を行いました。
今回は、面を作成します。
前回のポイントは、既存のオブジェクトにおける座標を設定するのが
以下のようなスクリプト(BMeshでの処理?)です。
ob = bpy.context.object
bm = bmesh.from_edit_mesh(ob.data)
v1 = bm.verts.new*1
v2 = bm.verts.new*2
v3 = bm.verts.new*3
bm.edges.new*4
bm.edges.new*5
bm.edges.new*6
※Z軸の座標は0→1に変更しています。
この状態(スクリプト)だと線を描くだけです。
ここまで来たので、サクッと面を作成したいと思うのが人情(自分だけ?)
なので上記のスクリプトをちょいといじります。
import bpy, bmesh
ob = bpy.context.object
bpy.ops.object.mode_set(mode='EDIT')
bm = bmesh.from_edit_mesh(ob.data)
bpy.ops.mesh.select_all(action='DESELECT')
v1 = bm.verts.new*7
v1.select = True
v2 = bm.verts.new*8
v2.select = True
v3 = bm.verts.new*9
v3.select = True
bpy.ops.mesh.edge_face_add()
#bm.edges.new*10
#bm.edges.new*11
#bm.edges.new*12
こんな感じで描画されました。
板(Plane)の上にある三角形はスクリプトで作成したものなので
Planeに依存しています。なので隣の画像のように回転します。
次回は、
現状のままでは2Dモデルです。なので、3Dモデルとして形を作りたいと思います。
Eclipse セットアップ
- Java Install Eclipse〜開発ツールのインストール〜
- TensorFlow C++環境〜EclipseにCDTをインストール〜
- Setup OpenGL with Java〜JOGLを使う準備 for Eclipse〜
- Eclipse Meven 開発手順〜プロジェクトの作成〜
- Java OpenCV 環境セットアップ(on Mac)
- Java Basic
- Java Basic Level 1 〜Hello Java〜
- Java Basic Level2 〜Arithmetic Calculate〜
- Java Basic Level3 〜About String class〜
- Java Basic Level 4〜Boolean〜
- Java Basic Level 5〜If Statement〜
- Java Basic Summary from Level1 to 5
- Java Basic Level 6 〜Traning of If statement〜
- Java Basic Level8 〜How to use for statement〜
- Java Basic Level 8.5 〜Array〜
- Java Basic Level 9〜Training of for statement〜
- Java Basic Level 10 〜While statement 〜
- Java Basic Swing〜オブジェクト指向〜
- Java Basic Swing Level 2〜オブジェクト指向2〜
- サンプル実装〜コンソールゲーム〜
- Java Basic インターフェース・抽象クラスの作り方
- Java Basic クラスとは〜Step2_1〜
- Java Basic JUnit 〜テストスイートの作り方〜
Blender Python BMesh 〜点の座標について学ぶ〜
前回、スクリプトで点を作成し、線を作りました。※イマイチな感じでしたが。。。
今回は、復習がてらに線を作成してから始めます。
一回作成したものは、元のソースから持って来れば良いので
速攻でできます。
>> ob = bpy.context.object
>>> bm = bmesh.from_edit_mesh(ob.data)
>>> bm.verts
<BMVertSeq object at 0x114fb5900>
>>> v1 = bm.verts.new( (0,0,0) )
>>> v2 = bm.verts.new( (1,1,0) )
>>> v3 = bm.verts.new( (-1,-1,0) )
>> bm.edges.new( (v1, v2) )
<BMEdge(0x115000150), index=-1, verts=(0x10bba2af0/-1, 0x10bba2b28/-1)>
>>> bm.edges.new( (v2, v3) )
<BMEdge(0x1150001a0), index=-1, verts=(0x10bba2b28/-1, 0x10bba2b60/-1)>
>>> bm.edges.new( (v3, v1) )
<実行結果>
左のものは、作成した点が平面状にあり、隠れていたので動かしました。
右のものは、移動した、板の上に点を作成したものです。
くどいようですが、座標が確認できるように下記のスクリプトを実行しました。
import bpy, bmesh
ob = bpy.context.object
bpy.ops.object.mode_set(mode='EDIT')
bm = bmesh.from_edit_mesh(ob.data)
v1 = bm.verts.new( (0,0,0) )
v2 = bm.verts.new( (1,0,0) )
v3 = bm.verts.new( (0,1,0) )
bm.edges.new( (v1, v2) )
bm.edges.new( (v2, v3) )
bm.edges.new*1
次に板を180度回転させて、以下のようにして同じスクリプトを実行します。
ちょっとわかりづらいのですが、回転後も同じ場所に点が作成されました。
作成する点を以下のように変更し再度スクリプトを実行します。
v1 = bm.verts.new*2
v2 = bm.verts.new*3
v3 = bm.verts.new*4
どうやらBMeshで点を作成するときは、オブジェクト(Plane)の座標に依存するようです。
つまり、元々の位置の中心=(0,0,0)で回転させてもオブジェクト上の座標は変わらないということがわかりました。
なるほど!!
Eclipse セットアップ
- Java Install Eclipse〜開発ツールのインストール〜
- TensorFlow C++環境〜EclipseにCDTをインストール〜
- Setup OpenGL with Java〜JOGLを使う準備 for Eclipse〜
- Eclipse Meven 開発手順〜プロジェクトの作成〜
- Java OpenCV 環境セットアップ(on Mac)
- Java Basic
- Java Basic Level 1 〜Hello Java〜
- Java Basic Level2 〜Arithmetic Calculate〜
- Java Basic Level3 〜About String class〜
- Java Basic Level 4〜Boolean〜
- Java Basic Level 5〜If Statement〜
- Java Basic Summary from Level1 to 5
- Java Basic Level 6 〜Traning of If statement〜
- Java Basic Level8 〜How to use for statement〜
- Java Basic Level 8.5 〜Array〜
- Java Basic Level 9〜Training of for statement〜
- Java Basic Level 10 〜While statement 〜
- Java Basic Swing〜オブジェクト指向〜
- Java Basic Swing Level 2〜オブジェクト指向2〜
- サンプル実装〜コンソールゲーム〜
- Java Basic インターフェース・抽象クラスの作り方
- Java Basic クラスとは〜Step2_1〜
- Java Basic JUnit 〜テストスイートの作り方〜
Blender Python BMesh 〜点の操作〜
前回は、イメージファイルからの座標点の取得〜画面上への描画を行う
スクリプトについて説明しました。
色々と考えたのですが、点(vertex)の操作方法を学ぶ方が先だと思い今回に至ります。
Python Consoleを使い、点を作成しプレートと併用して、オブジェクの変形まで
やれたらいいなと思います。
とりあえず、以下のコマンドを入力しました。
>> ob = bpy.context.object
>>> import bmesh
>>> bm = bmesh.from_edit_mesh(ob.data)
>>> bm.verts.new ( (0,0,0 ) )
<BMVert(0x109c4e398), index=-1>
>>> bm.verts.new ( (-1,-1,0 ) )
<BMVert(0x109c4e408), index=-1>
>>> bm.verts.new ( (1,1,0 ) )
<BMVert(0x109c4e3d0), index=-1>
# ヘルプの内容です。
>>> bmesh.update_edit_mesh(
update_edit_mesh(mesh, tessface=True, destructive=True)
.. method:: update_edit_mesh(mesh, tessface=True, destructive=True)
Update the mesh after changes to the BMesh in editmode,
optionally recalculating n-gon tessellation.
:arg mesh: The editmode mesh.
:type mesh: :class:`bpy.types.Mesh`
:arg tessface: Option to recalculate n-gon tessellation.
:type tessface: boolean
:arg destructive: Use when geometry has been added or removed.
:type destructive: boolean
>>> bmesh.update_edit_mesh(ob.data)
>>>
こんな感じで出力します。
※太文字の部分が実行コマンドになります。
前回作成したスクリプトも同様の手段を使用して点(Vertex)を作成しています。
ここで、点を操作するときに最後の行bmesh.update_edit_mesh()を実行した後だと
変数の「bm」が空になってしまうため更新前に点の処理を行います。
つまり、
>>> bm = bmesh.from_edit_mesh(ob.data)
# この間で点の追加〜編集を行います。
bm.verts.ensure_lookup_table()
>>> bmesh.update_edit_mesh()
ということです。
そして「bm.verts.ensure_lookup_table()」を実行した後でないと
点の操作はできない仕様になっていました。
bm.verts.ensure_lookup_table()の実行前
実行後
そんなこんなで、スクリプトを作成してみました。
実行結果は以下のようになりました。
※テストの残骸が残っていますが。。。。
ソースとしては、以下のような形です。
起動するソースはこちら(ダウンロードできます)
import bpy, bmesh
ob = bpy.context.object
bm = bmesh.from_edit_mesh(ob.data)
vList =
vList.append((-0.5, -0.5, 0.0))
vList.append((0.5, -0.5, 0.0))
vList.append((0.5, 0.5, 0.0))
vList.append((-0.5, 0.5, 0.0))
i = 0
list =
for v in bm.verts:
print(v.co)
if i >= 4:
print("*** IN ***")
bm.verts.new(vList[i-4])
list.append(v)
if i -3 == len(vList):
break
print(i)
i = i+1
print(i)
print(len(list))
bm.edges.new*1
次回は、点の作成時の座標について勉強します。
お疲れ様でした。
Eclipse セットアップ
- Java Install Eclipse〜開発ツールのインストール〜
- TensorFlow C++環境〜EclipseにCDTをインストール〜
- Setup OpenGL with Java〜JOGLを使う準備 for Eclipse〜
- Eclipse Meven 開発手順〜プロジェクトの作成〜
- Java OpenCV 環境セットアップ(on Mac)
- Java Basic
- Java Basic Level 1 〜Hello Java〜
- Java Basic Level2 〜Arithmetic Calculate〜
- Java Basic Level3 〜About String class〜
- Java Basic Level 4〜Boolean〜
- Java Basic Level 5〜If Statement〜
- Java Basic Summary from Level1 to 5
- Java Basic Level 6 〜Traning of If statement〜
- Java Basic Level8 〜How to use for statement〜
- Java Basic Level 8.5 〜Array〜
- Java Basic Level 9〜Training of for statement〜
- Java Basic Level 10 〜While statement 〜
- Java Basic Swing〜オブジェクト指向〜
- Java Basic Swing Level 2〜オブジェクト指向2〜
- サンプル実装〜コンソールゲーム〜
- Java Basic インターフェース・抽象クラスの作り方
- Java Basic クラスとは〜Step2_1〜
- Java Basic JUnit 〜テストスイートの作り方〜
*1:list[0], list[1]
Blender Python 開発 〜イメージからオブジェクトを作る(説明)〜
前回、イメージから点を表示するところまでやりました。
前回は家紋を表示したのですが、今回は別のものを表示します。
ちなみに、上記の画像は表示するパスを変更して実行しています。
元のソースはこちらです。(Gitからダウンロードできます)
一応処理内容を説明いたします。
# 必要なライブラリをインポートします。
import os, sys, numpy as np
import bpy, bmesh
# OpenCvのインストール先をパスに追加する
sys.path.append("/usr/local/lib/python3.6/site-packages/")
# OpenCvをインポート
import cv2
# 家紋のパス
#imgPath = "/Users/takk/BlenderPython/img/kamon/mouri-motonari-kamon.png"
imgPath = "/Users/takk/BlenderPython/img/human_what_is.png"
# イメージの読み込み
im = cv2.imread(imgPath,0)
# イメージを白黒のイメージに変換
thresh = cv2.Canny(im, 100, 200)
x = 0
y = 0
# 画面に出力するための点を設定する配列
list = []
# 取得するか否かの判定フラグ
pickupFlg = False
# 出力するリストへの追加をするしないの判定フラグ
addListFlg = True
# ピクセル格納用変数
tmp = 0
# エディットモードへ変更
bpy.ops.object.editmode_toggle()
# 対象のピクセルをリストへ追加するか判定するメソッド
def judge(col, tmp):
pickupFlg = (not col == tmp)
tmp = col
return pickupFlg
# リストへの追加処理メソッド
def isAddList(addListFlg, pickUpFlg, row, index):
# pickUpFlg = judge(row[index],tmp)
if pickUpFlg and addListFlg:
addListFlg = judge(row[index + 1], tmp)
return pickUpFlg
# 2次元配列の1次元目の配列長
xMax = len(thresh)
# 同様に2次元目の配列長
yMax = len(thresh[0])
# 確認用コンソール出力
print("X: %s Y: %s" % (str(xMax), str(yMax)))
# 配列の中身を取得する処理
for row in thresh:
for col in row:
pickupFlg = judge(col,tmp)
addListFlg = isAddList(addListFlg, pickupFlg, row, x)
if pickupFlg:
# 確認用処理
# print("pick: %s / add: %s" % (str(pickupFlg), str(addListFlg)))
if addListFlg:
# 確認用処理
# print("*** Add List ***")
# 出力用の配列へ追加する
list.append*1
# フラグを反転
addListFlg = not addListFlg
# 取得した配列の位置を示す変数
x += 1
x = 0
y += 1
# 3D_VIEWに出力する準備
ob = bpy.context.object
# エディットモードへ変更
bpy.ops.object.mode_set(mode='EDIT')
# BMeshを使用する(bpy.context.objectより作成)
bm = bmesh.from_edit_mesh(ob.data)
# 確認用
#print(len(list))
#print(list[0])
# 出力配列から点(vertex)を作成
for co in list:
bm.verts.new(co)
# 追加した点を反映
bmesh.update_edit_mesh(ob.data)
# オブジェクトモードへ変更(コメントアウト)
#bpy.ops.object.mode_set(mode='OBJECT')
そして、この次にはmeshへの変換を行いたいのですが。。。
皆目見当もつかない状況です。
今回、はここまでにします。
Eclipse セットアップ
- Java Install Eclipse〜開発ツールのインストール〜
- TensorFlow C++環境〜EclipseにCDTをインストール〜
- Setup OpenGL with Java〜JOGLを使う準備 for Eclipse〜
- Eclipse Meven 開発手順〜プロジェクトの作成〜
- Java OpenCV 環境セットアップ(on Mac)
- Java Basic
- Java Basic Level 1 〜Hello Java〜
- Java Basic Level2 〜Arithmetic Calculate〜
- Java Basic Level3 〜About String class〜
- Java Basic Level 4〜Boolean〜
- Java Basic Level 5〜If Statement〜
- Java Basic Summary from Level1 to 5
- Java Basic Level 6 〜Traning of If statement〜
- Java Basic Level8 〜How to use for statement〜
- Java Basic Level 8.5 〜Array〜
- Java Basic Level 9〜Training of for statement〜
- Java Basic Level 10 〜While statement 〜
- Java Basic Swing〜オブジェクト指向〜
- Java Basic Swing Level 2〜オブジェクト指向2〜
- サンプル実装〜コンソールゲーム〜
- Java Basic インターフェース・抽象クラスの作り方
- Java Basic クラスとは〜Step2_1〜
- Java Basic JUnit 〜テストスイートの作り方〜
*1:y/(yMax-1) ,x/(xMax-1), 0
Blender Python 開発 〜imgファイルの輪郭を取得〜
ここ最近は、開発メモやらBlenderの操作方法など横道にそれていましたが。。。
できました!!
「イメージファイルの中身をBlender上に表示する」
作成した、pyファイルはこちらからダウンロードできます。
ちなみに、元々のイメージファイルは以下です。
今回のやったことは、以下の通りです。
0. OpenCvを読み込みBlender上で使用できるようにする
1. イメージファイルを読み込む
2. イメージを黒と白のみにする(グレースケール化)
3. グレースケールにしてから輪郭部分を取得
4. 輪郭を取得したイメージより輪郭部分の座標(1px=(x,y))
※横をX座標、縦をY座標として取得
5. 新たにvertex(点)を作成
スクリプトを起動した結果です。本当は、作成したPlaneの上に表示させる予定でしたが、Planeの座標は0->1の範囲なのに対して、配列の位置で座標取得を行ったため
以下のようになりました。(笑)
ポイントは3つ
・OpenCvを使用して輪郭を取得する
・取得した輪郭から点(Vertex)を作成する
・bmeshはエディットモードでないと動かない
現状の実装では、無駄な処理が多分に含まれているので
今後は、効率の良い方法を探そうと思います。
ソースの一部です。
ob = bpy.context.object
bpy.ops.object.mode_set(mode='EDIT')
bm = bmesh.from_edit_mesh(ob.data)
print(len(list)) # 取得した点のはいれつ数を確認
print(list[0]) # リストの中身を確認
for co in list:
# 点の作成処理
bm.verts.new(co)
# 作成した点を画面に反映
bmesh.update_edit_mesh(ob.data)
# オブジェクトモードに戻す(コメントアウトしてます)
#bpy.ops.object.mode_set(mode='OBJECT')
Blender Python Basic 〜 テクスチャサンプルコード 〜
グレースペンシル
gp = bpy.context.scene.grease_pencil
点の追加2
mport bpy, bmesh
obj = bpy.context.object
me = obj.data
bm = bmesh.from_edit_mesh(me)
v1 = bm.verts.new*1
v2 = bm.verts.new*2
v3 = bm.verts.new*3
bm.faces.new*4
bmesh.update_edit_mesh(obj.data)
点の追加
First of all you have to create a object and a mesh, after that you can add the vertex to it:
# name: string for new object name
# verts: array of position coords - [(-1.0, 1.0, 0.0), (-1.0, -1.0, 0.0)]
def create_Vertices (name, verts):
# Create mesh and object
me = bpy.data.meshes.new(name+'Mesh')
ob = bpy.data.objects.new(name, me)
ob.show_name = True
# Link object to scene
bpy.context.scene.objects.link(ob)
me.from_pydata(verts, , )
# Update mesh with new data
me.update()
テクスチャ関連
Materials/Textures – mapping — PyMove3D
# new texture, テクスチャ取得→イメージ取得と読み込み→テクスチャに貼り付け texUV = bpy.data.textures.new(texname, type="IMAGE") image_path = os.path.expanduser("//wuerfelbilder/blume.jpg") image = bpy.data.images.load(image_path) texUV.image = image # connect textur with material
マテリアル作成、テクスチャを設定、プロパティの設定(要調査) bpy.data.materials[matname].texture_slots.add() bpy.data.materials[matname].active_texture = texUV bpy.data.materials[matname].texture_slots[0].texture_coords = "GLOBAL" bpy.data.materials[matname].texture_slots[0].mapping = "CUBE"
# escape edit mode if bpy.ops.object.mode_set.poll(): bpy.ops.object.mode_set(mode='OBJECT') # delete all mesh objects bpy.ops.object.select_by_type(type='MESH') bpy.ops.object.delete() # delete all materials for i in bpy.data.materials.values(): bpy.data.materials.remove(i) # delete all textures for i in bpy.data.textures.values(): bpy.data.textures.remove(i)
# new texture texUV = bpy.data.textures.new(namen[i][1], type="IMAGE") image_path = os.path.expanduser("//wuerfelbilder/{}".format(i)) image = bpy.data.images.load(image_path) texUV.image = image # connect texture with material bpy.data.materials[matname].texture_slots.add() bpy.data.materials[matname].active_texture = texUV bpy.data.materials[matname].texture_slots[0].texture_coords = "ORCO" bpy.data.materials[matname].texture_slots[0].mapping = "CUBE"
Blender Control 〜オブジェクトの変形を頭から〜
前回は、さらっとオブジェクト作成したり変形したりました。
そして、仕切り直して頭から行きます。
今回は、3Dビューの右端→を上から下へ引っ張り上部にコンソールを開きます。一番下の「Python Console」をクリックします。下のようになるはずです。
1:とりあえず、画面上の立方体(Cube)を削除します。
>> ob = bpy.data.objects['Cube']
>> bpy.context.scene.objects.unlink(ob)
2:板を作成します。(Plate)
>> bpy.ops.mesh.primitive_plane_add()
{'FINISHED'}
3: 板を縦にします。
・選択しているオブジェクトを確認
>> bpy.context.object
bpy.data.objects['Plane']
・オブジェクトを縦にします。
>>> bpy.ops.transform.rotate(value=math.radians(90), axis=(0,1,0))
{'FINISHED'}
中途半端ですが、ここで中断します。
一応、ここまでのコマンド入力結果を以下に示します。
--------------------------------------------------------------------------
>> ob = bpy.context.object
>>> bpy.context.scene.objects.unlink(ob)
>>> bpy.ops.mesh.primitive_plane_add()
{'FINISHED'}
>> import math
>>> bpy.ops.transform.rotate(value=math.radians(90), axis=(0,1,0))
{'FINISHED'}
--------------------------------------------------------------------------
ちょっと寄り道ですが、 緑色の業に関して、
math.radians(90) → 角度(自分らのわかる値)を数値(パソコンのわかる値)に変換します。
axis →タプルを設定しますが、(X軸, Y軸, Z軸)で「1」の部分を変更します。
上の実行したコードはY軸に「1」があるのでY軸を中心に90度変更する
という処理になります。
次はテクスチャを貼ります。
1. マテリアルを取得します。
名前の部分(TestMaterial)を用意されているものにしないとエラーになります。
>> mat = bpy.data.materials['TestMaterial']
Traceback (most recent call last):
File "<blender_console>", line 1, in <module>
KeyError: 'bpy_prop_collection[key]: key "TestMaterial" not found'
取得したマテリアルを変数に代入します。
>>> mat = bpy.data.materials['Material']
同様にマテリアルのテクスチャスロット追加して変数に代入
>>> slot = mat.texture_slots.add()
そしてテクスチャを変数に代入
>>> tex = bpy.data.textures.new("Kamon", 'IMAGE')
さらに、イメージファイルを読み込み
>>>img = bpy.data.images.load("~/BlenderPython/img/家紋/mouri-motonari-kamon.png")
そして、テクスチャにイメージを設定
tex.image = img
スロットに設定
>>> slot.texture = tex
マテリアルをオブジェクトに設定
>>> ob.data.materials.append(mat)
イメージが横向きになっているのがイマイチだが。。。一応完了!
※2018/03/23=>想定通りに行きませんでした、テストのキャッシュが残っており上記のように表示されていました。
→ob = bpy.context.objectをもう一度実行することでテクスチャが貼れます
→
以下は、今日叩いたコードです。
>> ob = bpy.data.objects['Cube']
>> bpy.context.scene.objects.unlink(ob)
>> bpy.ops.mesh.primitive_plane_add()
>> import math
>> bpy.ops.transform.rotate(value=math.radians(90), axis=(0,1,0))
>> mat = bpy.data.materials['Material']
>> slot = mat.texture_slots.add()
>> tex = bpy.data.textures.new("Kamon", 'IMAGE')
>> tex.image = img
>>> slot.texture = tex
>>> ob.data.materials.append(mat)
今日はここまでにします。
Blender Basic 操作メモ2〜 モディファイヤーについて 〜
モディファイヤーについて ※参考サイト
<Modify: 変更>
モディファイアの変更グループには、変形モディファイア(以下を参照)と同様のツールが含まれていますが、オブジェクトの形状に直接影響を与えません。むしろ頂点グループなどの他のデータに影響を与えます。
<Generate: 生成する>
生成のグループは、オブジェクトの一般的な外観を変更したり、自動的にオブジェクトに新しいジオメトリを追加するいずれかの建設的なツールが含まれています。
<Deform: 変形>
デフォーム改質剤の群は、新たなジオメトリを追加することなく、オブジェクトの形状を変化させ、メッシュのために利用可能であり、しばしばテキスト、曲線、表面及び/又は格子。
<Simulate: シミュレートする>
シミュレートのグループは、シミュレーションを活性化させます。ほとんどの場合、これらの修飾子は、パーティクルシステム または物理シミュレーションが有効になっているときは常に、修飾子スタックに自動的に追加されます。それらの唯一の役割は、それらが表すツールによって基本データとして使用される修飾子スタック内の場所を定義することです。一般に、これらの修飾子の属性は、別々のパネルでアクセスできます。
<<モディファイヤーの一覧>>
[Modifiers]
<Modify>
- Data Transfer Modifier :
- あるメッシュから別のメッシュにいくつかのタイプのデータを転送します。
データタイプには、頂点グループ、UVマップ、頂点カラー、カスタム法線などがあります...
転送は、ソースメッシュのアイテム(頂点、エッジなど)と宛先オブジェクトとの間のマッピングを1対1ベースで生成するか、
複数のソースアイテムを補間マッピングによって単一の宛先アイテムにマッピングすることによって動作します。 Mesh Cache Modifier - メッシュキャッシュモディファイアは、
アニメメッシュデータをメッシュに適用して再生し、
メッシュを変形させるために使用されます。
これはシェイプ・キーと同様に動作しますが、
外部ファイルの再生を目的としており、
アプリケーション間の交換によく使用されます。 - Mesh Sequence Cache Modifier
- その名前にもかかわらず、この修飾子はメッシュと曲線をサポートします。
また、さまざまな数の頂点/制御点を持つメッシュや曲線だけでなく、ファイルシーケンスも処理します - Normal Edit Modifier
- ノーマル編集モディファイアはカスタムノーマルに影響を与えます(または生成します)。
いくつかの単純なパラメトリックメソッドを使用して法線を計算し
(ゲーム開発やアーキテクチャの分野では非常に便利です)
生成された法線を既存の法線とミックスします。 - UV Project Modifier
- UVプロジェクト修飾子は、スライドプロジェクターのような役割を果たします。
コントローラーオブジェクト(空の場合など)の負のZ軸からUVマップを出力し、
「ライト」がヒットするとオブジェクトに適用します。
必要に応じて、オブジェクトのフェイステクスチャをオーバーライドできます。 - UV Warp Modifier
- UVワープモディファイアは、2つのオブジェクトを使用して、
選択されたUV座標に適用される変換を定義します。 - Vertex Weight Edit Modifier
- この修飾子は、1つの頂点グループの重みを編集するためのものです。
一般的なプロセスは、各頂点に対して以下のようになります。
1.(オプション)事前定義された関数のいずれかを使用するか、
カスタムマッピングカーブを使用してマッピングを行います。
2.影響因子、およびオプションで頂点グループまたはテクスチャマスクを適用します
(0.0は元のウェイト、1.0は完全にマップされたウェイトを意味します)。
3.ウェイトを頂点に適用し、ウェイトが所定のしきい値を下回っている場合はグループから頂点を
削除するか、または所定のしきい値を超えている場合は追加することもできます。 - Vertex Weight Mix Modifier
- この修飾子は、異なる操作を使用して、
影響を受けた頂点グループに第2の頂点グループ(または単純な値)を合成します。 - Vertex Weight Proximity Modifier
- この修飾子は、オブジェクト(またはその頂点)と別のターゲットオブジェクト(またはそのジオメトリ)との間の距離に基づいて、指定された頂点グループのウェイトを設定します。
<Generate>
- Array Modifier
- 配列修飾子は、基本オブジェクトのコピーの配列を作成します。
各コピーは、多数の可能な方法のいずれかで前の配列からオフセットされています。
隣接するコピーの頂点を近くにマージすると、滑らかなSubdivision Surfaceフレームワークを生成できます。
このモディファイアは、大きなシーンをすばやく開発するためにタイル可能なメッシュと組み合わせて使用すると便利です。
複雑な繰り返しの形を作成するのにも便利です。 - Bevel Modifier
- ベベルモディファイアは、適用されているメッシュのエッジを面取りする機能を追加し、メッシュにベベルが適用される方法と場所を制御できます。
ベベル・モディファイアは、編集モードのベベル・オペレーションの非破壊的な代替手段です。 - Boolean Modifier
- ブール・モディファイアは、手作業でメッシュを編集することで少数のステップで達成するには複雑すぎるメッシュに対して操作を実行します。Boolean Modifierは、2つのメッシュオブジェクトから1つのメッシュを作成するために使用できる3つのブール演算のうちの1つを使用します。
- Build Modifier
-
ビルドモディファイアを使用すると、メッシュオブジェクトの面が時間の経過とともに次々に表示されたり消えたりします。
デフォルトでは、顔はメモリに保存されている順に表示されます(デフォルトでは、作成順)。面/頂点の順序は、オペレータ検索メニューからソートメッシュ要素を選択することにより、編集モードで変更することができ ますSpacebar。 - Decimate Modifier
-
Decimate Modifierを使用すると、最小限のシェイプ変更でメッシュの頂点/面数を減らすことができます。
これは通常、モデルを注意深く、経済的に作成したメッシュ(形状を正しく定義するためにはすべての頂点と面が必要なメッシュ)では使用されません。しかし、メッシュが複雑なモデリング、彫刻、および/またはサブディビジョンサーフェス/マルチ解像度モディファイアを適用した結果である場合、デシメイトモディファイアを使用してポリゴン数を減らしたり、不必要な頂点やエッジを削除することができます。Decimate Modifierは、非破壊的にメッシュのポリゴン数を素早く簡単に減らす方法です。この修飾子は、通常は永続的で元のメッシュデータを破壊する操作を、修飾子を使用して対話的かつ安全に行う方法を示しているため、メッシュ修飾システムの利点を実証しています。
既存の修飾子の大部分とは異なり、Decimate修飾子では、編集モードでの変更を視覚化することはできません。 - Edge Split Modifier
-
エッジスプリットモディファイアはメッシュ内のエッジを分割します。分割するエッジは、エッジ角(すなわち、このエッジを形成する面の間の角度)および/または鮮明とマークされたエッジから決定することができる。
エッジを分割すると、そのエッジで頂点の法線生成が行われ、エッジが鮮明に表示されます。したがって、このモディファイアを使用すると、[ 自動スムーズ]と同じ効果を得ることができ、エッジが特定のしきい値を超えるとエッジがシャープに見えるようになります。スムージング処理を手動で制御する場合にも使用できます。スムージング処理では、エッジを滑らかにするかシャープにするかをユーザーが定義します(これを行う方法については、「メッシュスムージング」を参照してください)。必要に応じて、両方のモードを同時にアクティブにすることができます。
エッジスプリットモディファイアの出力はスクリプトをエクスポートするのに利用できるため、ゲームコンテンツの作成者にとっては非常に便利です。 - Mask Modifier
-
Mask Modifierでは、オブジェクトの頂点を頂点グループに基づいて動的に隠すことができます。
- Mirror Modifier
-
ミラーモディファイアは、ローカルの X軸、Y軸、および/またはZ軸に沿ってメッシュをオブジェクトの中心(ミラー平面は2つの他の軸によって定義されます)に沿ってミラーリングします。
ミラーセンターとして別のオブジェクトを使用して、そのオブジェクトのローカル軸を独自のものではなく使用することもできます。 - Multiresolution Modifier
-
Multiresolution(「Multires」に短縮されることが多い)は、Subdivision Surface Modifierと同様にメッシュを分割する機能を提供しますが、スカルプトモードで新しいサブディビジョンレベルを編集することもできます。
- Remesh Modifier
-
Remeshモディファイアは、新しいメッシュトポロジを生成するためのツールです。出力は入力の表面曲率に従いますが、そのトポロジにはクワッドのみが含まれています。
- Screw Modifier
-
スクリューモディファイ アは、プロファイルオブジェクト、メッシュまたはカーブを使用してらせん状の形状を作成する点で、ツールシェルフのスクリューツールに似ています。
- Skin Modifier
- スキンモディファイアでは、頂点と辺を使用してスキンサーフェスを作成し、頂点ごとの半径を使用してシェイプをよりよく定義します。出力はほとんどが四角形ですが、交点の周りには三角形が表示されます。
- Solidify Modifier
-
Solidify Modifierは、任意のメッシュのサーフェスを取り、そのメッシュの深さを追加します。
- Subdivision Surface Modifier
-
細分化サーフェスモディファイアは、メッシュの面を小さい面に分割して滑らかな外観にします。このモディファイアを使用すると、シンプルで低頂点のメッシュで複雑な滑らかなサーフェスをモデリングできます。これにより、膨大な量のデータを保存して維持する必要なく、高解像度のメッシュモデリングが可能になり、オブジェクトにスムーズな有機的な外観が与えられます。
このプロセスでは、元のメッシュを変更せずに非破壊で生成された仮想ジオメトリが作成されますが、実際のジオメトリに変換して適用ボタンで編集できます。また、他の修飾子と同様に、実行順序は結果に重要な影響を与えます。そのためには、修飾子スタックのドキュメントを参照してください。
これは、同社のスムースシェーディングとは異なる操作であることに 注意してください。下のグリッドイメージでは、2つの違いがわかります。 - Triangulate Modifier
- Triangulate Modifierは、メッシュ内のすべての面(四角形かn角形か)を三角形の面に変換します。この変更子は、編集モードでの三角ツールとまったく同じ機能を果たします。
- Wireframe Modifier
- ワイヤフレームモディファイアは、面を反復することによってメッシュをワイヤフレームに変換し、すべてのエッジを収集し、それらのエッジを4面のポリゴンに変換します。あなたのメッシュがワイヤフレームされる面を持つ必要があるという事実に注意してください。指定された変更オプションを使用して、生成されたワイヤフレームの厚さ、材質、およびその他のパラメータを動的に定義することができます。
2018/03/21: ここまで
<Deform>
- Armature Modifier
-
アーマチュアモディファイアは、キャラクタのポーズやポーズが必要なその他のものをアニメートするための骨格システムを構築するために使用されます。
アーマチュアシステムをオブジェクトに追加することによって、そのオブジェクトを正確に変形させることができ、ジオメトリを手動でアニメーション化する必要がなくなります。 - Cast Modifier
-
この修飾子は、メッシュ、カーブ、サーフェス、またはラティスの形状を、あらかじめ定義されたいくつかのシェイプ(球、円柱、直方体)のいずれかに移動します。
それは同等ですへの球の中にツール編集モード 、Shift-Alt-S 上に書いたように、それは球へのキャストに限定されるものではなく、他のプログラム「Spherify」または「Spherize」にも - Corrective Smooth
-
このモディファイアは、変形を平滑化することによってメッシュの非常に歪んだ領域を減らすために使用されます。
これは、慎重な体重塗装をしても関節周囲の歪みを避けるのが困難なArmature Modifierの後では一般的に便利です。
この修飾子を効果的に使用するには、それがどのように機能するかの基本を理解することが有効です。
休息状態
非常に歪んだ領域を検出するためのリファレンスとして使用されます。元の頂点の位置は、デフォルトで使用されます。
平滑化
この修飾子の多くのオプションは、歪んだ領域を修正するために内部的に使用されるスムージングに関連しています。 - Curve Modifier
-
カーブモディファイアは、カーブオブジェクトに沿ってメッシュを変形するシンプルで効率的な方法を提供します。
カーブモディファイアは、(グローバル)ドミナント軸X、Y、またはZに作用します。つまり、メッシュを支配的な方向(デフォルトではX軸)に移動すると、メッシュはカーブに沿って移動します。メッシュをこの軸に垂直に動かすと、オブジェクトはカーブに近づいたり離れたりします。
カーブの終了点を超えてオブジェクトを移動すると、オブジェクトはカーブの終点の方向ベクトルに基づいて変形し続けます。
カーブが3Dの場合、コントロールポイントの傾きの値は、変形されたオブジェクトをねじるために使用されます。「パス/カーブ変形の下の は、モディファイアに影響を与えるオプションです。 - Displace Modifier
- Displace Modifierは、テクスチャの強さに基づいてメッシュ内の頂点を置き換えます。手続き型テクスチャまたはイメージテクスチャのいずれも使用できます。ディスプレースメントは、特定のローカル軸に沿って、頂点の法線に沿っているか、またはテクスチャの別個のRGBコンポーネントを使用して、ローカルX、Y、Z方向の頂点を同時に移動させることができます(Vector Displacementとも呼ばれます)。
- Hook Modifier
-
フックモディファイアは、別のオブジェクト(通常は空または骨ですが、任意のオブジェクトにすることができます)を使用して、メッシュ、カーブ、ラティスを変形するために使用されます。
フックが動くと、メッシュから頂点が引き出されます。あなたはアニメーション比例編集と考えることができます 。
フックはシェイプキーの頂点の動きを細かく制御するわけではありませんが、操作のために頂点を直接つかむことができるという利点があります。 - Laplacian Smooth Modifier
-
ラプラシアンスムースモディファイアを使用すると、メッシュの表面のノイズを最小限に抑えてノイズを減らすことができます。
また、負のFactorを使用して形状を誇張することもできます。
ラプラシアンスムースは、現実の世界から再構築され、望ましくないノイズを含むオブジェクトに役立ちます。それは、元のモデルの形状だけでなく望ましいジオメトリを保持しながらノイズを除去します。
ラプラシアンスムースモディファイアは、拡散方程式における曲率流Laplace Beltrami演算子に基づいています。 - Laplacian Deform Modifier
-
ラプラシアン変形モディファイアを使用すると、サーフェスの幾何学的詳細を保存しながらメッシュをポーズできます。
ユーザは、「アンカー」頂点のセットを定義し、それらのいくつかを動かします。モディファイアは、残りのアンカー頂点を固定した位置に保持し、残りのすべての頂点の可能な最良の位置を計算して元のジオメトリの詳細を保持します。
この変更子は、微分座標を使用して幾何学的詳細を取得します。微分座標は、その近傍に基づいて頂点の曲率および方向が局所幾何学情報を取得する。 - Lattice Modifier
- ラティスモディファイアは、ラティスオブジェクトの形状に従ってベースオブジェクトを変形します。変形されるオブジェクトは、メッシュ、曲線、サーフェス、テキスト、格子、さらにはパーティクルです。
- Mesh Deform Modifier
- Mesh Deform Modifierは、任意の閉じた形状の任意のメッシュを他のメッシュの周りの変形ケージとして機能させることができます。
- Shrinkwrap Modifier
-
シュリンクラップモディファイヤは、オブジェクトが別のオブジェクトの表面に「収縮」することを可能にします。修正されるオブジェクトの各頂点を、指定されたメッシュの表面上の最も近い位置に移動します(利用可能な3つの方法のいずれかを使用して)。
- Simple Deform Modifier
-
シンプルデフォームモディファイアを使用すると、オブジェクトに簡単な変形を簡単に適用できます(メッシュ、格子、曲線、サーフェス、およびテキストがサポートされています)。
別のオブジェクトを使用すると、変形の軸と原点を定義することができ、非常に異なる効果を適用できます。 - Smooth Modifier
- スムースモディファイアは、編集モードでように、隣接するフェース間の角度を平坦にすることでメッシュをします。メッシュを細分化せずに滑らかになります。頂点の数は変わりません。
- Surface Deform Modifier
- サーフェス変形モディファイアは、任意のメッシュサーフェスが別のサーフェスの変形を制御することを可能にし、本質的にそのモーション/変形を転送します。このための1つの大きな用途は、クロスシミュレーション用のプロキシメッシュを使用することです。これは、最終的で詳細なメッシュの動きをシミュレートするのに適していません。
- Warp Modifier
- この変形モディファイアを使用すると、2つのオブジェクトを使用して「from」および「to」領域を選択し、カーブの減衰、テクスチャ、および頂点グループを使用するオプションを使用して、メッシュの一部を非常に柔軟な方法で新しい場所にワープすることができます。
- Wave Modifier
- ワープモディファイアは最初はややこしいですが、それがどのように機能するかを理解するのに役立ちます。修飾子には、オブジェクトの起点によって指定される2つの点が必要です。"from"点は、 "to"点に向かって引っ張られる空間内の点を指定します。 編集モードで比例編集を使用するのと同じです。
<Simulate>
- Explode Modifier
-
分解モディファイアは、メッシュのジオメトリを変更するために使用されます。メッシュのジオメトリを変更するには、そのオブジェクトが放出するパーティクルを大まかに追跡するようにフェースを移動/回転させ、メッシュが分解されているかのように見せます。
Explode Modifierを目に見えるようにするには、パーティクルシステムが必要です。メッシュ上のパーティクルシステムはメッシュがどのように分解されるかを制御するもので、パーティクルシステムがなければメッシュは変更されていないように見えます。
放出粒子の数とフェイスの数の両方が、爆発修飾子の粒度を決定します。より多くの顔とより多くのパーティクルは、より多くの個々の部分を意味します。
ここでは、 パーティクルシステムとExplode Modifierを備えた立方体を示すデモビデオがあります。(ブレンドファイル)。 - Ocean Modifier
-
オーシャン修飾子は、シミュレーションデータをレンダリングするために使用される海洋シミュレーション変形海の表面をシミュレートし、生成するツール、および関連するテクスチャです。深い海洋波と泡をシミュレートすることを目的としています。
オーシャンモディファイアは、オープンソースフーディーニオーシャンToolkitのポートです。 - Particle Instance Modifier
- パーティクルインスタンスモディファイアがオブジェクトに追加されると、そのオブジェクトは関連付けられたパーティクルシステムを持つオブジェクト上のパーティクルシェイプとして使用されます。つまり、この修飾子を使用するには、パーティクルシステムを持つ別のオブジェクトも必要です。そうしないと、パーティクルインスタンス修飾子は何もしないように見えます。
Blender Basic 操作メモ1〜 単語など 〜
bm = bmesh.from_edit_mesh(ob.data)
bm.update_edit_mesh()
上記のように更新処理を走らせるとbmがからになるので注意
pythonで削除したオブジェクトを参照すると blenderが落ちる
ヌルポの様だ
オブジェクト→3dモデル(立方体、球)
シェーディング→明暗のコントラストで立体感を出す(陰影画法)、6種
・レンダー
・マテリアル
・テクスチャ
・ソリッド
・ワイヤーフレーム
・バウンディングボックス
カーブ(Curve)→以下の4種類がある(これ以上は要調査)
- Bezier Curve(ベジエ曲線)
- 2つの制御点を持つ、開いた 2D ベジエ曲線を追加します。
- Bezier Circle(ベジエ円)
- 閉じた円形の 2D ベジエ曲線を追加します(4つの制御点でできています)。
- NURBS Curve(NURBS曲線)
- 4つの制御点と均一な knot を持つ、開いた 2D NURBS 曲線を追加します。
- NURBS Circle(NURBS円)
- 閉じた円形の 2D NURBS 曲線を追加します(高さの制御点でできています)。
- Path(パス/経路)
- 開いた 3D NURBS 曲線を追加します。5つの整列した制御点と Endpoint (終点)knot を持ち、CurvePath(曲線経路)設定が利用できます。
・ペジェ曲線生成
bpy.ops.curve.primitive_bezier_curve_add(view_align=False, enter_editmode=False, location=(-0.0746956, -0.504402, -0.0376967), layers=(True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False))
・ペジェ円生成
bpy.ops.curve.primitive_bezier_circle_add(radius=1, view_align=False, enter_editmode=False, location=(1.92873, -0.502174, 0.574399), layers=(True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False))
・NURBS曲線生成
bpy.ops.curve.primitive_nurbs_curve_add(radius=1, view_align=False, enter_editmode=False, location=(1.92873, -0.502174, 0.574399), layers=(True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False))
・NURBS円生成
bpy.ops.curve.primitive_nurbs_circle_add(radius=1, view_align=False, enter_editmode=False, location=(1.92873, -0.502174, 0.574399), layers=(True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False))
・パス生成
bpy.ops.curve.primitive_nurbs_path_add(radius=1, view_align=False, enter_editmode=False, location=(0.518721, -1.01152, 0.297026), layers=(True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False))
パスの編集:ジオメトリ(Geometory)を編集する
[Dep]:下のように変形します。
[Ext]: 同様
組み合わせると
サーフェス(surface)→曲面、上記のカーブが面になったもの?(よくわかりませんでした)
※「カーブのプロパティ、Extが0よりも大きいもの」と解釈しています。
モディファイヤ(スクリュー)→ こちらを参照してください(解読中です)
そして動画です。こちらも解読中です。
実行スクリプト
bpy.ops.mesh.screw(center=(0.178873, -0.951734, 0.0445499), axis=(-0.036734, 0.00735808, 0.999298))
とりあえず、実行結果です。、、いまいち結果が動画とは違っているんだなぁ。。。
英語で何か大切なことを説明しているようなのだが分かりませんでした。。。