2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

イラストを1枚読み込むだけで、その形に開く花火を作った【Houdini / VEX】

2
Posted at

00_ペンギン花火.gif

イラスト画像を1枚読み込むと、その線と色の場所に星が並び、キャラクターの形に開く花火になる仕組みを Houdini で作りました。
この記事では、下のペンギンのイラストを例に、作り方を順番に紹介します。

01_元の画像.png

環境

  • Houdini 22.0(Apprentice)/ Windows 11
  • 使った主な機能: Attribute Wrangle(VEX)、POP Network、File Cache、Karma(レンダー)、COP(グロー)

全体の流れ

イラスト画像
  │ ① VEX で全ピクセルを読み、線と色の所に星を置く(点に元の絵の色を持たせる)
  ▼
星の位置(ペンギンで 559 個)
  │ ② 間引き・ずらし・明るさ・燃える時間のばらつき
  │ ③ 開く位置に集め、「絵の中の位置 × 大きさ」の初速を付ける
  ▼
POP で飛ばす
  │ ④ 速さに比例する空気抵抗 → 絵の形のまま開いて止まる → 抵抗を弱めて重力で垂れる
  │    光の尾は POP Replicate
  ▼
File Cache で焼く → 色と明るさ(元の絵の色)→ Karma でレンダー → COP でグロー

1. 画像から星の位置と色を取る

Attribute Wrangle(Run Over: Detail、入力なし)で、画像を1ピクセルずつ読みます。
画像の色は VEX の colormap() で取れます。

vector c = colormap(画像のパス, u, v);   // u, v は 0〜1。左下が (0, 0)

判断のしかた

読んだ色から「明るさ」と「鮮やかさ」を計算して、ピクセルを分けます。

条件 判断
四すみの色(背景)に近い 背景 → 何もしない
明るさ < 0.2 黒い線 → ふちだけ使う
鮮やかさ > 0.3、明るさ 0.15〜0.75 色の付いた所(ほっぺ・帽子・くちばしなど)→ まばらに塗る
それ以外 体の色(白・クリーム色)→ 何もしない

ポイントは3つです。

  • 背景の色は、画像の四すみの色の平均にしました。画像ごとに背景色が違っても自動で合わせられます。
  • 黒い所は「ふち」だけ使います。まわり2ピクセルに黒くない所があるときだけ採用するので、細い線はそのまま、黒く塗られた所は輪郭だけになります。
  • 「すでに置いた点から一定距離以内なら置かない」ことで、線が数ピクセルの太さでも、星が一定間隔の1列に並びます。

読み取った点を、元の画像に重ねるとこうなります。点の色が、そのまま花火の色になります。

02_点の重ね.png

コード

画像のパスは chs("image")、キャラクターの番号は chi("who") で受け取ります。VEXpression の右の Create spare parameters ボタンを押すと、パラメータ欄が自動でできます。

//  どんなキャラクター画像でも:線のふちと色の付いた所に点を並べ、元の絵の色を点に持たせる
//   Cd   = その点の元の色(花火の色に使う)
//   line = 1 なら線(輪郭など)、0 なら色の付いた所の塗り
string img = chs("image");                // 参考画像のファイル
float step = 0.042;                       // 線の点の間隔
float fillgap = 0.085;                    // 塗りの点の間隔(線よりまばら)

int W, H;
teximport(img, "texture:xres", W);
teximport(img, "texture:yres", H);

vector px(string img; int x; int y; int W; int H) {
    return colormap(img, (clamp(x, 0, W - 1) + 0.5)/W, 1 - (clamp(y, 0, H - 1) + 0.5)/H);
}
float lum(vector c) { return 0.3*c.r + 0.6*c.g + 0.1*c.b; }
float sat(vector c) { float mx = max(c.r, max(c.g, c.b)), mn = min(c.r, min(c.g, c.b)); return (mx - mn) / max(mx, 0.001); }

// ① 背景の色=四すみの色の平均
vector bg = (px(img, 2, 2, W, H) + px(img, W - 3, 2, W, H) + px(img, 2, H - 3, W, H) + px(img, W - 3, H - 3, W, H)) / 4;

