KMC活動ブログ

京大マイコンクラブの活動の様子を紹介します!!

3DCG勉強会2022 第9回~第11回

こんにちはこんにちは! 3DCG勉強会2022 担当の crashRT です。今回は 3DCG勉強会2022 第9回~第11回の活動を報告します。

過去のレポートはこちらから

3DCG勉強会とは?

参加者に 3DCG制作を布教する 3DCG制作の雰囲気を知ってもらうことを目指して、毎週火曜日の20:30から開催している新入生向け 1 の勉強会です。

初めて3DCGに触れる参加者が多いので基礎を中心にゆっくり進めながら、3DCG を制作していく上で必要な知識や技術などについて話していきます。現在は無料の Blender を扱っていますが、今後 CINEMA 4D も扱う予定です。

現在は、昨今の情勢もあり Discord というサービスを用いて遠隔で開催しています。

勉強会の内容

第9回:配色の話

第9回では配色について話しました。配色は作品の雰囲気を大きく変える影響力を持っているにも関わらず、選択肢が多すぎて自分の感覚だけで選ぼうとするとよくわからなくなってしまいがちです。 そこで、配色を考える上で助けとなる理論について解説しました。 具体的には、まず色の三属性や色相環、トーンなどの基本的な部分について説明し、その後セパレート、類似性の原理、トライアド配色など(秩序の原理)などを紹介しました。 3DCG に限らずいろいろな場面で応用してもらえたらと思います。

第10回:構図の話

第10回では構図について話しました。構図はオブジェクトの配置やカメラの位置を考えるときに便利なものです。 全体のバランスを調整することができ、その上で見せたい部分へ視線を誘導することができるので、うまく扱えると作品がまとまってより良いものになります。 講座では、まず三分割構図・三角構図・シンメトリーなどのよく使われる構図を例を用いて解説し、 その後自分が見せたい部分へ視線を誘導する方法について話しました。

第11回:前期まとめ

第11回では今まで扱った内容を復習しながら、ちょっとした作品を制作してみました。 SDS や UV 展開、ライティングや配色、構図など今まで扱った内容にできるだけ触れ、 これらを実際どのように使えば良いのかについて話しました。 今までの話が一つにつながってくれたら良いなと思います。

第11回の作例

試験期間に入るため、前期はこれで終了です。お疲れ様でした。 後期では CINEMA 4D も使って映像制作を始めようと思っています。 時間を操ることもできるようになったときどのようなものを作ることができるのか、楽しみにしてもらえると嬉しいです。

参加してみたい方へ

講座はすべて録画しているので、今からの参加でも全く問題ありません。質問もいつでも受け付けているので、気軽に参加してください!

まずは、KMCの Twitterメール にご連絡ください。

KMC の宣伝

KMCではパソコンで何かしたい人々を大募集しています。入部資格に制限はありません。興味のある人は下のリンクからどうぞ!!

www.kmc.gr.jp


  1. ここでの新入生はKMCの新入部員のことで、大学での回生・年齢は無関係です。

3DCG勉強会2022 第5回~第8回

こんにちはこんにちは! 3DCG勉強会2022 担当の crashRT です。
だんだん暑くなってきている中レンダリングを回しているので室温が大変なことになっています。今回は 3DCG勉強会2022 第5回~第8回の活動を報告します。

過去のレポートはこちらから

3DCG勉強会とは?

参加者に 3DCG制作を布教する 3DCG制作の雰囲気を知ってもらうことを目指して、毎週火曜日の20:30から開催している新入生向け 1 の勉強会です。

初めて3DCGに触れる参加者が多いので基礎を中心にゆっくり進めながら、3DCG を制作していく上で必要な知識や技術などについて話していきます。現在は無料の Blender を扱っていますが、今後 CINEMA 4D も扱う予定です。

現在は、昨今の情勢もあり Discord というサービスを用いて遠隔で開催しています。

勉強会の内容

第4回までで Blender の基本的な使い方は一通り紹介できたと思うので、 作品の作り方や知識的なものを扱い始めました。

第5回:トンネルを作る

第5回ではトンネルを扱いました。 トンネルとはある一定の区画が繰り返されて通路のようになってるもののことで、正式な名前ではないですが慣例的にそう呼ばれています。 使える機能があまり多くなくても、それなりのものが作れることを感じてもらえたらと思います。

また、作品を制作する上で重要なリファレンスについて説明し、良い作品が集まっているサイトである PinterestBehanceArtStation と、リファレンスの管理に便利な PureRef を紹介しました。

