ゲーム開発
Unity
UnrealEngine
C++
ゲーム数学
ゲームAI
サウンド
アニメーション
GBDK
制作日記
3DCG
Houdini
Blender
USD
グラフィックス
テクノロジ
ツール開発
フロントエンド関連
サーバサイド関連
ソフトウェア設計
ハードウェア関連
おすすめ技術書
音楽
DTM
楽器・機材
ピアノ
その他
都会のエレキベア
ラーメン日記
四コマ漫画
おすすめアイテム
おもしろコラム
  • ゲーム開発
    • Unity
    • UnrealEngine
    • C++
    • ゲーム数学
    • ゲームAI
    • サウンド
    • アニメーション
    • GBDK
    • 制作日記
  • 3DCG
    • Houdini
    • Blender
    • USD
    • グラフィックス
  • テクノロジ
    • ツール開発
    • フロントエンド関連
    • サーバサイド関連
    • ソフトウェア設計
    • ハードウェア関連
    • おすすめ技術書
  • 音楽
    • DTM
    • 楽器・機材
    • ピアノ
  • その他
    • 都会のエレキベア
    • ラーメン日記
    • 四コマ漫画
    • おすすめアイテム
    • おもしろコラム
  1. ホーム
  2. 20260110_01_houdini_header

【Houdini21.0】3Dビル群っぽいブログヘッダー画像を作成する

Houdiniグラフィックスフロントエンド関連都会のエレキベアSolarisKarma
2026-01-10

ぷらずも
ぷらずも
みなさんこんにちは! ぷらずもです!
エレキベア
エレキベア
こんにちクマ~~
ぷらずも
ぷらずも
今回は 当ブログのヘッダー画像をHoudiniで作り直してみた ので、その事例について紹介します。
エレキベア
エレキベア
ほぅ・・・ なんか逆に面倒そうクマがイラレとかじゃないのクマね
ぷらずも
ぷらずも
シンプルな画像ではありますが、さくっと作ることが出来ました。 3Dのレンダリングだけじゃなく画像処理もHoudiniの得意分野なので、その辺りも踏まえて紹介しようと思います。
ぷらずも
ぷらずも
なお使用したHoudiniのバージョンは以下になっています。 バージョンによっては処理が異なる場合もあるのでご了承ください。
✔ 使用バージョン
  • Houdini
    • Houdini Indie 21.0.512

旧ヘッダーの問題と最新化

ぷらずも
ぷらずも
まずはなぜ作りなおしたのか?を踏まえて旧ヘッダーの状態について記載します。

旧ヘッダーについて

ぷらずも
ぷらずも
旧ヘッダーについては、以前p5.jsで遊びつつ作ったアニメーションをそのまま適用し続けていました。
【ブログ改造計画】WordPressのヘッダアニメーションをp5.jsで実装する【WordPress】
2022-05-11
20220509_header_animation
▲p5.jsで作成したアニメーションを適用していた

エレキベア
エレキベア
なつかしいクマね~~
ぷらずも
ぷらずも
毎回ランダムに変わる面白い仕組みではあるのですが、これには大きな問題がありました。 それは以下の点です・・・。
✔ p5.jsアニメーションによる問題点
  • 処理が重い
  • 記事内画像読み込み後に再生されるのでラグがある
  • ウィンドウサイズを変えたりしているとたまにバグる
エレキベア
エレキベア
クソみたいなヘッダークマね
ぷらずも
ぷらずも
まあ重いことは分かっていたのですが、さすがに自分でも触っていてストレスが半端なかったのでこれを機に作り直してみることにしたわけです。

新たに作り直したヘッダー画像

ぷらずも
ぷらずも
そんなわけで新たに作ったヘッダー画像が以下になります。 アニメーション部分はCSSに任せて、無難な画像表示にする ことにしました。
20260110_01_header_animation
▲シンプルになり表示もスムーズになった

▲作成したヘッダー画像
ぷらずも
ぷらずも
画像にするとはいえ ビルっぽい雰囲気と何かしらの技術的な背景は欲しかった ので、Houdiniでの作成にトライしてみることにしたというわけです。
エレキベア
エレキベア
まあ確かに適当な画像にしても面白味が無いクマからねぇ

