pg08

テーマ CGとプログラム

demo1 demo2

外部サイト: Blender入門

予習&準備: iPhoneアプリ FILTERS を App Store からDL(無料)してインストールしておく。(iPad 専用アプリではないので、DLする際に検索先を変更する)。

・CGソフト Blender のスクリプト機能を利用し、プログラムによる3DCGを作成する。

Blender はオープンソースのフリーソフトウェアで、無償で利用できます。

・プログラム言語 Python を使用する。

Python は、テキスト処理にに優れ、Webサービスの開発(サーバサイド)に利用されています。

また、AIの研究分野で、機械学習用のツールを利用する際のスクリプト言語としても利用されています。

オープンソースのフリーソフトウェアで、無償で利用できます。

Blenderの起動: 解説動画(演習1の内容1部含む)

スタート → コンピュータ → ボリューム(D:) → Blender を開き、 blender.exe をダブルクリック。

今回は、Blenderの操作方法についてはほとんど触れずに、Python スクリプトによるCG作成を中心に演習をする。

Blenderによる3DCG作成に興味のある受講者は、入門サイトを検索するか、関連資料をみて取り組んでみよう。(旧科目 デジタルエンタテインメントの 資料1 資料2

演習1

Blenderのスクリーンレイアウトを Python Scripting に変更

コンソールで以下のコマンドを試す。

1+1
bpy.data.objects['Cube'].location.x += 1
bpy.data.objects['Cube'].location.y += 1
bpy.data.objects['Cube'].location.z += 1

※ コンソールのキーボード操作

上下矢印キー↓↑ で入力履歴の呼び出し

3Dビューの add メニューから Mesh -> Ico Sphere で球体モデルを追加する。

bpy.data.objects['Icosphere'].location.z += 10

3Dビューの表示範囲をマウスで調整する。

・マウスホイール ズームイン・アウト

・ミドルボタン(ホイール)でドラッグ シーン回転

カメラ操作ボタンの確認

※数値入力PADのキーを使用する

1 3 7 フロント サイド トップ

パースの ON OFF

カメラ視点

2 4 6 8 シーン回転

HOME シーン全体を表示

解説動画(つづき)

アウトライナーパネルのシーンツリーを確認

Icosphere を選択

プロパティパネルの表示内容をオブジェクトに変更

bpy.data.objects['Icosphere'].location = [ -10 , 0 ,  0]
bpy.data.objects['Icosphere'].scale = [2,2,2]

Cubeを回転操作する。回転にはオイラー角(euler)を使用して、X軸、Y軸、Z軸の順番で回転させる。

上から順に、 約180度回転、約90度回転、約45度回転

bpy.data.objects['Cube'].rotation_euler = [0,0,3.14]
bpy.data.objects['Cube'].rotation_euler = [0,0,3.14/2]
bpy.data.objects['Cube'].rotation_euler = [0,0,3.14/4]

回転の角度指定は、 度(degree)ではなく、ラジアン(radian)を使う。 π=3.141…=180度

マテリアル(色)を作成し、オブジェクトに設定する

※ diffuse_color 散乱j光(物に光を当てたときに見える、物質の色)

color0 = bpy.data.materials.new('mycolor')
color0.diffuse_color = [1, 0, 0]

# マテリアルが未設定のオブジェクトに対して、マテリアルを追加する場合。

bpy.data.objects['Icosphere'].data.materials.append( color0 )

# マテリアルが設定済みのオブジェクトに対して、マテリアルを上書きする場合。

bpy.data.objects['Cube'].material_slots[0].material = color0

スクリプトでオブジェクトを生成して、場所を移動し、色を設定する。

bpy.ops.mesh.primitive_ico_sphere_add()
bpy.context.object.location = [1, 2, 3]
bpy.context.object.data.materials.append(color0)

※ bpy.context.object は、現在操作中のオブジェクトを示す。↑の例では、新規作成したico sphere が操作対象。

演習2

解説動画

レイヤーを2へ切り替える

マウス操作 or 数字キー2(数値入力PADではないほう)

Blenderの Text Editor 画面のメニュー new を押す。

Python スクリプトの入力と実行

import bpy
import math
materials = []
for i in [0, 1, 2, 3, 4, 5, 6]:
    materials.append(bpy.data.materials.new('Color' + str(i)))
materials[0].diffuse_color = [1,0,0]
materials[1].diffuse_color = [0,1,0]
materials[2].diffuse_color = [0,0,1]
materials[3].diffuse_color = [0,1,1]
materials[4].diffuse_color = [1,0,1]
materials[5].diffuse_color = [1,1,0]
materials[6].diffuse_color = [1,1,1]
for i in [0, 1, 2, 3, 4, 5, 6]:
    t = 2.0 * math.pi * i / 7
    x = 1.0 * math.cos(t)
    y = 1.0 * math.sin(t)
    bpy.ops.mesh.primitive_ico_sphere_add()
    bpy.context.object.location = [x, y, 0]
    bpy.context.object.scale = [0.5, 0.5, 0.5]
    bpy.context.object.data.materials.append(materials[i % 7])

スクリプトの実行には Run Script ボタンを押す。

※マウス操作で、手動でオブジェクトを削除してみる。

右クリックで削除するオブジェクトを選択 → deleteキー → delete OK を選択

オブジェクトの配置半径を変更する。

    x = 4.0 * math.cos(t)
    y = 4.0 * math.sin(t)

※オブジェクトを 全選択 するには a キーを押す。 前回作成したオブジェクトが不要なら、全削除する。

配置するオブジェクト数の増加、半径の拡大、1つあたりの角度の変更

for i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]:

