Blender Geometry NodeでD10ダイス(20面体)の作成, For Each Element Nodeを使う

この記事はmaccha advent calender 19日目の記事です。

この記事は ChatGPT を用いて文章を構成しています。が、結局それも直しています。

きっかけ

なぁんか、「物理で 1d100 を振りたい」なと。

ところが、公開されている 3D モデルを探してみると、一般的な 1–20 の 20 面体ダイスはあっても、 0–9 を 2 回ずつ持つ 20 面体(=1d100 用)のモデルはなかなか見当たりません。

それならいっそ、自分で作ってしまおうと思い、 Blender の Geometry Nodes を使って 1d100 用ダイスを生成することにしました。

最初はChatGPTにいろいろ聞いて作っていたのですが、正直頼りにならず、結局自分がノードを構成しなおしています。 BlenderのGeometry Nodeに関してはChatGPT5.2になってもあまり進化していないようです...

解説

使っているノードたち

For Each Element , Strings to Curve , Align Rotation to Vector

indexのfieldsをそのまま入れてしまうと、value to stringの部分でエラーが起こってしまい、Strings to Curveに巧く接続できません。 そこでFor Each Elementを用いて一個づつCurveにしていくという処理をして対処しています。

基本形状の作成

まず、Ico Sphere を使って 20 面体を生成します。

その後、

  • For Each Element (Face)

    • 各面ごとに index と pointsのposition を取得

という流れで、面単位の処理を行います。

数字の生成と配置

  • index10 で割った余りをmathノードのmoduloで計算して、 各面に割り当てる数字(0–9)を決定します。本当はダイスの適切な配置があるのですが、これは妥協しています。

  • 数字は String to CurvesFill CurveExtrude Mesh立体的な文字メッシュとして生成します。

次に、配置と向きを調整します。

  • 各面の position から 中心方向へのベクトルを計算
  • Align Rotation to Vector を使い、 数字が常に面の外側を向くように回転
  • Instance on Points で、各面に数字を配置

原点に配置しているという前提に立って、計算を一部省略しています。

6 と 9 の識別(ドット処理)

このままだとさいころを振った時に 6 と 9 の区別がつかないため、 補助として ドットを追加します。

  • Compare ノードで index が 6 または 9 に該当する面のみを抽出
  • 小さな Cube をつなげたドット用ジオメトリを用意
  • Instance on PointsSelection に接続して、 対象の面にだけドットを配置します。

メッシュ化と仕上げ

  • Realize Instances で、 インスタンスをすべて 実体メッシュに変換
  • Mesh Boolean を使って、 数字部分を 20 面体から切り抜き

これにより、立体的な 1d100 用 20 面体ダイスが完成しました。

ノード構成図

ここまでの流れを構成図で示します。

ノード構成図

完成図

完成図

3D プリンタで作成

完成したモデルは STL として書き出し、 3D プリンタで実際に出力しました。

物理ダイスとして問題なく転がり、 「1d100 を振る」という目的も無事達成できました。

と書きましたが、実際には出力していません。昨日の思いつきで記事を書いたので、まだ出力できていません。出力するためには文字の大きさや幅、振りやすい大きさのためにたくさんの試行錯誤が必要です。こういう細かい文字を正確に再現しうるための調整をこれからやります。

というわけで完成品はまだ見せられません。

去年作ったyoutubeの関連動画だけ押しておく拡張機能を改良した。

maccha advent calender 9日目の記事です。

これは去年の記事です。

azarasing.hatenablog.com

相変わらず、再生履歴をOFFで生活しているので、僕のYoutubeの画面は常にこんな感じです。

Youtubeトップ

もはや1年たつと、cssも崩れてしまうようで、ipadで見ると顕著ですがボタンが変な位置に置かれたりしています。

そんな状態ですが、Youtubeで音楽を聴いたり、ゲーム実況を見たりはします。でも、ゲーム実況を見ている傍らで、何やら政治のあれこれのの動画やらをオススメに表示されても見る気がしません。もちろん、政治についてYoutubeで調べようと思ったら便利ですけど、今はゲーム実況を楽しみたい気分なのでよそでやってほしいですよね。