Houdiniを使用した画像作成

ぷらずも
ぷらずも
というわけでHoudiniでどのように作成したかについて紹介します。 まずHoudiniを使用した理由として、以下のような理由がありました。
✔ Houdiniを使用した理由
  • バリエーション配置に適していてさくっと作れそう
  • 3Dの奥行感を少し出したかった
  • Copernicus連携などで面白い表現が出来るのではないかという期待
エレキベア
エレキベア
今回のビル配置の用途には使えそうクマね
ぷらずも
ぷらずも
基本的にUnlitなのでCopernicusメインで作ってもよかったのですが、ライティングを入れるのも考えていたためSolarisでレンダリング しています。 全体のノード構成は以下のようになりました。
20260110_01_04
▲Solarisでレンダリングを行った

20260110_01_05
▲ビル、床のモデルをレンダリングしている

エレキベア
エレキベア
モデル配置してレンダリングするだけのシンプルな構成クマね
ぷらずも
ぷらずも
SOPでモデル配置した後にLOPでライティングして、最後に後処理としてCOPを使用しています。

SOP:ベースモデルの作成・レイアウト

ビルの配置
ぷらずも
ぷらずも
まずビル配置について、最終画像は2Dですが実際に 3Dのビルっぽいモデルを配置 しています。
20260110_01_06
▲実際に3Dのビルっぽいものを配置している

エレキベア
エレキベア
三段階で色付けして配置してるのクマね
ぷらずも
ぷらずも
配置処理に関しては、Cube状のモデルを渡すことでランダムに変形して配置する処理 を作って使用しています。 一連の処理はsubnetwork化してパラメータで制御出来るようにしました。
20260110_01_07
▲ビル(Cube)の形状を作り、配置処理のsubnetworkに渡している

20260110_01_13
▲配置処理のパラメータ内容

20260110_01_08
▲配置処理のノード構造

エレキベア
エレキベア
この配置処理が肝になるのクマね
ぷらずも
ぷらずも
処理内容はざっくりと以下のようになっています。
  1. gridで範囲を作り、その中にscatterでポイントを散布する

    20260110_01_09

  2. scale、Pのアトリビュートをランダムに割り振る

    20260110_01_10

  3. attribfrompiecesでnameからpieceに分解した後、copytopointsする

    20260110_01_11

  4. はみ出た下半分の部分を削除する

    20260110_01_12

  5. 手前、真ん中、奥でそれぞれ散布する

    20260110_01_14

ぷらずも
ぷらずも
これにてビル群の準備が出来ました!
エレキベア
エレキベア
もうほぼ終わったようなものクマね
床の作成
ぷらずも
ぷらずも
そして今回は 床のグリッドもモデルとして作成してレンダリング しています。 処理は単純で、gridのEdgeをpolywireでメッシュ化して色を設定しているだけですね。
20260110_01_22
▲gridから線の部分をpolywireでメッシュ化して色を振る

20260110_01_23
▲少し縦長に作って奥行き感を出している

エレキベア
エレキベア
正方形じゃなくて縦長にしているのクマね

LOP:Unlitでライティング

ぷらずも
ぷらずも
そして次にライティングしますが、これはUnlitマテリアルを設定してレンダリング するだけです。 Solarisにおけるレンダリング手順については、以下の記事にまとめていますので触ったことがない方はご参照ください。
【Houdini21.0】Solaris徹底入門:USD構成を意識した基本的な作業フローについてまとめる
2025-12-31

▲Solarisに関する記事

20260110_01_18
▲マテリアルをアサインしてカメラを設置する

  • Unlitマテリアルを3種類作成する

    20260110_01_15

    • 中身は全て同じでGeomColorを設定するのみ

      20260110_01_16

  • MaterialLinkerでアサインする

    20260110_01_17

▲出力された画像
エレキベア
エレキベア
レンダリングもシンプルクマね

COP:画像の後処理

ぷらずも
ぷらずも
以上で画像はできましたが、そのままだと横長の画面ではみ出た時にぶつっと切れてしまうので、端にフェード処理を入れてみます。
20260110_01_03
▲横に長い画面だとぷっつり切れてしまうのでフェードを入れる