t = 2.0 * math.pi * i / 7 / 2

x = 6.0 * math.cos(t)

y = 6.0 * math.sin(t)

提出物1(演習1と2)

Python スクリプト と 3Dビューを収めたスクリーンショット を Webclass の第10回課題に提出

3Dビューは、SHIFTキー を押しながら、 キー 1 と 2 を順に押して、レイヤー1と2が表示(重なる)されている状態にしておくこと。

HOMEボタンを押して、全てのオブジェクトが表示されるようにすること。

例)

提出期限 来週まで。

以下の応用にチャレンジしてみよう。

・ 色の設定は [1,0,0] のほか、 [0.5, 0.5, 0.5] (この数値は灰色になる)など、 0.0 から 1.0 までの値が指定できる。

・ 色の数や、順番を入れ替えてみる

・ オブジェクトの変更

bpy.ops.mesh.primitive_ico_sphere_add()

bpy.ops.mesh.primitive_cube_add()

へ変更すると 球体 から 立方体に オブジェクトを変更できる。

他の種類の立体を使いたい場合は、

3Dビューメニューの Add -> Mesh からオブジェクトの種類を表示して、使用するコマンドを確認できる。

・for ループの部分をコピーして、 オブジェクトを表示する座標や サイズ を変更する

※ location = (x, y, 0) を location = (x, y, 2) と変更すると、表示位置のZ座標を変更できる。

・for ループを2重にする。

例) Python は、インデント(コードの表示位置)の高さで、ループ範囲(ブロック)を表現するので、↓のコードを使用する際は、左側の空白部分も正確に入力すること。

for z in [0, 2, 4]:
    for i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]:
        t = 2.0 * math.pi * i / 7 / 2
        x = 6.0 * math.cos(t)
        y = 6.0 * math.sin(t)
        bpy.ops.mesh.primitive_ico_sphere_add()
        bpy.context.object.location = [x, y, z]
        bpy.context.object.scale = [0.5, 0.5, 0.5]
        bpy.context.object.data.materials.append(materials[i % 7])

※↑このコードには、 インデントが 2レベル ある。外側が z座標を変化させるループ、 内側が円周に配置するループ。

・ ランダムの利用。 コメント欄のリンク先を参照

・range の応用。

range(0,10) で、 [0,1,2,3,4,5,6,7,8,9,10]

range(0,10,2 ) で、 [0, 2, 4, 6, 8] 2つおき

range(10,0,-1)で、 [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] の逆順をリストを作成できる。

例)

for i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]:

for i in range(0,13):

と同じ動作。 range は丸括弧 ( ) を使うので注意。

・Python の リスト内包表記 を利用して、複雑な数列を作成し、利用する。コメント欄のリンク先を参照

例) 2乗の数列の生成

[i*i/10 for i in range(0, 10)]

↑で、↓を生成

[0.0, 0.1, 0.4, 0.9, 1.6, 2.5, 3.6, 4.9, 6.4, 8.1]

作成例1)

高さ z の 値に反比例(1/z)するように半径をすぼめるコード。