// ② 絵のある範囲(背景でないピクセルの外枠)→ 絵の高さが 2.5 になるように合わせる
int x0 = W, x1 = 0, y0 = H, y1 = 0;
for (int y = 0; y < H; y++) for (int x = 0; x < W; x++) {
    if (distance(px(img, x, y, W, H), bg) < 0.12) continue;
    x0 = min(x0, x); x1 = max(x1, x); y0 = min(y0, y); y1 = max(y1, y);
}
float S = max((y1 - y0) / 2.5, (x1 - x0) / 2.6);           // 1 単位 = S ピクセル
vector2 C = set((x0 + x1) / 2.0, (y0 + y1) / 2.0);         // 絵の真ん中

vector kept[];
for (int pass = 0; pass < 2; pass++)                       // 1回目は線、2回目は塗り(線を優先して置く)
for (int y = 1; y < H - 1; y++) {
    for (int x = 1; x < W - 1; x++) {
        vector c = px(img, x, y, W, H);
        int isbg   = distance(c, bg) < 0.12;
        int isdark = lum(c) < 0.2;
        int iscol  = !isbg && !isdark && sat(c) > 0.3 && lum(c) > 0.15 && lum(c) < 0.75;
        if (isbg) continue;
        if ((pass == 0) != isdark) continue;

        // 線は「暗い所のふち」だけ(黒く塗られた所も、ふちだけになる)
        int edge = 0;
        if (isdark) {
            for (int dy = -2; dy <= 2; dy++) for (int dx = -2; dx <= 2; dx++)
                if (lum(px(img, x + dx, y + dy, W, H)) >= 0.2) edge = 1;
            if (!edge) continue;
        } else if (!iscol) continue;

        // 点の色:線なら、すぐ近くの色の付いた所の色(無ければ 0 = 輪郭)
        vector col = 0;
        if (isdark) {
            float best = 1e9;
            for (int dy = -4; dy <= 4; dy++) for (int dx = -4; dx <= 4; dx++) {
                vector n = px(img, x + dx, y + dy, W, H);
                if (distance(n, bg) < 0.12 || lum(n) < 0.2 || sat(n) <= 0.3 || lum(n) >= 0.75) continue;
                float d2 = dx*dx + dy*dy;
                if (d2 < best) { best = d2; col = n; }
            }
        } else col = c;

        // 近くにもう点があれば置かない(太い線でも、点は一定の間隔で1列になる)
        float gap = isdark ? step : fillgap;
        vector q = set((x - C.x)/S, (C.y - y)/S, 0);
        int near = 0;
        foreach (vector k; kept) if (distance(k, q) < gap) { near = 1; break; }
        if (near) continue;
        push(kept, q);
        int p = addpoint(0, q);
        setpointattrib(0, "Cd", p, col);
        setpointattrib(0, "line", p, isdark);
        setpointattrib(0, "who", p, chi("who"));            // キャラクターの番号
    }
}

画像は 300〜400px くらいに縮小してから使う

「黒い線は、まわり2ピクセルに黒くない所があるときだけ採用」しているので、大きな画像だと、太い線の内側が捨てられて、両側のふちに点が付きます(線が二重になる)。

左が元の大きさ(1254px)、右が 360px に縮小したものです。左は輪郭が二重になっています。

08_線が二重_左1254px_右360px.png


2. 形を崩さずに開く ―「速さに比例する空気抵抗」

型物花火(形に開く花火)で一番大事なのは、開いても形が崩れないことです。

星を開く位置に集め、初速を「絵の中の位置 d × 開ききった大きさ Rf × 係数 k」にします。

v@v = d * Rf * k;

そのうえで、空気抵抗を速さに比例させます(POP Wrangle)。

v@v *= exp(-k * @TimeInc);

速さに比例する抵抗 dv/dt = -k v だと、星が止まるまでに進む距離は v0 / k です。
初速を d * Rf * k にしておくと、止まる位置はちょうど d * Rf になります。どの星も同じ割合で減速するので、絵の形のまま大きく開きます。

ふつうの丸い花火で使う「速さの2乗に比例する抵抗」にすると、速い星(外側)ほど強く減速するので、形が崩れます。並べて比べると、違いがはっきり分かります(左が2乗、右が速さに比例)。

04_抵抗の比較_左2乗_右比例.png

※ 左は抵抗の大きさを合わせていないので、全体の大きさも違います。形の崩れ方を見てください。


3. 本物っぽくするための「ばらつき」

形がきれいすぎると、花火というより電光掲示板やドローンショーに見えます。4つのばらつきを入れました。

ばらつき やり方 値
並び 星を2割間引き、残りを ±2.2% ずらす keep 0.8 / jit 0.022
明るさ 星ごとに 0.25〜1.8倍(暗めが多い) bright
消えるタイミング 燃える時間を 5.0秒 ±20% burn
重力で垂れる 開いて 1.2秒から抵抗を弱める k 1.6 → 0.3

