ANTIGRAVITY LABEN
記事一覧/アプリ開発
アプリ開発/2026-04-21上級

Antigravity × クリエイティブコーディング — p5.js・Three.js・WebGL でインタラクティブアートを AI と共創する

p5.js・Three.js・WebGLを使ったクリエイティブコーディングをAntigravityと共に実践する上級ガイド。ジェネレーティブアートの設計から、GLSLシェーダー実装、作品の公開・収益化まで、動作コードとともに完全解説します。

p5.jsThree.jsWebGLGLSLクリエイティブコーディングジェネレーティブアートAntigravity338収益化23

プレミアム記事

コードを書くことと、アートを作ること。この2つは長い間、別々の世界の話だと思っていました。

プログラムを書くのはロジックで、アートを作るのは感性。そんな分け方が自分の中にあって、どちらかに集中しようとするたびに、もう一方が引っかかっていました。

Antigravity と出会って、その感覚が少し変わりました。コードの意図を伝えると、AIが実装してくれる。アイデアをスケッチするように書くと、Three.jsのシーンが立ち上がる。「この動きをもっと有機的にしたい」と言葉で伝えると、Perlinノイズのパラメータが調整される。

この記事は、そんな体験を具体的な実装として共有するものです。p5.jsでジェネレーティブアートを始めて、Three.jsで3D表現に踏み込み、GLSLシェーダーで表現を深めるまでのプロセスを、Antigravityとのやりとりを含めながら書いています。

クリエイティブコーディングは、完成させることよりも、実験のプロセス自体が面白い分野です。ただ、それを言い訳にして動かないコードを抱えたままにするのも違う。ここで扱うのは「動くもの」を作ることにこだわって書きました。


環境構築:p5.js + Antigravity のセットアップ

Vite + p5.js プロジェクトを立ち上げる

クリエイティブコーディングの環境は、シンプルであるほど続きます。p5.jsをCDNで読み込む方法もありますが、Viteを使うとホットリロードが効いて、コードを変えるたびにリアルタイムで結果が反映されます。この体験は、アート制作のフローと相性がいいです。

# Vite プロジェクトを作成
npm create vite@latest my-generative-art -- --template vanilla
 
cd my-generative-art
npm install
npm install p5
 
# Antigravity でプロジェクトを開く
# antigravity . でもいいし、GUIから開いてもOK

main.jsを以下のように書き換えます。p5.jsをインスタンスモードで使うのがポイントです。グローバルモードだと変数汚染が起きやすく、複数のスケッチを管理するときに問題が出ます。

// main.js — p5.js インスタンスモードのベース設定
import p5 from 'p5'
 
const sketch = (p) => {
  let canvas
 
  p.setup = () => {
    canvas = p.createCanvas(p.windowWidth, p.windowHeight)
    canvas.parent('app')
    p.colorMode(p.HSB, 360, 100, 100, 100)
    p.background(0, 0, 10)
  }
 
  p.draw = () => {
    // ここにジェネレーティブアートのロジックを書く
  }
 
  p.windowResized = () => {
    p.resizeCanvas(p.windowWidth, p.windowHeight)
  }
}
 
new p5(sketch)

Antigravity のプロジェクトルール設定

クリエイティブコーディングのプロジェクトでは、Antigravityに「このプロジェクトはアート制作用で、パフォーマンスより視覚的な豊かさを優先する」という方向性を伝えておくと、提案の質が変わります。.antigravity/rules に以下のようなルールを書いておきます。

# Creative Coding Project Rules
 
このプロジェクトはジェネレーティブアート・インタラクティブアートの制作用です。
 
## 優先事項
- 視覚的な面白さ > コードの簡潔さ
- 実験的なアプローチを歓迎する
- アニメーションのタイミングや色彩は「感性的な判断」を含む提案を推奨する
- パラメータは数値ハードコードより const で命名することを好む
 
## 技術スタック
- フロントエンド: Vite + p5.js または Three.js
- シェーダー: GLSL(WebGL)
- デプロイ: Cloudflare Pages
 
## コードスタイル
- コメントは日本語でOK
- マジックナンバーには必ず意味のある名前をつける
- パラメータはファイル先頭にまとめて定義する