for z in [1, 2, 3, 4, 5, 6, 7]:
    for i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]:
        t = 2.0 * math.pi * i / 7 / 2
        x = 6.0 * math.cos(t)
        y = 6.0 * math.sin(t)
        bpy.ops.mesh.primitive_ico_sphere_add(size = 0.5, location = (x/z, y/z, z*2))
        bpy.context.object.data.materials.append(materials[i % 7])

作成例2)

高さzに比例して半径を拡大するコード。

for z in [1, 2, 3, 4, 5, 6, 7]:
    for i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]:
        t = 2.0 * math.pi * i / 7 / 2
        x = 6.0 * math.cos(t)
        y = 6.0 * math.sin(t)
        bpy.ops.mesh.primitive_ico_sphere_add(size = 0.5, location = (x*z/7, y*z/7, z*2))
        bpy.context.object.data.materials.append(materials[i % 7])

作例3)

2種類のオブジェクト(cube ico_sphere) を使用。5色に減色。上下の段で、色を連続して使用。

for i in [0, 1, 2, 3, 4, 5, 6]:
    t = 2.0 * math.pi * i / 7
    x = 6.0 * math.cos(t)
    y = 6.0 * math.sin(t)
    bpy.ops.mesh.primitive_cube_add()
    bpy.context.object.location = [x, y, 0]
    bpy.context.object.data.materials.append(materials[i % 7])
c = 0
for z in [12, 10, 8, 6, 4, 2, 0]:
    for i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]:
        t = 2.0 * math.pi * i / 7 / 2
        x = 4.0 * math.cos(t)
        y = 4.0 * math.sin(t)
        bpy.ops.mesh.primitive_ico_sphere_add()
        bpy.context.object.location = [x*z/12, y*z/12, 12 - z]
        bpy.context.object.scale = [0.5, 0.5, 0.5]
        bpy.context.object.data.materials.append(materials[c % 5])
        c += 1

演習2

iOS アプリ のカメラアプリ + OpenGL GS シェーダー言語 「FILTERS」で学ぶ GLSL (制作 カヤック)

iPhone アプリ FILTERS を App Store からDL(無料)してインストールしておく。

iPad 専用アプリではないので、DLする際に検索先を変更する)。

GLSLとは: 画像処理(CG作成、やカメラ)で、画像の全ての画素(ピクセル)の色を、プログラムにより修正・加工するための専用言語

組み立てパソコンやゲーム機などグラフィック性能の高い製品は、このGLSLの処理能力も高性能である。

(ゲームのエフェクト処理、モーションブラーなどで活躍)

操作方法をデモするので、いっしょに操作してみましょう。

提出物2

FILTERS で撮影した写真を Webclass にアップロードする。(問題2)

方法:

iPad から Webclass を開いて、ログイン。提出課題を選択して、 ファイルをカメラロールからアップロード。

応用(チャレンジャー求む):

Twitter か Facebook のアカウントを所有している受講生は、 パソコンと Filters を連携させて、

オリジナルのフィルターを作成

することができます。

自作したフィルターで撮影した写真をアップロードしてみてください。

Filterのサンプルにあるような面白いフィルターの自作はある程度の勉強が必要です。

提出課題としては、練習用のシンプルなものでOKです。

作成例) 赤の世界

下記のGLSLコードでは、

color 変数にカメラで撮影したピクセルの色が記録されている。

color.r は red

color.g は green

color.b は blue

の各色の値になる。

次のコマンドで、画面上の色を決める。

gl_FragColor = vec4( 赤色の値, 緑色の値, 青色の値, 1.0);

次の例は、カメラで撮影した色をそそまま画面の色として設定している。

gl_FragColor = vec4( color.r, color.g, color.b, 1.0);

例) 赤色だけカメラ画像を使用し、緑と青の色は使用しない。 → 赤色だけの世界

void main()
{
    vec2 uv = iScreen;
    
    vec4 color = texture2D(iCamera, uv);
    
    gl_FragColor = vec4(color.r,0.0, 0.0, 1.0);
}

例) RGB の色成分を GBRの順に入れ替える。 → 色の狂った世界

void main()
{
    vec2 uv = iScreen;
    
    vec4 color = texture2D(iCamera, uv);
    
    gl_FragColor = vec4(color.g,color.b, color.r, 1.0);
}

以下の演習テーマは、時間が余れば、次回以降で扱う予定。

SVGフォーマットの画像をWebに埋め込み。 inkscape + スクリプト