▲後処理後
エレキベア
エレキベア
まあタイルに出来なかったらそうするしかないクマね
ぷらずも
ぷらずも
こちらはCopernicusを使用して手を加えています。 Alphaチャンネルに対してフェードを加える処理になっています。
20260110_01_19
▲ノード構造

20260110_01_20
▲アルファ適用部分をsdfshape(line)を加工して作成

20260110_01_21
▲元画像のアルファに被せる

エレキベア
エレキベア
非常にシンプルクマね これで完成クマ〜〜〜〜

おまけ:画像設定とCSSアニメーション

ぷらずも
ぷらずも
最後にアニメーション感が無くなるのも寂しかったので、背景にCSSアニメーションを入れてみました。 量にもよると思いますが、アニメーションはCSSがやはり軽いですね。
20260110_01_header_animation_back
▲キラキラするようなアニメーションを背景に加えた

ぷらずも
ぷらずも
これはAIにさくっと出してもらったものを改造しています。 CSS-in-JSを使用しているのでパラメータ周りも動的に生成してもよかったですが、面倒だったのでspanタグをベタ打ちで作成しています。 興味のある方は見てみてください。
import { css, keyframes } from '@emotion/react';

const squarePop = (deg: number) => keyframes`
  0% {
    transform: scale(0.3) rotate(0deg);
    opacity: 0;
  }
  30% {
    opacity: 1;
  }
  100% {
    transform: scale(1.4) rotate(${deg}deg);
    opacity: 0;
  }
`;

const styleStar = (
  x: string,
  y: string,
  size: number,
  dur: number,
  delay: number,
  rotateDeg: number,
) => css`
  position: absolute;
  left: ${x};
  top: ${y};
  width: ${size}px;
  height: ${size}px;

  box-shadow: inset 0 0 0 1.2px rgba(255, 255, 255, 0.75);
  opacity: 0;

  transform-origin: center;

  animation: ${squarePop(rotateDeg)} ${dur}s ease-in-out infinite;
  animation-delay: ${delay}s;
`;

const styleStarsLayer = css`
  position: absolute;
  inset: 0;
  pointer-events: none;
  overflow: hidden;
`;

/**
 * タイトル背景アニメーション
 * 星空のような効果を付ける
 * @returns
 */
const BackAnimation = () => {
  return (
    <div css={styleStarsLayer}>
      <span css={styleStar('8%', '18%', 10, 1.6, -0.2, 22)} />
      <span css={styleStar('16%', '62%', 9, 2.1, -1.1, 18)} />
      <span css={styleStar('24%', '28%', 11, 1.8, -0.6, 28)} />
      <span css={styleStar('32%', '78%', 9, 2.4, -1.9, 24)} />
      <span css={styleStar('41%', '12%', 10, 1.7, -0.9, -16)} />
      <span css={styleStar('49%', '54%', 9, 2.2, -1.4, -30)} />
      <span css={styleStar('58%', '34%', 11, 1.9, -0.3, -24)} />
      <span css={styleStar('66%', '72%', 9, 2.6, -2.2, -16)} />
      <span css={styleStar('74%', '22%', 10, 1.5, -0.7, 30)} />
      <span css={styleStar('82%', '48%', 9, 2.0, -1.6, 22)} />
      <span css={styleStar('90%', '16%', 12, 2.8, -2.4, -18)} />
      <span css={styleStar('94%', '66%', 10, 1.8, -1.0, -28)} />
    </div>
  );
};
export default BackAnimation;

import { Theme, css } from '@emotion/react';
import Image from 'next/image';
import BackAnimation from './BackAnimation';
import ResizeImage from 'components/common/ResizeImage';
import { md } from 'style/media';

const styleTitleAreaRoot = (theme: Theme) => css`
  height: 280px;
  background-color: ${theme.colors.primaryDarkGray};
  display: flex;
  justify-content: center;
  margin-bottom: 20px;
  position: relative;
  box-shadow: 0px 12px 12px ${theme.colors.primaryDarkGray};

  ${md(css`
    height: 160px;
    margin-bottom: 14px;
  `)}
`;