左がばらつきなし、右がばらつきありです。

05_ばらつき_左なし_右あり.png

// 星を作る Wrangle(Points)より抜粋
float keep = 0.8, jit = 0.022;
if (rand(@ptnum*7.31 + 0.5) > keep) { removepoint(0, @ptnum); return; }
vector d = @P + jit * set(rand(@ptnum*2.17) - 0.5, rand(@ptnum*3.71) - 0.5, 0) * 2;
v@v = d * Rf * k;
...
f@burn   = 5.0 * (1 + 2*0.2*(rand(@ptnum*5.3) - 0.5));
f@bright = fit01(pow(rand(@ptnum*4.73), 1.5), 0.25, 1.8);
// POP Wrangle より抜粋:開ききったら抵抗を弱め、重力で垂れる
float k = 1.6;
float kl = 0.3;                                // 後半の空気抵抗
k = lerp(k, kl, smooth(1.2, 3.0, @age));
v@v *= exp(-k * @TimeInc);

抵抗が小さくなると、重力で落ちる速さの上限(重力 ÷ k)が約 6m/s から約 33m/s に上がり、星がしだれるように落ちていきます。
最初の 1.2秒は強い抵抗のままなので、開く形は変わりません。

03_開く様子.png

明るさのばらつきは、最初「明るい方にだけ」ばらつかせたら、静止画ではほとんど差が見えませんでした。星の芯はもともと画像の上限(白)に張り付いているので、それ以上明るくしても変わらないためです。暗い星を混ぜて、やっと差が出ました。


4. 色 ― 明るすぎると白く飛ぶ

星の色は、元の絵の色を一番明るい色に引き伸ばして、さらに鮮やかにしたものです。色のない黒い線は金色にします。

vector oc = v@Cd;
if (max(oc) < 0.01) oc = {1.0, 0.70, 0.35};      // 線だけの所=輪郭は金
else { oc = oc / max(oc); float l = 0.3*oc.r + 0.6*oc.g + 0.1*oc.b; oc = clamp(lerp(set(l, l, l), oc, 1.8), 0, 1); }
v@basecol = oc;

花火は光るので、色に「明るさ」を掛けます。このとき明るさを上げすぎると、色が白く飛びます。
たとえばピンク (1, 0.2, 0.55) に 6 を掛けると (6, 1.2, 3.3) になり、R・G・B が全部 1 を超えるので、画像では (1, 1, 1) = 白に切られます。

06_色の飛び_左から元の色_x2.2_x6.png

(左から、元の色 / 2.2倍 / 6倍。6倍はただの白になる)

星の明るさは 2.2 程度に抑えて色を残し、にじみは COP の Glow で足しました。


5. POP ネットワーク

source_stars(All Points)┐
source_rise (Points)    ┴→ merge → POP Group(星だけ stars)┐
          POP Replicate(入力なし・Group stars)────────────┴→ merge → physics(POP Wrangle)→ popsolver
popobject → popsolver → Gravity Force → output
  • 光の尾は POP Replicate で星から出します。Inherit Attributes を v part burn bright basecol にすると、尾も星と同じ色・明るさになります。
  • POP Replicate は入力に何もつながないのがポイントです。つなぐと上流のソースが2回動き、星が2倍になります。
  • POP Wrangle では「burn を受け継いだ子=星の尾」「受け継がない子=昇りの火の粉」と見分けて、寿命や抵抗を変えています。

6. 応用:何体も順番に打ち上げる

キャラクターごとに Wrangle(上のコード)を用意して who を 0, 1, 2… と付け、開くフレーム・横の位置・大きさを who 順の配列(打ち上げ表)にします。

int   FB[] = array(61, 85, 109, 133);          // 開くフレーム
float XS[] = array(-405, -135, 135, 405);      // 横の位置(m)
float RS[] = array(90, 90, 90, 90);            // 開ききった大きさ(m)

if (abs(@Frame - FB[i@who]) > 0.5) { removepoint(0, @ptnum); return; }   // そのフレームに開く星だけ出す
vector B  = set(XS[i@who], 260, 0);   // 開く位置
float  Rf = RS[i@who];

星を作る Wrangle は「そのフレームに開くキャラの星だけ」を出し、ほかのフレームは 0 個になります。
そのため POP Source は Emission Type: All Points / Impulse Activation: 1(毎フレーム) にするだけで、表の時刻どおりに星が出ます。