このルールファイルがあると、Antigravityの提案が「アート制作者の視点」になります。同じ「ノイズを追加して」というプロンプトでも、返ってくるコードの質が変わります。


ジェネレーティブアートの基本パターン:ノイズ・粒子・軌跡

Perlin ノイズで「生きている」フローを描く

ジェネレーティブアートで最も汎用的なツールの一つが、Perlin ノイズです。ランダムに見えるけれど、実際には滑らかにつながっている値の流れを生成できます。これを使うと、自然物の動き——煙、水、風——に近いものが作れます。

Antigravity に「Perlin ノイズを使ったフローフィールドで粒子が流れるアニメーションを作りたい。色は青と紫のグラデーションにして、粒子は薄く残像を残す感じにしたい」と伝えると、以下のようなコードを提案してきます。自分ではパラメータの意味を全部理解してなくても、「このTIME_SCALEの値を変えると何が変わるか」と聞くと丁寧に説明してくれます。

// フローフィールド + パーティクル — p5.js 実装
import p5 from 'p5'
 
const sketch = (p) => {
  // ============ パラメータ(調整用) ============
  const PARTICLE_COUNT = 800      // 粒子の数
  const NOISE_SCALE = 0.003       // ノイズの細かさ(小さいほど滑らか)
  const TIME_SCALE = 0.0005       // 時間変化の速さ
  const TRAIL_ALPHA = 8           // 残像の濃さ(0-255、小さいほど長く残る)
  const SPEED = 2.5               // 粒子の速度
  const HUE_RANGE = [200, 290]    // 色相の範囲(青〜紫)
 
  let particles = []
  let time = 0
 
  class Particle {
    constructor() {
      this.reset()
    }
 
    reset() {
      this.x = p.random(p.width)
      this.y = p.random(p.height)
      this.hue = p.random(HUE_RANGE[0], HUE_RANGE[1])
      this.alpha = p.random(60, 100)
      this.size = p.random(1, 3)
      this.life = 0
      this.maxLife = p.random(150, 400)
    }
 
    update() {
      // ノイズから角度を計算
      const noiseVal = p.noise(
        this.x * NOISE_SCALE,
        this.y * NOISE_SCALE,
        time
      )
      const angle = noiseVal * p.TWO_PI * 2
 
      // 角度に沿って移動
      this.x += p.cos(angle) * SPEED
      this.y += p.sin(angle) * SPEED
      this.life++
 
      // 画面外 or 寿命が尽きたらリセット
      if (
        this.x < 0 || this.x > p.width ||
        this.y < 0 || this.y > p.height ||
        this.life > this.maxLife
      ) {
        this.reset()
      }
    }
 
    draw() {
      // 寿命に応じてフェードアウト
      const lifeRatio = 1 - this.life / this.maxLife
      p.stroke(this.hue, 80, 90, this.alpha * lifeRatio)
      p.strokeWeight(this.size)
      p.point(this.x, this.y)
    }
  }
 
  p.setup = () => {
    p.createCanvas(p.windowWidth, p.windowHeight).parent('app')
    p.colorMode(p.HSB, 360, 100, 100, 100)
    p.background(240, 30, 8)
 
    // 粒子を初期化
    for (let i = 0; i < PARTICLE_COUNT; i++) {
      particles.push(new Particle())
    }
  }
 
  p.draw = () => {
    // 背景を薄く塗り直すことで残像効果を作る
    p.fill(240, 30, 8, TRAIL_ALPHA)
    p.noStroke()
    p.rect(0, 0, p.width, p.height)
 
    // 全粒子を更新・描画
    particles.forEach(particle => {
      particle.update()
      particle.draw()
    })
 
    time += TIME_SCALE
  }
 
  p.windowResized = () => {
    p.resizeCanvas(p.windowWidth, p.windowHeight)
  }
 
  // クリックで粒子をリセット
  p.mousePressed = () => {
    particles.forEach(p => p.reset())
  }
}
 
new p5(sketch)

このコードを動かすと、青から紫に変化する粒子が画面全体をゆっくり流れるアニメーションが生成されます。NOISE_SCALEを大きくすると流れが細かくランダムになり、小さくすると大きなうねりになります。この数値を変えながら「自分の感じる気持ちよさ」を探すのが、ジェネレーティブアートの醍醐味の一つです。