/** 背景画像 */
const styleBackWrapper = css`
  position: absolute;
  height: 100%;
  max-width: 100%;
  inset: 0;
`;

const styleBackImage = css`
  position: relative;
  display: block;
  object-fit: cover;
  height: 100%;
  width: 100%;

  &::after {
    position: absolute;
    content: '';
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    box-shadow: inset 0 0 80px 80px gray;
  }

  /** フェードイン */
  opacity: 0;
  transition: opacity 0.5s ease;
  &[data-load='done'] {
    opacity: 1;
  }
`;

/** タイトルロゴ */
const styleLogoWrapper = (theme: Theme) => css`
  margin: auto;
  width: 390px;
  z-index: ${theme.zindex.titleLogo};

  ${md(css`
    width: 180px;
  `)}
`;

const styleLogoImageWrapper = css`
  height: 'auto';
  width: '100%';
`;

const styleLogoImage = css`
  filter: drop-shadow(6px 6px 0px #333);
  object-fit: contain;
  position: relative;
  max-width: 100%;
  height: auto;
  width: '100%';

  /** フェードイン */
  opacity: 0;
  transition: opacity 0.5s ease;
  &[data-load='done'] {
    opacity: 1;
  }
`;

/**
 * タイトルエリア
 * @returns
 */
const TitleArea = () => {
  // 画像ロード後の検知用
  const onLoad = (e: any) => {
    e.currentTarget.dataset.load = 'done';
  };

  return (
    <div css={styleTitleAreaRoot}>
      <BackAnimation />
      <div css={styleBackWrapper}>
        <Image
          css={styleBackImage}
          src="/img/common/title_back_image.png"
          alt=""
          width={1920}
          height={320}
          onLoad={onLoad}
        />
      </div>
      <div css={styleLogoWrapper}>
        <div css={styleLogoImageWrapper}>
          <ResizeImage
            src="/img/common/title_logo.png"
            alt=""
            originalWidth={860}
            originalHeight={420}
            resizeHeight={180}
            addCss={styleLogoImage}
            priority={true}
          />
        </div>
      </div>
    </div>
  );
};
export default TitleArea;

エレキベア
エレキベア
アニメーション実装は面倒クマから、AIはありがたいクマね

おわりに

ぷらずも
ぷらずも
というわけで今回はHoudiniを使ったヘッダー画像作成でした! どうだったかな?
エレキベア
エレキベア
画像がシンプルクマからHoudiniでの処理もシンプルだったクマね 割となんでも出来ちゃうのがHoudiniのいいところクマね
ぷらずも
ぷらずも
今回はあまり使わなかったけど、3D空間と連携して画像生成出来るという点もCopernicusの魅力なので、アイデア次第で面白い表現もいろいろ出来そうですね!
ぷらずも
ぷらずも
それでは今日はこの辺で! アデューーー!!
エレキベア
エレキベア
クマ〜〜〜〜

【Houdini21.0】3Dビル群っぽいブログヘッダー画像を作成する 〜完〜


Houdiniグラフィックスフロントエンド関連都会のエレキベアSolarisKarma
2026-01-10

関連記事
【Houdini21.0】Heightfield VisualizeでレイヤーをWeightBlend(順不同)で表示する
2026-01-12
【謹賀新年】2026年はクマ年?振り返りと抱負を決める
2026-01-01
【Houdini21.0】Solaris徹底入門:USD構成を意識した基本的な作業フローについてまとめる
2025-12-31
【Houdini21.0】Otisによる筋肉シミュレーションと筋肉情報転送機能の使い方【Otis Muscle and Tissue Simulation】
2025-11-29
【Houdini】Mardini2025の振り返りと制作物解説
2025-11-24
【Houdini Indie】通常版とSteam版の挙動の違いをまとめる【2025年版】
2025-11-03
【ゲーム数学】第十回 p5.js(+α)で学ぶゲーム数学「複素数とフラクタル」
2025-11-02
【プロシージャル】Pythonで学ぶ波動関数崩壊アルゴリズム(Wave Function Collapse)
2025-06-22