別に作った花火大会のシーンに組み込むときは、焼いたキャッシュを Time Shift(Frame $F - ずらすフレーム数)でずらし、始まる前は Switch で空のジオメトリに切り替えました(キャッシュの無いフレームを読ませないため)。
まわりの花火に埋もれないよう、キャラが開いている間はまわりの玉を減らしています。


ハマった所

  • 画像のパス欄が空・ファイル名違いでも、エラーは出ずに点が 0 個になる(teximport が失敗して画像の大きさが 0 になるため)
  • 大きな画像だと線が二重になる → 300〜400px に縮小してから読む(上の比較画像)
  • 複数キャラで Fuse SOP を使うと、別のキャラの点どうしがくっつく(全員同じ中心座標で作っているため)
  • Switch SOP は「何番目につないだか」で出す入力が決まる。見た目では分かりにくいので、つないだ後に中ボタンで点の数を確かめる
  • 式が入ったパラメータ(緑の欄)は、数字を打っても式の値に戻る。右クリック → Delete Channels で式を消してから入れる

まとめ

  • 画像は VEX の colormap() で1ピクセルずつ読める。色の数字だけで「線・色の所・背景」を判断して星を置くと、どんなイラストでも形になる
  • 空気抵抗を速さに比例させると、型物花火は形を保ったまま開く(2乗に比例だと崩れる)
  • きれいすぎる形には、間引き・明るさ・消えるタイミング・重力のばらつきを足すと、花火らしくなる
  • 色を見せたいときは、明るさを抑える(1 を超えると白く飛ぶ)

付録:全部のコードとノード設定

記事のペンギン花火(1体)を、一から組むための全部です。
※ 記事の動画は煙も入っていますが、付録では煙(Pyro)を省いています。煙が無くても、花火の形と動きは同じです。

付録を開く(クリック)

前提

  • FPS 30、フレーム 1〜300(10秒)。Global Animation Options で設定
  • 単位は 1 = 1m。花火は高さ 260m で、フレーム 61(2.0秒)に開く
  • 画像は 300〜400px に縮小したもの(記事では 360×360px)を使う

全体のノード

/obj/firework(Geometry)
  face_lines(Detail)→ shell_stars(Points)      … 開く瞬間の星
  rise_head(Detail・入力なし)                    … 昇る玉
  firework_sim(POP Network)                       … 下の「POP の中」
  sim_out(DOP Import)→ cache_sim(File Cache)→ look ┐
                              burst_flash(Detail・入力なし)┴→ merge_render → OUT_firework
/obj/sky(Geometry): sky_grid → sky_color → OUT_sky
/stage: import_firework / import_sky → merge_geo → mtl → assign → camera1 → rendersettings → render
/img/comp: read_render → glow_tight → glow_wide → write_png

/obj/firework の中

face_lines(Attribute Wrangle / Run Over: Detail / 入力なし)

記事の「1. 画像から星の位置と色を取る」のコードそのままです。貼ったあと Create spare parameters を押し、Image に画像のパス、Who は 0 のまま。

shell_stars(Attribute Wrangle / Run Over: Points / 入力 face_lines)

// 絵の点を開く位置に集め、「絵の中の位置に比例した速さ」で飛ばす
vector B  = {0, 260, 0};                   // 開く位置(高さ 260m)
float  Rf = 110;                           // 開ききった大きさ(m)
float  k  = 1.6;                           // 空気抵抗(physics と同じ値)
// ばらつき:星を2割間引き、残った星の位置を少しずらす
float keep = 0.8, jit = 0.022;
if (rand(@ptnum*7.31 + 0.5) > keep) { removepoint(0, @ptnum); return; }
vector d = @P + jit * set(rand(@ptnum*2.17) - 0.5, rand(@ptnum*3.71) - 0.5, 0) * 2;
v@v = d * Rf * k;                          // 速さ = 位置 × 大きさ × k(止まる位置がちょうど d × Rf)
v@v += 2.0*(vector(rand(@ptnum*1.7)) - 0.5);
v@v.z += 3.0*(rand(@ptnum*3.1) - 0.5);     // 奥行きにもほんの少し
@P = B;
i@kind = 1;                                // 1 = 星
f@burn = 5.0 * (1 + 2*0.2*(rand(@ptnum*5.3) - 0.5));   // 燃える時間 5.0秒 ±20%
f@life = 20;
// 元の絵の色 → 花火の色(線だけの所=輪郭は金。色は鮮やかにする)
vector oc = v@Cd;
if (max(oc) < 0.01) oc = {1.0, 0.70, 0.35};
else { oc = oc / max(oc); float l = 0.3*oc.r + 0.6*oc.g + 0.1*oc.b; oc = clamp(lerp(set(l, l, l), oc, 1.8), 0, 1); }
v@basecol = oc;
f@bright = fit01(pow(rand(@ptnum*4.73), 1.5), 0.25, 1.8);   // 星ごとの明るさ 0.25〜1.8倍

rise_head(Attribute Wrangle / Run Over: Detail / 入力なし)

// 昇っている玉の頭(開く 2秒前から、フレーム 61 まで)
float T = (@Frame - 1)/30.0, tb = 2.0;     // 開く瞬間 2.0秒 = フレーム61
if (T >= tb) return;
float u = tb - T;
float y = 260 - 40*pow(u, 1.6);
int p = addpoint(0, set(1.5*sin(T*2.1), y, 0));
setpointattrib(0, "v", p, set(0, 40*1.6*pow(u, 0.6), 0));
setpointattrib(0, "kind", p, 3);           // 3 = 昇る玉

firework_sim(POP Network / 入力なし)の中

ノード 設定
source_stars(POP Source。最初からある source_first_input を改名) Source → Emission Type All Points / Geometry Source Use Parameter Values / SOP /obj/firework/shell_stars / Birth → Impulse Activation 式 $SF == 61 / Attributes → Initial Velocity Use inherited velocity / Inherit Attributes *(初期値のまま)
source_rise(POP Source) Source → Emission Type Points / Geometry Source Use Parameter Values / SOP /obj/firework/rise_head / Birth → Impulse Activation 0 / Const. Activation 式 $SF < 61 / Const. Birth Rate 600 / Interpolate Source Back / Interpolation Method Use Point Velocity / Attributes → Initial Velocity Use inherited velocity
merge_sources(最初からある Merge を改名) 入力1 source_stars、入力2 source_rise
group_stars(POP Group) 入力 merge_sources / Group Name stars / Rule → Enable オン / VEXpression ingroup = i@kind == 1;
star_trails(POP Replicate) 入力なし / Group stars / Birth → Impulse Activation 0 / Const. Activation 1 / Const. Birth Rate 160 / Shape → Shape Point / Attributes → Inherit Attributes v burn bright basecol / Initial Velocity Use inherited velocity
merge_all(Merge) 入力1 group_stars、入力2 star_trails
physics(POP Wrangle) 入力 merge_all、出力を popsolver の3番目の入力へ。コードは下
Gravity Force popsolver と出力の間(初期値のまま)
// 星:速さに比例する空気抵抗(形を崩さない)→ 開ききったら抵抗を弱め、重力で垂れる
float dt = @TimeInc;
if (i@kind == 1) {
    float k = 1.6;                          // shell_stars と同じ値
    k = lerp(k, 0.3, smooth(1.2, 3.0, @age));
    v@v *= exp(-k*dt);
    if (@age > f@burn) @dead = 1;
} else {
    if (i@init == 0) {
        i@init = 1;
        if (f@burn > 0) {                   // burn を受け継いだ子=星の光の尾
            i@kind = 4;
            @P -= v@v * dt * rand(@id*1.9);
            v@v = v@v*0.3 + 0.6*(vector(rand(@id*3.1)) - 0.5);
            f@life = 0.45 + 0.35*rand(@id*7.7);
        } else {                            // 受け継がない子=昇りの火の粉
            v@v = v@v*0.08 + 4.0*(vector(rand(@id*3.1)) - 0.5);
            f@life = 0.35 + 0.5*rand(@id*7.7);
        }
    }
    float sp = length(v@v);
    v@v /= 1 + 0.6*sp*dt;                   // 火の粉は速さの2乗の抵抗ですぐ止まる
}

焼く

ノード 設定
sim_out(DOP Import) 入力なし / DOP Network /obj/firework/firework_sim / Objects popobject
cache_sim(File Cache) 入力 sim_out / Start/End 1 300 → Save to Disk → Load from Disk がオンになる

look(Attribute Wrangle / Run Over: Points / 入力 cache_sim)