こういうときにデフォルトの設定タブを関連動画タブにしてしまおうという拡張機能を作ったのですが、先ほどトップ画面が崩壊していたように、Youtubeのdom構造は一年たつと大きくその構造を変えてしまい、機能しなくなってしまいます。

そこで2025年の改良を施した結果のcontext.jsを公開します。

console.log("[EXT] injected", location.href);

function clickRelatedChip() {
  console.log("[EXT] clickRelatedChip called");
  const renderer = document.querySelector('#items > yt-related-chip-cloud-renderer');
  if (!renderer) return false;

  const chips = renderer.querySelectorAll('#chips > yt-chip-cloud-chip-renderer');
  console.log("[EXT] chips:", chips.length);

  for (const chip of chips) {
    const text = chip.innerText?.trim();
    if (text === "関連動画") {
      chip.click();
      console.log("[EXT] clicked 関連動画");
      return true;
    }
  }
  return false;
}

function runOnceWithObserver() {
  if (clickRelatedChip()) return;

  const obs = new MutationObserver(() => {
    if (clickRelatedChip()) obs.disconnect();
  });
  obs.observe(document.body, { childList: true, subtree: true });

  setTimeout(() => obs.disconnect(), 30_000);
}

runOnceWithObserver();

window.addEventListener("yt-navigate-finish", () => {
  console.log("[EXT] yt-navigate-finish", location.href);
  runOnceWithObserver();
});

相変わらずのChatGPT製ですが、仕組みの部分をpromptで明確に指示したおかげで去年よりも精度が高くなっています。 10msごとにボタンを押し続けるみたいな処理ではなく、きちんとobserverを利用した処理をできるようになったのは、GPT5.2になったからではなく、僕がちゃんとobserverの監視停止のコントロールを指示したからでした。

そんなこんなでLLMも進化すれば、人間のプロンプトも進化するという話をお届けしました。

RIJ潜入記

この記事は whywaita Advent Calender 2025 15日目の記事です。*1

 

adventar.org

 

whywaita Advent Calender 10周年、おめでとうございます。azarasingと申します。僕はwhywaitaさんとは同じ大学同じサークルに所属しておりましたが、物理アバターは数えるぐらいしか拝見しておりません。年代も遠いので、参加はあまり積極的に行っていなかったのですが、宇田川にある某オフィスの見学次いでにイベントに参加させていただいて、なんだかんだで枠も埋まっていないと聞き、Advent Calenderの記事を執筆させていただいているというわけです。

 

前回はKHe7さんの「面白機材の話。」でした。
どんな内容なのか楽しみです。

 

今回は時期もだいぶ開いていますが、RTA in Japan Summer 2025にて、音声調整担当のボランティアを行った話を書こうと思います。続けて機材系の記事で申し訳ないですが、インフラ系/whywaita系に浸食されたこのアドベントカレンダーに手ごろなスパイスを提供できていれば幸いです。

 

 

RTA in Japan (RIJ) とは

RTA in Japan、みんな知ってるでしょ!みたいなテンションでこの話をしたら、そもそもこのイベント知らないっていう人が結構多かったので、一応説明しておきますね。

 

RTA in Japan(通称RIJ)は、ゲームをできるだけ早くクリアする「RTA(リアルタイムアタック)」をテーマにした、日本最大級のチャリティ配信イベントです。年に数回開催され、国内外の走者が集まり、レトロゲームから最新作まで幅広いタイトルが連続でプレイされます。走者の高度なテクニックだけでなく、解説者による分かりやすい説明や、視聴者参加型の寄付企画も特徴です。集まった寄付金は慈善団体へ寄付され、エンタメと社会貢献を両立したイベントとして高い評価を受けています。
公式サイト:https://rtain.jp

powerd by Chat GPT 5.2

とのことです。昔は知る人ぞ知るという立ち位置のイベントでしたが、日本国内最大級のイベントとなり、いつも2-3万人ぐらいが見ているような割と大きなイベントに最近ではなっています。

参加経緯

そもそも、なぜこんなイベントに参加することになったのかという話ですが、もともと僕は文化祭実行委員会として、2019年から活動をしていました。

そして、2020年にコロナ禍に入った影響で、文化祭の配信管理をメインのタスクとしてこなすようになっていました。その影響からか、割とこの手のイベントの知識が身についていました。

しかしながら、就職した領域は全然別の領域であったため、この手のスキルを持て余すようになりました。そうなってくると、なんだか勿体ない気もしてきたところ、ボランティア募集の投稿を目にして、応募。当選したという流れです。

参加証

当日の様子

会場の様子

会場の様子

会場は主に二つあり、メインの配信を行う会場と、各走者や来場者の交流スペースであるラウンジの二つです。メイン会場で配信を眺めるもよし、ラウンジで同好の士と共に交流を深めるもよし、といった形です。

調整作業の話

音響卓では主にRoland WINGを利用します。各3-4時間程度のセクションで音声卓を担当し、他セクションと連携しながら作業します。大まかにいえばゲームの音量やマイクの音量を適宜調整し、配信を見ている視聴者そして走者/解説者をサポートする役回りです。

調整作業のイメージ

スムーズな配信の切替を実現するために、走者卓がA,Bと二つに分かれており、片方がRTAの本番をする間に、もう片方でセットアップを行います。ゲーム時間が5分と短いゲームだとその作業量は膨大になってしまいますが、たいていは30分以上はかかるゲームが多いですし、走者の皆さんとてもやる気が高いので、前々回のゲームが終了した時点でセットアップにスタンバイしてくれる方々も多く、また今回初めての参加だったので、周りのサポートも手厚かったので、とてもやりやすかったです。作業も慣れてくると楽しく、周りの方々も僕の本業とは違うドメインで活躍している方々ばかりだったので、とても良い交流ができました。

冬もやります!

RIJ Summer 2025に参加して、ぜひ次回もやりたいなと思い,Winterに応募しました。また当選することができたので、RTA in Japan Winter 2025も音響調整卓で作業します。

前回の反省点としては、終電を考えず始発を会場で予期せず明かしたことを反省し、備えることですね。会場の手ごろな休憩場所のリサーチやホテルのリサーチは済ませてあります。

RTA in Japan Winter 2025はベルサール飯田橋ファーストで、Summerよりも会場が広いため、事前の応募なしに現地に来ることができます。お越しになる際はマスクを忘れず、ぜひ配信でもご覧ください。

*1:そして、maccha Advent Calender 2025 にも掲載しています。

maccha Advent Calendar 2025 開会のお知らせ

maccha advent calender 始まります。

MMAに2019年に所属したazarasingです。こんにちは。今年もadvent calenderの季節になりました。例にもれず、偉大なるMMAのメンバであるmaccha氏に敬意を表しつつ(w)、勝手に立ち上げたadvent calenderです。

もう大学も卒業し、果たして何枠埋まるのかも定かではありませんが、桜井政博にならい、例のごとくまったく埋まっていない状態で、先読みでこの原稿は描きあげています。 どんな記事が上がるのか、今から楽しみですね。

後輩の方々も、先輩の方々もこのカレンダーが埋まっていなければ、ぜひ埋めてみてください。他カレンダーとの同時投稿もOKです。よろしくお願いします。

今更読んだ本4

この記事はmaccha advent calenderの24日目の記事です。前回はfjdj君の車3でした。彼とその周辺の車好きは○調の後輩に脈々と受け継がれているらしいですね。

adventar.org

今回紹介するのは米澤穂信の「犬はどこだ」です。

僕は米澤さんの本は全部読んでいるはず、、、なのですが、この本をまだ見かけていませんでした。

開業にあたり調査事務所〈紺屋S&R〉が想定した業務内容は、ただ一種類。犬だ。犬捜しをするのだ。――それなのに舞い込んだ依頼は、失踪人捜しと古文書の解読。しかも調査の過程で、このふたつはなぜか微妙にクロスして……いったいこの事件の全体像とは? 犬捜し専門(希望)、25歳の私立探偵、最初の事件。新世代ミステリの旗手が新境地に挑み喝采を浴びた私立探偵小説の傑作。

タイトルが示す犬の意味がどんどん変わっていき、最終的には元に戻るようなそんな作品でした。主に二つの依頼が同時に進行していくので、読みにくいかもしれませんが、最終的に一つにつながります。まあ、探偵小説なら当然なので、いつ繋がるのか、どうつながるのか、ワクワクしながら読めました。

 

主人公が立ち上げる調査事務所は〈紺屋S&R〉でした。おそらく「紺屋の白袴」という慣用句から来ています。紺屋の白袴といえば、医者の不養生みたいな意味の言葉です。

医者の方の意味は何となく分かりますが、紺屋の方は何というかいちゃもんに近いですよね...

主人公は探偵というテンプレートを演じて、それなりの体裁を整えていきますが、探偵の根本というか、(これはすべての人間に言えるのかもしれませんが、)そういったことが欠けていたということに最後に気づきます。まさに「犬なしの探偵稼業」が新しい慣用句になりそうです。GENというネットでしかやり取りをしないキャラクターのある種の不気味さの回収がないと感じますが、こういう犬を置いておく意識の欠如の現れが表れた結果なのかもしれません。

 

僕も探偵業という非日常の汀のような立ち位置に陥るかもしれません。そうしたら犬を探すのでしょうか。

今更読んだ本3

この記事はmaccha advent calender 17日目の記事です。

adventar.org

今回紹介する本は「成瀬シリーズ」です。

 

- 成瀬は天下を取りにいく

- 成瀬は信じた道をいく

 

僕は書店を定期的に訪問し、積読を増やすという奇行によく走っています。その書店に行くたびに毎回このシリーズが宣伝されており、その圧力に負けて買ってしまったシリーズでもあります。最近ではクリスマス仕様のカバーを見かけましたね。

 

主人公は二百歳までを生きることを目標にぶれることなく我が道を進む成瀬あかり。そのキャラの独自性が面白く、するすると読んでしまった。

目立てばすぐに黒歴史と化す今我々が生きる現代という舞台設定でありながら、興味の赴くまま、思ったことはすぐに実行する行動的な主人公。子供の時の純粋さを持ち合わせていながら、どこか大人びているような独特の空気感を持つ。そんな彼女とその周辺の物語。

 

僕も、というか人間だれしもそうだと思うが、小さいころには成瀬のような行動をとった/とろうとした人間も多いと思う。いつしか社会や学校に押しつぶされてというか、適応して、社会に順応した大人となっていく。しかし、個性がとても大きくとがっていると、ローラーで平らにしている人たちが逆に被害を被るということもある。こういったある種のカウンターパンチが、この本の魅力であると思う。

興味が湧いたらぜひ読んでほしい一冊である。

Youtube プレイヤーのサイドに出てくる動画群が気に入らないので常に「関連動画」が出てくるようにする拡張機能を雑に作った。

今日は13日の金曜日!UEC2 Advent Calender 13日目の記事です。よろしくお願いします。

adventar.org

UEC19 -> 23 (M2)のazarasingです。調布祭実行委員会に所属していた人で、去年まではなんやかんやで調布祭実行委員会での活動をしていましたが、今年はついに!仕事がゼロになりました()ので、のんびり調布祭を満喫していました。M2なので、修論の合間にコツコツ記事を書いています。

今年はmaccha advent calenderというのもやっています*1。maccha君と愉快な仲間たちによるadvent calenderになっているはずです。まだ枠が残っているのでなんか記事を載せたい人は載せてみてください。

今回は「Youtube プレイヤーのサイドに出てくる動画群が気に入らないので常に「関連動画」が出てくるようにする拡張機能を雑に作った。」という雑談記事をお送りいたします。

動機

僕がYoutubeを見るときは、専ら音楽を聴くとか、ゲームの攻略を見るとか、ゲーム実況をみるとか、、、とにかく目的があって見ています。僕は調べものをするときはとことん深読みするタイプなので、同じような動画を短期間でたくさん見ることがあります。あとで別のジャンルの動画を見るときに、この短期間で見た動画がいつまでも関連動画としてサイドバーに君臨し始めるのです。 とにかく、目的もなしに見る動画サイトはニコニコ、そうでないときはYoutubeの稀有な人間ですから、こういった現象ははっきり言って不愉快です。