パーティクルシステムのインタラクション

マウスやタッチに反応するインタラクションを加えると、作品が「見るもの」から「触れるもの」に変わります。Antigravity に「マウスカーソルの位置に引き寄せられる力を加えて、クリックで反発するようにしたい」と伝えると、物理シミュレーションを含むコードを提案してくれます。

実装の鍵は、引力と反発力のバランスです。力が強すぎると粒子がすべてカーソルに集まってしまい、弱すぎると効果がわかりにくい。Antigravity に「引力の強さを調整しているんだけど、なんかピンとこありません。もっと『ゆらゆら集まる』感じにしたい」と具体的な感覚で伝えると、減衰係数(damping)の調整や、力の計算式の変更を提案してくれます。

// マウスとのインタラクションを追加したパーティクルシステム
class InteractiveParticle {
  constructor() {
    this.x = p.random(p.width)
    this.y = p.random(p.height)
    this.vx = 0  // 速度x
    this.vy = 0  // 速度y
    this.hue = p.random(180, 300)
  }
 
  update() {
    const dx = p.mouseX - this.x
    const dy = p.mouseY - this.y
    const dist = p.sqrt(dx * dx + dy * dy)
 
    // 距離に応じた引力(近すぎると弱くなる)
    const ATTRACT_STRENGTH = 0.3
    const MIN_DIST = 50
    if (dist > MIN_DIST) {
      this.vx += (dx / dist) * ATTRACT_STRENGTH
      this.vy += (dy / dist) * ATTRACT_STRENGTH
    }
 
    // クリック中は反発
    if (p.mouseIsPressed) {
      this.vx -= (dx / dist) * 1.5
      this.vy -= (dy / dist) * 1.5
    }
 
    // 減衰(これがないと粒子が発散し続ける)
    this.vx *= 0.95
    this.vy *= 0.95
 
    this.x += this.vx
    this.y += this.vy
 
    // 画面端で折り返す
    if (this.x < 0) this.x = p.width
    if (this.x > p.width) this.x = 0
    if (this.y < 0) this.y = p.height
    if (this.y > p.height) this.y = 0
  }
 
  draw() {
    const speed = p.sqrt(this.vx * this.vx + this.vy * this.vy)
    // 速度に応じて明るさを変える
    p.fill(this.hue, 80, p.map(speed, 0, 5, 60, 100), 80)
    p.noStroke()
    p.ellipse(this.x, this.y, p.map(speed, 0, 5, 2, 6))
  }
}

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
p5.jsでのジェネレーティブアート制作で詰まる数学・アルゴリズムの壁を、Antigravityとの対話で乗り越えて自分のスタイルを持った作品を完成できる
Three.jsの3Dシーン構築とGLSLシェーダーの実装をゼロから習得し、ブラウザで動くインタラクティブな立体アート作品を本番公開できる
個人開発者・アーティストとして、クリエイティブコーディング作品をポートフォリオ・デジタル商品として収益化する具体的な戦略を手に入れられる
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Antigravity Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

アプリ開発2026-05-21
Firebase Remote Config と Antigravity Agent で AdMob 配置を実運用しながら微調整する設計
壁紙アプリの AdMob 収益が頭打ちになった経験から、Firebase Remote Config と Antigravity Agent を組み合わせて広告配置を実運用中に少しずつ最適化する仕組みをまとめます。
アプリ開発2026-05-03
Antigravityで個人SaaSを立ち上げる収益化ロードマップ — 2026年版
Google Antigravityのagentic IDEを使って個人SaaSを立ち上げ、実際に収益化するまでに踏むべき判断ステップを、料金構造・モデル選定・課金モデル・リテンションまで含めて2026年時点の現実に即して整理した実践ロードマップです。
アプリ開発2026-04-26
Antigravity マルチエージェントで副業案件を捌く — 個人開発者の時間単価を10倍にする実用パターン
副業や受託案件の時間単価が伸びない原因の多くは、技術力ではなく『同時にやれない』ことにあります。Antigravity のマルチエージェント機能を使って、見積もり・実装・リリースを並列化する実用パターンをまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →