今回も前回に引き続いてTouchDesignerとGLSLを組合せて高度な表現に挑戦します。前回はフラグメントシェーダー (ピクセルシェーダー) を用いてテクスチャー (TOP) を生成する2次元的な表現に留まっていました。今回はさらにGLSLを応用して3次元の形態(SOP)にGLSLを適用していきます。まず始めにGLSL TOPを用いてバンプマッピング (Bump mapping) をPhongマテリアル(Phong MAT)に適用しレンダリングの際に3Dの形状を変形するという手法を行います。さらに、続いて、GLSL MATを使用して頂点シェーダー (vertex shader) を用いて座標の情報をもとにマテリアルを動的に生成する手法に挑戦します。
スライド資料
サンプルプログラム
本日の課題
今回の講義資料およびサンプルプログラムを参考にして、GLSLを使用した高度な表現をTouchDesignerを用いて行ってください。今回も内容はかなり難しいので、サンプルのプログラムを元にして、何か少しだけ変更を加えるだけで大丈夫です!
課題提出 + アンケート
本日の課題の提出は下記から行ってください。
課題提出 + アンケート
実習の初回となる今回は、まずこの実習でテーマにする「生成AI (Generative AI)」とは何なのか、また人工知能、機械学習、ニューラルネットワーク、深層学習といった分野と生成AIの関係について整理して理解します。
その上で今回はプロンプト (テキストによる指示) から画像を生成する「画像生成AI」を使ってみます。DALL-E、ImageFX、Midjorneyなど様々な画像生成AIサービスを紹介した後、実際に画像を生成しながらその特徴や性質を理解していきます。
最後に課題を出題します。今回の課題は「生成コレクション」です。ひとつのプロンプトから大量に類似した画像を生成できるという画像生成AIの特性を生かして、ひとつのテーマの元生成した画像のコレクションを作成しレイアウトしていきます。
スライド資料
課題: 生成コレクション
課題: 生成AIを用いて、架空のコレクションを作成する
第1課題は、画像生成AIを積極的に活用して作品を制作します。画像生成AIの魅力のひとつは、単一のプロンプト (画像の生成を指示する文章) から大量のバリエーションの画像を生成できる点です。この性質を利用して、パッケージデザインやカーデザイン、建築のイメージスケッチなど様々な分野で活用が始まっています。今回の課題は、この画像生成AIの大量に類似画像を生成できるという点に着目して、何かのテーマによって収集された架空のコレクションを作成します。
生成コレクションの制作手順
Figmaの制作テンプレート にアクセス
テンプレートをコピーして自分のファイルに ← 必須!!
生成AIを使用して生成した画像をグリッドにあわせてレイアウト
最後にPDFを書き出し!
詳細なやりかたは実習の中で解説していきます!
参考資料
VIDEO
動画生成AI「Sora」の紹介映像
VIDEO
Jacob CollierとGoogleのチームによるMusicFX DJのメイキング
VIDEO
生成AIとは何か? 基本概念の解説
VIDEO
ChatGPT誕生に至るまでの、30年のAI研究の歴史
アンケート
本日の実習に参加した方は以下のアンケートに答えてください。
今回の補講は番外編として「ライブコーディング (Live Coding)」について紹介していきます。ライブコーディングとは、まるで楽器を演奏するようにコード (プログラム) を用いて音と映像をリアルタイムに生成するライブパフォーマンスの手法です。今回の講義では、まず簡単にライブコーディングの概要と誕生の歴史を紹介します。その後、Strudel というWebブラウザー上で動作するライブコーディング環境を使用して、ライブコーディングを体験します。
スライド資料
サンプルコード
リズム (ドラム)
// 音を出す
$: s("cp")
// 音色を変える
$: s("casio")
// 音色のバリエーション
$: s("casio:1")
// ドラムサウンド
$: s("bd hh sd oh")
// ドラムセットの切り替え
$: s("bd hh sd oh").bank("RolandTR909")
// 沢山の音を1シーケンスに
$: s("bd bd hh bd rim bd hh bd")
// テンポの変更
$: s("bd bd hh bd rim bd hh bd").cpm(40)
// 休符
$: s("bd hh ~ rim")
// サブシーケンス
$: s("bd [hh hh] sd [hh bd]")
// サブサブシーケンス
$: s("bd [[rim rim] hh]")
// かけ算
$: s("bd hh*2 rim hh*3")
// サブシーケンスのかけ算
$: s("bd [hh rim]*2 bd hh*3")
// 超高速かけ算
$: s("bd hh*16 rim hh*8")
// パラレルに演奏
$: s("cp*3, rim*4")
// パラレルに演奏、さらに追加
$: s("cp*3, rim*4, bd*5")
// サブシーケンスのパラレル
$: s("cp*3, rim*4, bd [bd*2, hh*4]")
// 複数のパートを同時に演奏
$: s("bd(3, 8), [~ hh]*4")
.bank("RolandTR909")
$: s("cp(7, 16)").jux(rev)
$: s("piano(9, 16)")
.speed("<2 3 0.5 1>*16")
.delay(0.5).delaytime(0.625)
メロディー (シンセサイザー)
// シンプルにシンセを鳴らしてみる
$: s("supersaw*4").note(60)
// 音階で指定
$: s("supersaw*4").note("c4")
// 半音階、シャープ
$: s("supersaw*4").note("cs4")
// 半音階、フラット
$: s("supersaw*4").note("df4")
// シンセの音色の種類を変えてみる
$: s("supersaw sine square triangle").note(60)
// 音階を弾く
$: s("supersaw*4").note("c d e f")
// ランダムな音階
$: s("supersaw*4").note(irand(12).add(40))
// 短かい持続
$: s("supersaw*4")
note(irand(12).add(40)).legato(0.2)
// 短かい持続と長い持続
$: s("supersaw*4")
.note(irand(12).add(40)).legato("<0.2 1.0>*4")
// メロディーの生成
$: s("supersaw*8")
.legato("<1.2 0.5>*8")
.note("<c4 e4 f4 g4 b4>*8"
// メロディーの生成
$: s("supersaw*8")
.legato("<0.5 1.2>*8")
.note("<c4 e4 f4 g4 b4>*8"
.add("0 -12")
.add("[0, 7, 12]"))
// メロディーの生成2
$: s("supersaw*8")
.note("{40 44 45 47 49 52}%11".add("[0, <5 7>, 12], 24"))
// メロディー + フィルター + エフェクト
$: s("supersaw*8")
.note("{40 44 45 47 49 52}%11".add("[0, <5 7>, 12]"))
.lpf("<400 2000 1200 8000>*8").delay(0.75).delaytime(0.125)
// メロディー + フィルター + エフェクト その2
$: s("supersaw(11, 16)")
.note("{40 47 52}%21"
.add("[0, <5 7 -5>]")
.add("<0 12 -12 24>*4"))
.lpf(sine.segment(32).range(400, 8000)).resonance(12)
.delay(0.75).delaytime(0.125).delayfeedback(0.7)
// メロディー + フィルター + エフェクト + リズム
$: s("supersaw(5, 16, [0, 5, 12])")
.note(
"<c d e f g a>*2"
.add("[0, <12 -12>]")
.add("[0, 7, 12]")
.add("<-12 -12 -12 0>/8")
)
.legato("<0.5 1.7>*2")
.delay(0.75).delaytime(0.625).delayfeedback(0.5)
.lpf(sine.segment(32).range(100, 8000)).resonance(10)
$: s("bd(3, 8), [~ hh]*4")
.bank("RolandTR909")
.gain(1.3)
// メロディー + リズム その2
$: s("supersaw(7, 16, [0])")
.note("<c f g>*8".add("[0, 7] [0, 12]".add("<0 7 -12>*8")))
.legato("0.7 1.5")
.lpf(sine.slow(32).range(1200, 8000)).resonance(10)
.delay(0.2).delaytime((3/8))
.jux(iter(16)).gain(0.7)
$: s("supersaw(11, 16, [3])").note("<c2 f2 g2>, <c1 g1>*4".add("[0, 7, 12]"))
.legato("0.9 0.5")
.lpf(sine.slow(12).range(2000, 4000)).resonance(10)
.delay(0.7).delaytime((5/8)).delayfeedback(0.8)
.gain(1.0)
$: s("hh(9, 16, 3), cp(9, 16, 5)")
.delay(0.7).delaytime((4/8)).delayfeedback(0.8)
$: s("bd(3, 8)").gain(2.0).bank("RolandTR909")
関連リンク
VIDEO
VIDEO
VIDEO
VIDEO
VIDEO
VIDEO
VIDEO
VIDEO
VIDEO
VIDEO
VIDEO
アンケート
今回の補講に参加した方は下記のアンケートに答えてください
本日の内容
今回はこの講義の最終課題制作のためのヒントの2回目として、スペキュラティブデザインの手法を用いた生成AIの活用例を紹介します。スペキュラティブデザインは、Preferred futures (望ましい未来)の可能性を探るためのデザイン手法であり、既存の価値観や常識を問い直すことを目的としています。生成AIのパワーを活用して、スペキュラティブデザインの手法によって未来のシナリオを探求し現実の制約を超えた新たな可能性を模索します。
スライド資料
スペキュラティブデザインとは
スペキュラティブデザイン(Speculative Design)とは、未来の可能性やシナリオを探求するデザインのアプローチです。伝統的なデザインが現実的な問題解決を目指すのに対し、スペキュラティブデザインは、まだ実現されていない技術や社会的変化を前提に、未来のライフスタイルや文化を想像します。この手法は、批判的デザイン(Critical Design)とも関連し、既存の価値観や常識を問い直すことを目的としています。
スペキュラティブデザインは、デザイナーが未来のシナリオを描くことで、現在の問題や課題に新たな視点を提供します。たとえば、環境問題やテクノロジーの進化に伴う倫理的な課題など、複雑なテーマに対する洞察を深める手助けをします。具体的には、未来の製品やサービス、社会構造を具現化するプロトタイプやコンセプトモデルを作成し、それを通じて議論を促進します。
参考書:
アンソニー・ダン, フィオーナ・レイビー『スペキュラティヴ・デザイン 問題解決から、問題提起へ。—未来を思索するためにデザインができること 』ビー・エヌ・エヌ新社 (2015)
試し読み:『スペキュラティヴ・デザイン』 第1章
VIDEO
参考: Not Here, Not Now / Professor Anthony Dunne from RCA
Speculative (スペキュラティブ)
思索の、思索にふける、熟考する
〔不確かな情報に基づいた〕推測の、推論の、思弁的な、空論の
《金融》投機の、投機的な、危険をはらんだ
英辞郎 より
スペキュラティブデザインの文脈では、1と2の意味
The Cone of Possibilities (可能性の円錐)
出典: Speculative Design and a Cone of Possibilities
Probable futures (起こりそうな未来)
ほとんどのデザイナーはこの領域で活動
世の中の多くのデザイン方法論、ツール、慣行、教育
Plausible futures (起こってもおかしくない未来)
未来のシナリオの計画や洞察
近未来の世界的状況をモデル化
Possible futures (起こりうる未来)
フィクション (文芸、映画、SF)
思索的なシナリオ
※これより外の領域 → 空想
Preferred futures (望ましい未来)
「起こりそう」と「起こってもおかしくない」が混じりあう部分
未来を予測するのではなく、デザインの力で様々な可能性を切り開く
→ スペキュラティブデザインが目指す領域
Dunne & Raby A/B
普通に実践されているデザイン スペキュラティブデザイン Affirmative 肯定的 Critical 批判的 Problem solving 問題解決する Problem finding 問題を発見する Provide answers 答えを提供する Asks Questions 問題を定義する Design for production 生産としての Desing for debate 討論のため Design as solution 解決策としての Design as medium 手段としての In the service of industory 産業界のため In the service of society 社会のため Fictional functions 虚構的な機能 Functional fictions 機能する虚構 For how the world is 今ある世界のため For how the world could be 未来のため Change the world to suit us 人間にあわせて世界を変える Change us to suit the world 世界にあわせて人間を変える Science fiction サイエンスフィクション Social fiction ソーシャルフィクション Futures 未来 Parallel worlds 並行世界 The “real” real “現実的な”現実 The “unreal” real 非現実的な現実 Narrative of production 生産の物語 Narrative of consumption 消費の物語 Applications 応用 Imprications 意味合い Fun 楽しみ Humor ユーモア Innovation イノベーション Provocation 刺激 Concept Design コンセプト Conceptual Design コンセプチュアル Consumer 消費者 Citizen 市民 Makes us buy 買わせる Makes us think 考えさせる Ergonimics 人間工学 Rhetoric レトリック・誇張 User-friendliness ユーザーフレンドリー Ethics 倫理的 Process プロセス Authorship オーサーシップ
スペキュラティブデザイン作品例
Duune & Raby, WELLCOME WINDOWS, 2010
https://dunneandraby.co.uk/content/projects/525
「もしも…だったら (What if …. ?) 」という問いかけから構成された窓のデザイン。
「もし私たちが子供を遺伝子操作できるとしたら?」
「もし私たちが永遠に生きられるとしたら?」
「もし私たちが動物とコミュニケーションできるとしたら?」
「もし私たちが天気をコントロールできるとしたら?」
Duune & Raby, TECHNOLOGICAL DREAMS SERIES: NO.1, ROBOTS, 2007
https://dunneandraby.co.uk/content/projects/10
未来のロボットと人間との関係性について探求。独立したロボット、依存的で神経質なロボット、臆病なロボットなど、さまざまな個性を持つロボットが登場。
Neeby Robot (助けが必要なロボット)
Filip Dujardin, Untitled from the series Fictions 2009
建築写真のフォトモンタージュにより、現代の建築要素を再構成し存在しない架空の建築物を創作。
https://www.sci-fi-o-rama.com/2018/08/06/impossible-architectures-the-works-of-filip-dujardin
https://josefschulz.com/formen
既存の産業的・商業的な構造物の写真をわずかに修正した結果浮かび上がってくる抽象的な構造の美。
Patricia Piccinini, Meet Graham, 2016
https://www.meetgraham.com.au
https://www.designboom.com/art/graham-patricia-piccinini-transport-accident-commission-car-crash-07-22-2016
交通事故の衝撃から生き残るために進化した人間の姿を想像したサイボーグのプロトタイプ。
The yes men, New York Times Special Edition, 2008
https://theyesmen.org/project/nytimes
実際のNew York Timesそっくりに模倣されたフェイク新聞。2008年のアメリカ大統領選挙でバラク・オバマが当選した直後に発行。イラク戦争の終結(という希望)など。
長谷川愛「私はイルカを産みたい…」
https://aihasegawa.info/i-wanna-deliver-a-dolphin
人間が子供を産む代わりに、絶滅の危機にある種(例えばイルカ)を代理出産するというアイデアを提案。
長谷川愛 「Parallel Tummy 2073」
https://aihasegawa.info/parallel-tummy-2073-2
「だれでも、いつでも、ひとりの子ども」というフレーズとともに人工子宮が使えるようになった50年後、2073年の東京。この設定をもとに、LARP(ライブアクションロールプレイング)というキャラクターになりきって即興的な会話や演技をする、一種のごっこ遊びの手法を用いて人工子宮がもたらす様々な倫理問題やリスク、そして喜びを炙り出すためのワークショップを行いました。ここでは3時間を超えるワークショップを要約した映像と、セッションで発生したシナリオの概要や疑問を展示しています。
課題制作例: 「生成AI + スペキュラティブデザイン」
生成AIによるスペキュラティブデザイン – Speculative Design with Generative AI
生成AIのパワーを活用して、スペキュラティブデザインの手法によって未来のシナリオを探求し現実の制約を超えた新たな可能性を模索する。
生成AIのパワーでスペキュラティブデザインを推し進める
Preferred futures (望ましい未来) を想像し表現する
スペキュラティブデザインの手法
未来を探る:現実に基づいた未来のシナリオを想像し、その中でどのような課題や可能性が生じるかを探る
批判的思考:現在の社会的、技術的、文化的な状況に対する批判的な視点を提供し、既存の価値観や前提を問い直す
物語とシナリオ:デザインされたオブジェクトやプロトタイプを通じて、未来のシナリオや物語を具体化し作品化する
使用する生成AI
最終成果物の種類に応じて自由に選択
ChatGPT、Dall-E、Suno、StableDiffusion、その他有料サービス (LeonardAI、RunwayMLなど)
最終成果物
想像した未来のシナリオ (物語) についての解説
未来のシナリオに基づいて生成AIを使用して作成した何らかのアウトプット
もし可能であれば、オープンキャンパスで展示したい!
「What if … ?」
「もしも…だったら (What if … ?) 」という問いを考える
「もしも…だったら」という問いを考える
その問いを元に生成AIを用いて画像を生成する
単なる空想ではなく、スペキュラティブな「Preferred futures (望ましい未来)」について考える。
Preferred futures (望ましい未来) :「起こりそう」と「起こってもおかしくない」が混じりあう部分
最終制作アンケート
この講義ではここまで解説してきた生成AIの技術と自分自身の専門性を生かした作品制作を行い、その成果をAMCのギャラリーで展示します。どのような作品を制作する予定か下記のアンケートに記入してください。※まだ最終の確定版でなくても構いません
締切: 12月19日 (木)
アンケート
本日の講義に参加した方は以下のアンケートに答えてください。
今回から何回かにわたって、オブジェクト指向プログラミング (Object Oriented Programing) というトピックスについて学んでいきます。
まず始めの出発点として、完全にランダムな確率で動きまわる「ランダムウォーク」な動きをする点の動きをつくりその軌跡を描いてみます。次に、このランダムな動きを増殖させていきます。
増殖の際に今回は全てを一つのプログラムに書くのではなく、それぞれの点を細かなプログラムで実装し、その小さなプログラム達を組合せることで一つの機能を生みだすような設計にします。この小さなプログラムを「オブジェクト (Object)」と呼び、オブジェクトを構成単位にしてプログラムを作成していく手法を、オブジェクト指向プログラミング (OOP) と呼びます。
OOPの考え方は今後も重要な内容となってきますので、実例を通して確実に理解していきましょう。
スライド資料
本日のスタートポイント
VIDEO
ランキング
おめでとうございます!!
本日の課題
クラスを用いてOOPな生成的な作品を制作してください!
今回の講義内で作成した増殖するランダムウォークのプログラムを参考に、オブジェクトを大量に複製することで生成的な作品を制作してください。
投稿したURLをアンケートから提出
投稿の際にsfc241206 のタグをつけてください!
締切: 2021年12月7日(水)まで!
アンケート
今回も、前回の提出作品の人気投票を行います!
前回のタグsfc241129 でOpenProcessingで検索 (検索方法をSketches that are tagged にする必用あり)
一番良いと思った作品に1票投票 (自信があれば自分の作品でも可)
サンプルプログラム
ランダムウォーク基本
ランダムウォークをクラス化
ランダムウォーククラスの配列
完成版
TidalCycleでここまで使用してきた方法では、サンプリング(録音)したサウンドファイルを演奏してきました (cp hc bdなど) 。これは楽器に例えるなら、サンプラーを演奏している状態です。TidalCyclesではこの他にシンセサイザーのように音の波形を合成して演奏する「楽器」も用意されています。このシンセサイザーの機能はSuperCollider内で楽器 (Synth) として定義されていて、自分自身でプログラミングすることでオリジナルの楽器を作成することも可能です。今回の授業の前半はこのTidalCyclesのシンセサイザーの機能に着目していろいろ実験していきます。
シンセサイザーを使用するには、SuperColliderにSC3 Pluginsがインストールされている必要があります。下記のリンクから最新版のものをダウンロードして所定の場所にインストールしてください。
参考:
シンセサイザー
VIDEO
Sequential Circuits Prophet 5 (アナログシンセサイザー)
VIDEO
YAMAHA DX-7 (デジタルシンセサイザー)
VIDEO
Eurorack (モジュラーシンセサイザー)
スライド資料
アンケート
本日の講義を履修した方は以下のアンケートに回答してください。
※ 旧カリ「サウンドプログラミング」「環境情報デザイン」で履修の方はこちら
サンプルコード
TidalCycles
-- シンプルにシンセを鳴らしてみる
d1
$ s "supersaw*4"
# note 0
-- 音階で指定 シャープ
d1
$ s "supersaw*4"
# note "cs5"
-- 音階で指定 フラット
d1
$ s "supersaw*4"
# note "df5"
-- シンセの音色の種類を変えてみる
d1
$ s "supersaw superpwm supersquare superzow"
# note 0
-- シンセの種類
-- supermandolin, supergong, superpiano, superhex, superkick, super808,
-- superhat, supersnare, superclap, supersiren, supersquare, supersaw,
-- superpwm, supercomparator, superchip, supernoise, superfork,
-- superhammond, supervibe, superhoover, superzow, superstatic,
-- supergrind, superprimes, superwavemechanics, supertron, superreese
-- 音階を弾く
d1
$ s "supersaw*4"
# note "0 4 5 7"
-- ランダムな音階
d1
$ s "supersaw*8"
# note (irand 12)
-- 短かい持続
d1
$ s "supersaw*8"
# legato "0.5"
# note (irand 12)
-- 短かい持続と長い持続
d1
$ s "supersaw*8"
# legato "<0.5 1.2>*8"
# note (irand 12)
-- メロディーを生成してみる
d1
$ s "supersaw(11, 16)"
# legato "<0.5 1.5>*8"
# note "{c4 e4 f4 g4 b4}%11"
|+ note "[0, 7, 12]"
-- メロディーを生成+変形
d1
$ jux (iter 16)
$ s "supersaw(11, 16)"
# legato "<0.5 1.5>*8"
# note "{c4 e4 f4 g4 b4}%11"
|-note "0 12"
|+note "[0, 7, 12]"
-- メロディーを生成+変形+エフェクト
d1
$ jux (iter 16)
$ s "supersaw(11, 16)"
# legato "<0.5 1.5>*8"
# note "{c4 e4 f4 g4 b4}%11"
|- note "0 12"
|+ note "[0, 7, 12]"
# lpf(range 100 12000 $rand)
# resonance "0.2"
# delay "0.5" # delaytime "0.25"
# delayfeedback "0.7"
Strudel (1行ごとにコピペして使用)
// シンプルにシンセを鳴らしてみる
$: s("supersaw*4").note(60)
// 音階で指定
$: s("supersaw*4").note("c4")
// 半音階、シャープ
$: s("supersaw*4").note("cs4")
// 半音階、フラット
$: s("supersaw*4").note("db4")
// シンセの音色の種類を変えてみる
$: s("supersaw sine square triangle").note(60)
// 音階を弾く
$: s("supersaw*4").note("c d e f")
// ランダムな音階
$: s("supersaw*4").note(irand(12).add(40))
// 短かい持続
$: s("supersaw*4")
note(irand(12).add(40)).legato(0.2)
// 短かい持続と長い持続
$: s("supersaw*4")
.note(irand(12).add(40)).legato("<0.2 1.0>*4")
// メロディーの生成
$: s("supersaw*8")
.legato("<1.2 0.5>*8")
.note("<c4 e4 f4 g4 b4>*8"
// メロディーの生成
$: s("supersaw*8")
.legato("<0.5 1.2>*8")
.note("<c4 e4 f4 g4 b4>*8"
.add("0 -12")
.add("[0, 7, 12]"))
// メロディーの生成2
$: s("supersaw*8")
.note("{40 44 45 47 49 52}%11".add("[0, <5 7>, 12], 24"))
// メロディー + フィルター + エフェクト
$: s("supersaw*8")
.note("{40 44 45 47 49 52}%11".add("[0, <5 7>, 12]"))
.lpf("<400 2000 1200 8000>*8").delay(0.75).delaytime(0.125)
// メロディー + フィルター + エフェクト その2
$: s("supersaw(11, 16)")
.note("{40 47 52}%21"
.add("[0, <5 7 -5>]")
.add("<0 12 -12 24>*4"))
.lpf(sine.segment(32).range(400, 8000)).resonance(12)
.delay(0.75).delaytime(0.125).delayfeedback(0.7)
// メロディー + フィルター + エフェクト + リズム
$: s("supersaw(5, 16, [0, 5, 12])")
.note(
"<c d e f g a>*2"
.add("[0, <12 -12>]")
.add("[0, 7, 12]")
.add("<-12 -12 -12 0>/8")
)
.legato("<0.5 1.7>*2")
.delay(0.75).delaytime(0.625).delayfeedback(0.5)
.lpf(sine.segment(32).range(100, 8000)).resonance(10)
$: s("bd(3, 8), [~ hh]*4")
.bank("RolandTR909")
.gain(1.3)
Shaderとは、もともとは3Dコンピュータグラフィクスで、シェーディング (陰影処理) をするプログラムのことを指していました。従来は、開発者やデザイナーは、グラフィクスカード (GPU) に固定機能として実装された定形の処理しか使えませんでした (固定機能シェーダー)。2000年代に入って、プログラマブル・シェーダーが登場します。これまでブラックボックスだったシェーダー自体が、プログラム可能になりました。OpenGLではGLSLというプログラミング言語が策定されシェーダーをプログラムすることが可能です。画面上の膨大なピクセル情報を、高い並列処理性能を持つGPUで実行することにより、CPUで実行するよりもはるかに高いパフォーマンスを実現できるようになりました。
TouchDesignerでは、GLSL TOPを使用してGLSLを記述してテクスチャーとして書き出すことが可能です。今回はTochDesignerでのGLSLの使用法の導入を行います。
スライド資料
サンプルプログラム
本日の課題
今回の講義資料およびサンプルプログラムを参考にして、GLSLを使用した表現をTouchDesignerを用いて行ってください。今回の内容は少し難しいので、サンプルのプログラムの色などを変えるだけでもOKです!
課題提出 + アンケート
本日の課題の提出は下記から行ってください。
スライド資料
本日の内容
今回からこの講義の最終課題のヒントになるような内容を紹介していきます。初回の本日は、難易度的には易しい制作例を紹介します。作品の制作例は「生成コレクション」と名付けました。制作にはDALL-Eなどの画像生成AIを使用します。生成AIの特徴である一つのプロンプトから大量のバリエーションのインスタンスを生成できるという性質を利用して、特定のテーマで生成した画像をコレクションして展示します。最初に参考となる作品例を紹介した後で、具体的な制作方法について解説していきます。
生成コレクション
「生成コレクション」概要
画像生成AIの魅力のひとつは、単一のプロンプト (画像の生成を指示する文章) から大量のバリエーションの画像を生成できる点です。この性質を利用して、パッケージデザインやカーデザイン、建築のイメージスケッチなど様々な分野で活用が始まっています。今回の課題は、この画像生成AIの大量に類似画像を生成できるという点に着目して、何かのテーマによって収集された架空のコレクションを作成して作品として展示を行います。
画像生成AIを用いて「架空のコレクション」を作成する
題材は自由だが、テーマの「架空のコレクション」を想起させるものとする
展示を前提に、グリッド状に生成された「標本」画像を陳列して展示する (フォーマットは別途提供)
全てのコレクションを収集し編集した映像も作成する予定 (オープンキャンパスでの展示に活用)
使用する画像生成AIは好みのサービスを各自選択する
参考作品
Gene Kogan, A Book from the Sky 天书 (2015)
https://genekogan.com/works/a-book-from-the-sky
これらの画像は、手書きの中国語文字のデータベースでトレーニングされた深層畳み込み生成敵対的ネットワーク(DCGAN) によって作成されました。このネットワークは、2015 年 11 月にRadford、Luke Metz、Soumith Chintalaが発表した論文に基づいてAlec Radfordがコードを作成して作成しました。
タイトルは、宋代と明代の伝統的な北京語版画のスタイルで何千もの架空の象形文字を作成した 徐兵が1988 年に出版した本に由来しています。
DCGANは、画像コレクションの抽象表現を学習できる畳み込みニューラル ネットワーク の一種です。これは、偽の画像を作成する「ジェネレータ」と、ジェネレータの画像が本物かどうかを判別しようとする「ディスクリミネータ」との競争によって実現されます (詳細)。トレーニング後、ジェネレータを使用して、オリジナルを彷彿とさせるサンプルを説得力を持って生成できます。
Sarah Meyohas, Infinite Petals (2017)
https://sarahmeyohas.com/infinite-petals
Infinite Petalsでは、サラ・メヨハスが 10 万枚のバラの花びらのデータセットを使って GAN をトレーニングし、無限に新しくユニークな花びらを生成しました。データセットは、アーティストの前プロジェクトCloud of Petalsでまとめられたもので、当時 16 人の男性労働者がニュージャージー州の旧ベル研究所の敷地に集まり、花びらを 1 枚 1 枚撮影しました。ベル研究所は、トランジスタ、シリコン太陽電池、数多くのプログラミング言語などの革新が重要な開発を遂げた場所です。メヨハスは、人間の手で花を 1 枚 1 枚開いて花びらを摘み、レンズの下に置き、シャッターを押して、画像をサーバーにアップロードするという現実的なアルゴリズムを考案しました。これらの画像は、GAN (Generative Adversarial Network) のトレーニングに使用されました。GAN は 2017 年当時はまだ初期段階で、現代の人工知能ブームよりかなり前の技術でした。作業員たちはまた、最も美しいと思ったバラ1本につき花びらを1枚取ってプレス機にかけ、3,291枚の花びらを物理的な工芸品として保存した。
Anna Ridler, The Shell Record (2021)
https://annaridler.com/the-shell-record-2021
“The Shell Record” は、2021年初頭にこのアーティストがテムズ川の岸辺で収集した貝殻のデータセットと、この画像でトレーニングされたGANを使用して生成された動画作品の両方です。収集、価値、取引に関するアイデアを探求し、最も古い通貨の1つとして価値の保存手段として使用されてきた貝殻の歴史にリンクしています。
これはまた、この瞬間にブロックチェーンに永遠に書き込まれた、テムズ川の貝殻の記録でもある。最近の科学論文によると、最後の氷河期の終わりから川に存在していた貝殻は今では希少になっており、他の外来種に取って代わられており、地層の中で化石となることで、最終的には人新世のタイムマーカーとなるだろう。
https://dam.org/museum/artists_ui/artists/ridler-anna/the-shell-record
参考: GAN (Generative Adversarial Network) について
GAN(敵対的生成ネットワーク)とは|意味・仕組み・応用例
GAN(Generative Adversarial Network、敵対的生成ネットワーク)は、2014年にイアン・グッドフェローらによって提案された生成モデルの一種で、主に画像生成などに利用されています。GANは、生成器(Generator)と識別器(Discriminator)の2つのニューラルネットワークから構成されます。
生成器(Generator) : ランダムなノイズベクトルを入力として受け取り、本物のデータに似たデータを生成します。例えば、ランダムな数値からリアルな画像を作り出すことが可能です。
識別器(Discriminator) : 入力されたデータが本物か偽物かを判別します。本物のデータは実際のデータセットから取得され、偽物のデータは生成器が生成したものです。識別器はこれらのデータを区別するように訓練されます。
これら2つのネットワークは互いに競い合いながら学習を進めます。生成器は識別器を欺くようなデータを生成しようとし、識別器はそれを見破ろうとします。この競争的なプロセスを通じて、生成器はよりリアルなデータを生成する能力を獲得し、識別器もまた精度を高めていきます。
DCGAN(Deep Convolutional GAN) : DCGANは、GANに畳み込みニューラルネットワーク(CNN)を組み合わせたモデルで、より高精度な画像生成を可能にします。生成器と識別器の両方にCNNを適用することで、画像の特徴を効果的に捉え、高品質な画像を生成することができます。
現在画像生成にGANを用いる必要があるのか?
現在では画像の生成にGANやDC GANを用いなくても生成する手段が存在します。過去の画像生成AI導入 の回で解説したDALL-EやStable Diffusionのような拡散モデルやTransformerの技術によってテキストのプロンプトやソースとなる画像からより高品質の画像が生成できるようになりました。
現在の画像生成において、GANやDCGANではなく、DALL-EやStable Diffusionといった技術を用いるべき理由は、生成品質と応用範囲の大幅な向上にあります。GANはリアルな画像生成が可能ですが、学習の不安定さや多様性の不足が課題です。一方、DALL-EやStable Diffusionは、拡散モデルやトランスフォーマーの技術を活用し、テキスト指示に基づく柔軟な画像生成を実現しています。これにより、単にリアルな画像を生成するだけでなく、複雑な条件に応じた生成が可能となり、デザインや広告、教育といった多様な分野で活用されています。また、拡散モデルは学習が安定しており、生成された画像の多様性も高いです。さらに、Stable Diffusionのように計算効率を改善した技術は、より広範な応用を可能にしています。
参考: 生成モデルまとめ (Qiita)
参考: 画像生成AIのサービス
参考: 画像生成AI導入 (過去講義資料)
実習: Figmaを使用して「生成コレクション」を作成
Figma
https://figma.com
ブラウザベースのコラボレーション・ツール
デスクトップ版やモバイル版もあり
もともとはインターフェイス (UI) のデザインに特化していたが、グラフィクスデザインツールとしても使用可能
コラボレーション機能
学生であれば無料で使用可能! (ただし資格認定を受ける必要あり)
「生成コレクション」制作用テンプレート
こんな感じで作成可能です!
アンケート
本日の講義に参加した方は以下のアンケートに回答してください。
パーティクル (Particle) またはパーティクルシステム (Particle System) とは、たくさんの細かいスプライト画像、3Dモデル、またはその他のCGオブジェクトを使って、様々な現象をシミュレーションする表現手法です。パーティクルを用いて炎、爆発、煙、流水、火花、落葉、雲、霧、雪、埃、流星、毛髪、毛皮、草地など様々な現象や物体のふるまいをシミュレーションすることが可能です。
TouchDesingerでは、Particle SOPを用いることでとても簡単にパーティクルの生成と制御が可能です。また、生成したパーティクルにスプライト画像を適用したり、ジオメトリインスタンシングを用いてパーティクルの一粒ごとに3Dオブジェクトを配置することも可能です。今回はTouchDesingerのパーティクル表現についていろいろ実験していきます。
スライド資料
サンプルプログラム
本日の課題
今回の講義資料およびサンプルプログラムを参考にして、パーティクルを使用した表現をTouchDesignerを用いて行ってください。
課題提出 + アンケート
本日の課題の提出は下記から行ってください。
今回は、関数 (function) についてとりあげます。といっても、ここまでの講義で関数は頻繁に使用してきました。ここまでで使用してきた関数は主に2つの場合に分けられます。
1つ目は、プログラミングしているp5.jsのスケッチからp5.jsのライブラリー内で定義されているの関数を呼び出しです。例えば
//circle()関数の呼び出し
circle(400, 300, 100);
といったp5.jsで実行していた命令は、p5.jsの関数を呼び出していたのです。
2つ目は、 p5.jsのライブラリーから呼び出されている関数を定義する記述です。これは、setup() や draw() 内で書いていたプログラムに相当します。
//setup関数の定義
function setup() {
createCanvas(windowWidth, windowHeight);
frameRate(60);
...
}
関数はプログラムを処理内容ごとにモジュール化して、プログラムの可読性を高めデバッグを容易にします。
また、関数は引数(arguments)を受け取り、内部の処理のパラメータとして使用することが可能です。このことにより1つの関数で様々なバリエーションを持つことが可能となります。
p5.jsで実際に描画しながら関数について学んでいきましょう。
スライド資料
ランキング
おめでとうございます!!
映像資料
VIDEO
サンプルコード
本日の課題
関数を用いて作品を制作してください!
課題: 関数 (function) をつかって大量に形を増殖させる
引数によってバリエーションをつけながら何か形を描く関数を作成してください。作成した関数をdraw()関数から呼び出して大量に形を描いてください。
投稿したURLをアンケートから提出
投稿の際に sfc241129 のタグをつけてください!
締切: 2023年12月6日(水)まで!
アンケート
今回も、前回の提出作品の人気投票を行います!
前回のタグsfc241115 でOpenProcessingで検索 (検索方法をSketches that are tagged にする必用あり)
一番良いと思った作品に1票投票 (自信があれば自分の作品でも可)