こうなるのはご親切にYoutubeさんが「あなたに合った最新動画」とやらを表示しているからです。僕はそもそもYoutubeの再生履歴はOFFにしているため、一体どこから学習しているのが疑問でしょうがないですが*2、かといってこのサイドバーを非表示にするというのも、関連動画をクリックして別の動画をみるという使い方はしますので、困ります。そもそも、僕が表示してほしいのは関連動画だけなので、関連動画というボタンが常に押されてればいいとうことになります。

youtube の関連動画ボタン

Youtubeを開けば、関連動画ボタンを読み取って、自動で選択状態にする... そんな拡張機能を作ればいい」

方針は決まりました。

実装

まずは、このボタンのセレクターを調べましょう。F12を押して調べます。すると、'yt-chip-cloud-chip-renderer'という名前のタグが使われているのが分かります。この中の'yt-formatted-string'中のtitleに当たるテキストが一致すればいいということになりますね。

なんか、おそらくこの入れ替えは何ら頭の実行コードが組まれているはずで、それを実行すればいいのですが、それだとYoutube君に怒られてしまいそうなので、クリックイベントを発生させる方式にします。その方が手軽でいいですからね。

あと気を付けなければならないのは、この関連動画はYoutubeを見始めてすぐ出るものではなく、時間差があることです。おそらく自分の情報をもとにレコメンド(w)をしているのだと思いますが、これを待たないといけません。この処理を加えて完成です。

大体の何となくのコードと、仕様を詳しく書いて、ChatGPTに投げれば出来上がります。便利な時代ですね。

function initiateObserver() {
    const observer = new MutationObserver((mutations, observerInstance) => {
        const filterButtons = document.querySelectorAll('yt-chip-cloud-chip-renderer');

        filterButtons.forEach(button => {
            const buttonText = button.querySelector('yt-formatted-string').getAttribute('title');
            if (buttonText === '関連動画') {
                const event = new MouseEvent('click', {
                    bubbles: true,
                    cancelable: true,
                    view: window
                });

                setTimeout(() => {
                    button.dispatchEvent(event);
                    observerInstance.disconnect();
                }, 1000);
            }
        });
    });

    const targetNode = document.body;
    const config = { childList: true, subtree: true };
    observer.observe(targetNode, config);
}

window.onload = function() {
    initiateObserver();
};

window.addEventListener('popstate', function() {
    initiateObserver();
});

window.addEventListener('yt-navigate-finish', function() {
    initiateObserver();
});

(function(history){
    var pushState = history.pushState;
    history.pushState = function(state) {
        initiateObserver();
        return pushState.apply(history, arguments);
    };
})(window.history);

これにて、悪はさり、平和が訪れた... というわけでもなく、関連動画というボタンがない場合などの対応ができません。動画の内容によって(多分ジャンルなどを推定できなかった場合とか?)は関連動画という動画リストは作成されないようです。そりゃそうだという話ですが、独自の関連動画のリストの作成を拡張機能として実装するとか、関連動画の呼び出しが強制的にできないか試すとか、そういうことをすればいいと思うので、そのうちやろうかなと思います。いつになるんでしょうか。Youtubeを見なくなるより前にはやろうと思っています。

*1:UEC2が10198で、macchaが10199です。お隣同士仲良くしましょう。来年はUEC老害adventが立ちそうな気配がありますね。

*2:Youtubeは再生履歴がOFFだとトップページにおすすめ動画が表示されない仕様にしている。これについてYoutbeは

おすすめ動画を選定するのにYouTubeが再生履歴に依存していることを明確にしおすすめ動画の視聴ではなく検索で好みの動画を探すことを好むユーザー向けに、機能を合理化するためのリリース

https://gigazine.net/news/20230809-youtube-show-blank-page-none-watch-history/ より

としているが、再生履歴に関しての配慮なら、今回対処しているサイドバーにも同様におすすめ動画を乗せるべきじゃないと思うのだが。結局は再生履歴をONにしろという圧力なんだろうなぁと思っています。

www.theverge.com