3DCGのトンネル
第5回の作成

第6回:ビルのモデリング

第6回ではビルのモデリングを扱いました。 インスタンス機能や Array モディファイアなどを用いて、繰り返しのあるものを効率的にモデリングする方法を解説しました。

3Dモデリングされたビルの画像
第6回の作例

第7回:カメラとライティング基礎

第7回ではカメラとライティングの基本的な部分を扱いました。 ライティングとは ライトを設定し、3DCG の世界を照らす工程のことです。

カメラについては被写界深度と画角について、ライティングについては影の扱い方と、伝統的なライティングの手法である三点照明について解説しました。

被写界深度の例

三点照明された猿の3Dモデル
三点照明の例

第8回:ボリュームで遊ぶ

第8回ではボリュームについて解説しました。 ボリュームレンダリングとは光の通り道でのふるまいを計算するもので、光の通り道を可視化したり雲や煙などを表現したりするときなどに使われます。

Blender でのボリュームの使い方と、その応用例をいくつか紹介しました。

ボリュームレンダリングの例

参加してみたい方へ

講座はすべて録画しているので、今からの参加でも全く問題ありません。質問もいつでも受け付けているので、気軽に参加してください!

まずは、KMCの Twitterメール にご連絡ください。

KMC の宣伝

KMCではパソコンで何かしたい人々を大募集しています。入部資格に制限はありません。興味のある人は下のリンクからどうぞ!!

www.kmc.gr.jp


  1. ここでの新入生はKMCの新入部員のことで、大学での回生・年齢は無関係です。

Webサービス勉強会2022 第2回〜第4回

こんにちは!Webサービス勉強会2022を担当している ryokohbato (KMC ID: rhato, ID: ryokohbato) です。今回は、Webサービス勉強会2022の第2回〜第4回のレポートをお届けします。

過去のレポートはこちらから

Webサービス勉強会2022とは?

Webサービスについて1年かけて学ぶ勉強会です。以下リポジトリで環境および資料を公開しています。

github.com

第2回 書いて覚えるCSS

第1回「書いて覚えるHTML」 同様、手を動かしながらCSSに慣れてもらいました。資料は 第2回 書いて覚えるCSS です。

第2回裏講座 そもそもなんでこんなことをやらされているのか

第1回 イチからWebpackのconfigを書いてTypeScriptをコンパイルする では、TypeScriptをコンパイルするために、npmなどを使ってパッケージを入れたり webpack.config.js を書いたりする必要がありました。今回は、なぜこのような複雑な方法でTypeScriptの開発環境を整えたのか、歴史的な経緯も踏まえつつ扱いました。資料は 第2回 そもそもなんでこんなことをやらされているのか です。

第3回 デザインパターン1

第3回では、カード風のスタイルを作りながらHTMLとCSSを組み合わせた基本的な開発の方法を扱いました。また、スクロールバーの表示方法やmarginの相殺についても扱いました。資料は 第3回 デザインパターン1 です。

第3回裏講座 新しいCSSの機能を試してみる

最近使えるようになったセレクタである :is():where()、そしてカスケードレイヤー (@layer) について、実際に書いて動かしてみつつ、書き方や動作を確認しました。資料は 第3回 新しいCSSの機能を試してみる です。

第4回 Webアクセシビリティの基礎

スクリーンリーダーやキーボードによるコントロールを使って閲覧されることを念頭に置いたWebページの開発について扱いました。今回はWebアクセシビリティについて学ぶ上で最も基礎になる部分について扱うにとどめましたが、今後より発展的な内容も扱っていきたいと思います。資料は 第4回 Webアクセシビリティの基礎 です。

コンテナ、Docker、Kubernetes って何が嬉しいの?という例会講座をしました

はむはー!最近は私たち人間に優しい気温になってきました。ずっとこれくらいの気温になっててほしいです。

今日、KMC の例会講座で「コンテナ、Docker、Kubernetes って何が嬉しいの?」というタイトルで例会講座を行いました。

docs.google.com

コンテナや Docker、Kubernetes はアプリケーションを書いたりサーバーを触ったりしていると目にすることがあると思いますが、「なんか難しそう」「今の運用でうまくいってるしな」と敬遠する人も多いと思います。また、アプリケーションを使うときに README の通りに Docker コマンドを打って、よくわからないけど動いている、でもなんか普通に立ち上げた時と違ってよく分からん、といったこともあるでしょう。

そんな人達がコンテナ技術に触れるきっかけとなるよう、「コンテナとはなんなのか?Docker や Kubernetes は何をしてくれて、使うと何が嬉しいのか?」ということに焦点を置いて講座をしてみました。

コンテナ、Docker、 Kubernetes を使うとっかかりが欲しい人に、ぜひこの資料を読んでいただければと思います!

Webサービス勉強会2022 第0回〜第1回

こんにちは!Webサービス勉強会2022を担当している ryokohbato (KMC ID: rhato, ID: ryokohbato) です。今回は、Webサービス勉強会2022の第0回、および第1回のレポートをお届けします。

Webサービス勉強会2022とは?

Webサービスについて1年かけて学ぶ勉強会です。以下リポジトリで環境および資料を公開しています。

github.com

第0回 (5/8)

第0回は環境構築回でした。Node.jsなど必要なツールをインストールした上で、開発用サーバーを立てました。

また、Webサービス勉強会2022では、Dockerを使用した開発環境も提供しています。こちらを使用して環境を構築してくれた部員もいたようですね。

第1回 (5/15)

さて、いよいよ勉強会の本格始動です。Webサービス勉強会は、大きく3つのパートに分けられています。

  1. メインパート (私が資料をもとに説明をしていく)
  2. 演習パート (扱った内容に関する演習を行う)
  3. 裏講座 (演習パートと並行して開催)

1. メインパート

今回のメインパートでは、「書いて覚えるHTML」と題して手を動かしながらHTMLに慣れてもらいました。第1回の資料は こちら です。手軽にリッチなUIを作れる楽しさが感じてもらえたと思います。

2. 演習

今回の勉強会では進捗管理シートを用意しています。みなさん演習もかなり解き進めてもらえたようで何よりです。

3. 裏講座

さて、演習の時間を利用して、Webサービス勉強会2022ではより発展的な内容を扱う講座、裏講座を開催しています。第1回の今回は「イチからWebpackのconfigを書いてTypeScriptをコンパイルする」と題し、TypeScriptをコンパイルするために必要な webpack.config.jstsconfig.json の書き方を学びました。次回は、コンパイルのためになぜこんな複雑なことをしているのか、について扱う予定です。

裏講座の様子
裏講座の様子

宣伝

Webサービス勉強会2022では、Botの開発やWebサービスの開発を学びます。興味のある方は、以下の入部案内を参考にメールやTwitterのDMなどでいつでもご連絡ください。お待ちしております!

www.kmc.gr.jp

3DCG勉強会2022 第1回~第4回

こんにちはこんにちは! 3DCG勉強会2022 担当の crashRT です。
普段は Motion Graphics と呼ばれる CG を用いた映像を制作しています。最近ではKMCの新勧用のビラを作ったり Webサービスの勉強を始めたりしました。

3DCG勉強会とは?

参加者に 3DCG制作を布教する 3DCG制作の雰囲気を知ってもらうことを目指して、毎週火曜日の20:30から開催している新入生向け 1 のイベントです。

初めて3DCGに触れる参加者が多いので基礎を中心にゆっくり進めながら、3DCG を制作していく上で必要な知識や技術などについて話していきます。現在は無料の Blender を扱っていますが、後半では CINEMA 4D も扱う予定です。

現在は、昨今の情勢もあり Discord というサービスを用いて遠隔で開催しています。

勉強会の内容

これまでに開催した回では以下のような内容を扱いました。

  • 第1回:Blender の導入、使い方の基本(Object Mode での操作など)
  • 第2回:ポリゴンの編集(ランプのモデリング
  • 第3回:SDS 2 の使い方(腕時計のモデリング
  • 第4回:マテリアルの基礎(テクスチャ、UV展開など)

3Dモデリングしたランプ
第2回の作例
3Dモデリングした腕時計
第3回の作例

沼にハマってくれた新入生もいるようで、色々作ってくれています。また、5/7 (土) には1日で上回生が支援をかましつつ新入生にとりあえずモデリングしてもらう、「ラピッドモデリング祭り」と呼ばれるイベントを開催し、無事参加してくれた新入生に作り上げてもらうことができました。(気がついたら完成していた新入生もいてビビっています)

これまでの4回で基礎の部分はある程度カバーできたと思うので、次回からは少しずつレベルを上げていこうと考えています。

参加してみたい方へ

講座はすべて録画しているので、今からの参加でも全く問題ありません。質問もいつでも受け付けているので、気軽に参加してください!

まずは、KMCの Twitterメール にご連絡ください。

KMC の宣伝

KMCではパソコンで何かしたい人々を大募集しています。入部資格に制限はありません。興味のある人は下のリンクからどうぞ!!

www.kmc.gr.jp


  1. ここでの新入生はKMCの新入部員のことで、大学での回生・年齢は無関係です。

  2. subdivision surfaces

独自のSlack転送システムを作った話

こんにちは!現会長のryokohbato (KMC ID: rhato, ID: ryokohbato) です。普段はたまに雑用業務をしつつKMCライフを満喫しています。今回はKMCの新歓で使うために開発した、独自のSlackメッセージ転送システムについて紹介するよ!

概要

現在のKMCではSlackが主な活動の場になっており、KMC Slackには部員のいろいろなことが書き込まれているわけですが、体験入部時にはアカウントがMCG (マルチチャンネルゲスト) に設定されているため、それらを見ることはできません。しかし今年の新歓では新たな試みとして、体験入部時にもその一部を見えるようにすることで、KMCの空気感を知ってもらおうという話になりました。

Slackにはreacji (リアク字)と呼ばれる機能があり、特定のリアクションが付けられた投稿を自動で別のチャンネルに転送することができます。これを使って、外部に見せても良い投稿をゲストアカウントからも見えるチャンネルに転送するようにすれば良さそうです。

Reacji Channeler
reacji (Reacji Channeler) によりメッセージが転送された様子

ところが、この機能はSlackのゲストアカウントとの相性が悪いです。(当然といえば当然ですが、) ゲストアカウントからは見えないチャンネルからゲスト用チャンネルにreacjiで転送されたメッセージは、ゲストアカウントからは見えません。

それぞれのアカウント種別から見ることができるメッセージの範囲
それぞれのアカウント種別から見ることができるメッセージの範囲

そこで、reacji相当の機能を独自に開発することにしました。

そうしてできたのが、kmc-reacjiです!宗教上の理由によりオープンソースとなっております。

登録された部員が、自分の投稿に特定のリアクションを付けた場合に、全く同じ内容をゲスト用チャンネルに投稿します。テキストだけなく画像も転送されますが、画像はそのまま投稿するのではなく、Gyazo APIを使ってアップロードされた画像のリンクを投稿します。

kmc-reacjiによりメッセージが転送されている様子
kmc-reacjiによりメッセージが転送されている様子

詳しい実装の話

転送が発生する条件は以下の通りとしました。

  • kmc-reacjiのシステムに登録されていること
  • :transfer: のリアクションが 本人により 押されること
  • リアクションが押された投稿が その本人の投稿 であること

kmc-reacjiでは、「誰の投稿をどのチャンネルに転送するか」を src/transfer-rule.ts で管理しており、「システムへの登録」というのはこのファイルに自分のユーザーIDを記入することを指しています。

ここからは詳しい実装についてささっと書いていきたいと思います。ちなみに私は axiosAPIを叩くのが好きなので、有名な node-slack-sdk などは使わず、express でサーバーを立てて axios で Slack APIGyazo APIを叩いています。

プログラムの全体的な動作は以下のような感じです。

  1. reaction_added イベントを受け取る (KMC Slackのチャンネルで押された絵文字リアクションの全てを受け取っている)
  2. イベントを発生させたユーザー、すなわち絵文字リアクションを付けたユーザーを特定して、そのユーザーがシステムに登録されているかどうかを確認する
  3. 自分の投稿に自分で押したリアクションであることを確認する
  4. リアクションが :transfer: であることを確認する

プログラムの本体は src/kmc-reacji.ts で全てです。簡単に紹介します。

まずは express でサーバーを立てます。先頭で response.end(); していますが、これはSlack APIあるあるで、独自のUIを作ってユーザーに選択させる、みたいなものを作るときには3秒以内に応答する必要がある 1 のでそのクセでこう書いています。今回は応答が遅くなっても大丈夫なはずですが、わざわざ遅らせる意味もないので先頭で応答しておきます。

const express = require("express");
const app = express();

app.use(express.json());
app.use(express.urlencoded({ extended: true }));

app.post("/", async (request: any, response: any) => {
  response.end();

  // ここから先にプログラムが続く
}

次に、転送するメッセージを取得します。絵文字リアクションが押されたメッセージのテキストを取得したいですね、絵文字リアクションイベントにはこの情報は含まれていないので、ts (タイムスタンプ) を使って頑張って取得する必要があります。それをしているのが下の部分です。

絵文字リアクションが押されたメッセージの投稿時間はイベントに含まれているので、この時間の1ms前から1ms後までの間に投稿されたメッセージを検索しています。 正直ここはもうちょっとなんとかしたい。。。

const requestBody = request.body;
// 略
const target_channel: string = requestBody.event.item.channel;
const target_ts: string = requestBody.event.item.ts;
const latestTs = `${target_ts.split(".")[0]}.${Number.parseInt(target_ts.split(".")[1]) + 1}`;
const oldestTs = `${target_ts.split(".")[0]}.${Number.parseInt(target_ts.split(".")[1]) - 1}`;

const target_message = await axios.get("https://slack.com/api/conversations.history", {
  headers: {
    Authorization: `Bearer ${token.slack.user}`,
    "Content-Type": "application/json",
  },
  params: {
    channel: target_channel,
    latest: latestTs,
    oldest: oldestTs,
  },
});

さて、次に必要なのは投稿時のアイコンとユーザー名の設定です。Nullish coalescing operator (??・Null合体演算子)、便利ですねー

const profile = target_user_info.data.user.profile;
const icon_url: string =
  profile.image_original ??
  profile.image_512 ??
  profile.image_192 ??
  profile.image_72 ??
  profile.image_48 ??
  profile.image_32 ??
  profile.image_24 ??
  "";
const user_name = target_user_info.data.user.name;

ちなみに、ユーザー名やアイコンを個別に設定してメッセージを投稿する場合、chat:write.customize permission を与えた上でBot User OAuth Tokenを使う必要があります。

さて、最後に画像をGyazo APIを使ってアップロードしていきます。ハマりポイントがたくさんあって大変でした。

まず、メッセージに添付された画像のデータを取得するには、url_private に書かれたURLにBot User OAuth Tokenを記載したAuthorizationヘッダを付けてGETリクエストを投げる必要があります。

以下のようにして、添付された全ての画像のデータをArrayBufferで受け取ることができます。(MIME typeがimage/から始まるものを画像と判断しています。)

const images_data: { data: any; mimetype: string }[] = await Promise.all(
  target_message.data.messages[0].files
    .filter((x: any) => /image\/.*/.test(x.mimetype))
    .map(async (x: any) => {
      return {
        data: (
          await axios.get(x.url_private, {
            headers: {
              Authorization: `Bearer ${token.slack.user}`,
            },
            responseType: "arraybuffer",
          })
        ).data,
        mimetype: x.mimetype,
      };
    })
);

また、Gyazo APIのUploadを叩く際は、filenameを指定しないと動きません。

かなり適当にfilenameを決めてしまっていますが、とりあえず動くのでヨシ!

const gyazo_urls = await Promise.all(
  images_data.map((x) => {
    const form = new FormData();
    form.append("access_token", token.gyazo);
    form.append("imagedata", x.data, {
      filename: `${target_ts}__kmc-reacji`,
      contentType: x.mimetype,
    });
    return axios.post("https://upload.gyazo.com/api/upload", form);
  })
);

そんなこんなで完成です!メッセージに添付された画像データを取得するところでかなりハマってしまい、画像の転送が実装されるまでに1ヶ月以上かかってしまいました。。。

App Manifestも置いておきます。(event_subscriptionsrequest_url は隠しています)

display_information:
  name: kmc-reacji
  description: お試し用memoチャンネルにメッセージを転送
  background_color: "#008000"
features:
  bot_user:
    display_name: kmc-reacji
    always_online: true
oauth_config:
  scopes:
    user:
      - channels:history
      - reactions:read
    bot:
      - channels:read
      - chat:write
      - chat:write.customize
      - chat:write.public
      - users:read
settings:
  event_subscriptions:
    request_url: https://example.com/
    user_events:
      - reaction_added
  org_deploy_enabled: false
  socket_mode_enabled: false
  token_rotation_enabled: false

あとがき

継ぎ足しのソースコードで型定義も最悪なので、このあたりはなんとかしたいですね。今度Twitterへの転送機能も付けたいなー。

宣伝

今年もKMCでは 新入生プロジェクト を開催します。また、今年の Webサービス勉強会 は私が担当します。今回紹介したようなBotの開発やWebサービスの開発に興味のある方は、以下の入部案内を参考にメールやTwitterのDMなどでいつでもご連絡ください。お待ちしております!

www.kmc.gr.jp

補足

実際には、間違って転送してしまった際に転送されたメッセージを消去するための :cancel-transfer: という絵文字リアクションも実装していますが、chat.delete しているだけで大したことは何もないので省略します。


  1. 気になる方は 公式ドキュメントのこのあたり を読むと書いてあります。