// 色と明るさ:星と尾は元の絵の色、昇る火の粉はオレンジ
vector c = 0; float I = 0; float ps = 0.1;
if (i@kind == 1 || i@kind == 4) {
    float nb = (i@kind == 1) ? @age/f@burn : 0.5;
    I = (i@kind == 1) ? 2.2 : 1.0*(1 - @age/f@life);    // 明るすぎると色が白く飛ぶ
    I *= smooth(0, 0.03, nb) * (1 - smooth(0.9, 1.0, nb));
    float fl = 0.6 + 0.4*sin(@age*50 + @id);          // 燃え尽き前のちらつき
    I *= lerp(1.0, fl, smooth(0.8, 0.95, nb));
    I *= f@bright;
    c = v@basecol; ps = (i@kind == 1) ? 0.55 : 0.30;
    ps *= sqrt(f@bright);
} else {
    float na = @age/f@life;
    c = lerp({1.0, 0.62, 0.25}, {0.55, 0.1, 0.02}, na); I = 2.5*(1 - na); ps = 0.14;
}
v@Cd = c*I; f@Alpha = 1; f@pscale = ps;

burst_flash(Attribute Wrangle / Run Over: Detail / 入力なし)

// 昇る玉の頭と、開いた瞬間の閃光
float T = (@Frame - 1)/30.0, tb = 2.0;
if (T < tb) {
    float u = tb - T;
    int p = addpoint(0, set(1.5*sin(T*2.1), 260 - 40*pow(u, 1.6), 0));
    setpointattrib(0, "v", p, set(0, 40*1.6*pow(u, 0.6), 0));
    setpointattrib(0, "Cd", p, {1.0, 0.7, 0.35}*4); setpointattrib(0, "pscale", p, 0.5); setpointattrib(0, "Alpha", p, 1.0);
} else if (T < tb + 0.2) {
    float s = T - tb;
    int p = addpoint(0, {0, 260, 0});
    setpointattrib(0, "v", p, {0, 0, 0});
    setpointattrib(0, "Cd", p, {1.0, 0.85, 0.6}*12*exp(-s/0.05)); setpointattrib(0, "pscale", p, 3.0 + 15*s); setpointattrib(0, "Alpha", p, 1.0);
}

merge_render(Merge)に look と burst_flash → OUT_firework(Null)に表示・レンダーフラグ。

/obj/sky(夜空の板)

Grid(sky_grid): Orientation XY Plane / Size 5000 3000 / Rows 200 / Columns 300 → Attribute Wrangle(sky_color、Points)→ Null(OUT_sky)

@P += set(0, 600, -1500);
vector cam = {0, 5, 650};                  // カメラの位置(下の camera1 と同じ)
vector d = normalize(@P - cam);
float el = degrees(asin(d.y));
v@Cd = lerp({0.012, 0.008, 0.007}, {0.001, 0.0014, 0.003}, smooth(0, 20, el));
f@Alpha = 1;

/stage(Solaris でレンダー)

ノード 設定
import_firework(SOP Import) SOP Path /obj/firework/OUT_firework
import_sky(SOP Import) SOP Path /obj/sky/OUT_sky
merge_geo(Merge) 入力1 import_firework、入力2 import_sky
mtl(Material Library) Tab Menu → Tab Menu Mask の末尾に mtlx* を足す。中に MtlX Surface Unlit(firework_unlit)と MtlX Geometry Property Value(Signature Color / Geomprop displayColor)→ Unlit の Emission Color へ。Unlit の Material フラグをオン
assign(Assign Material) Primitives /import_firework/* /import_sky/* / Material Path /materials/firework_unlit
camera1(Camera) Translate 0 5 650 / Rotate 20 0 0 / Focal Length 40 / Horizontal Aperture 35
rendersettings(Karma Render Settings) Output Picture $HIP/render/fw.$F4.exr / Primary Samples 48 / Velocity Blur Velocity Blur
render(USD Render ROP) Valid Frame Range Render Specific Frame Range / Start/End/Inc 1 300 1 → Render to Disk

/img/comp(COP でグロー)

ノード 設定
read_render(File) File Name $HIP/render/fw.$F4.exr / Number of AOVs 1 / AOV C
glow_tight(Glow) Glow Threshold 0.6 / Brightness 1.0 / Size 0.006
glow_wide(Glow) Glow Threshold 0.4 / Brightness 0.8 / Size 0.04
write_png(ROP Image) Output File $HIP/render/comp/fw.$F4.png / Valid Frame Range Render Frame Range / 1〜300

レンダーの後に read_render の Reload Image を押してから write_png を書き出す(File COP は前に読んだ画像を覚えていることがある)。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?