BlogVRアプリ開発やAI技術研究をおこなっています。2023https://qiita.com/advent-calendar/2023/hikky用の記事となります。今回は「オブジェクト指向」に関するよもやま話を書こうかと思います。■オブジェクト指向とはオブジェクト指向とは何かというと・・・いや、内容をまとめるのが面倒なのでChatGPTさんに聞いてみましょうか。OO)とは、ソフトウェア設計とプログラミングのパラダイムの一つです。このアプローチは、データとそれに関連する操作を一つの単位、つまり「オブジェクト」としてまとめることに焦点を当てています。(以下略)というわけで、オブジェクト=モノのようなものを基点に設計する考え方で、それまでの構造化プログラミングとは異なる大きなパラダイムシフトであって、本格的な普及が始まった1990年代当時、なかなか移行できないプログラマが多くいたのを覚えています。オブジェクト不要論というのもの当時提唱する一部の人もいたりしましたが、21世紀に入ってほぼ主流となりました。■オブジェクト指向と道教思想の類似性このオブジェクト指向という考え方が何を元にして誕生したのかはやや謎ではあります。関数型言語は明らかに数学からヒントを得ているのは分かりやすいのですが。これに関して、道教の思想から影響を受けているのではないかという指摘が一部からおこなわれています。道教の考え方をものすごくざっくりいうと、根源的な存在から万物が生じて、あらゆる現象は万物から生じるみたいな感じです。これ、とてもオブジェクト指向の考え方に似ていますよね。オブジェクト指向の誕生に関わった人が道教を参考にしたという証拠は論文でも文献でも何一つないのですが、19世紀から20世紀にかけて欧米で東洋思想ブームが何度も起きているので、影響を受けた可能性は否定できないところではあります。影響を受けたとしても、キリスト教文化圏の中で道教からヒントを得たと当時大っぴらに言えたかどうかは難しいところです。東洋思想ブームは少なからずオカルトブームにも結びついており、ブラヴァツキーの神智学だったり、ニューエイジ・ムーブメントだったり。仮に影響を受けなかったとして、ではなぜ類似性があるのかというと、古代の東洋思想や哲学は本当に多種多様で、その中に現代における新しい思想と似たものが見つかるというのは不思議ではないのかもしれません。計8つがある八識説だったり、もっと多い数を提唱している一派も存在します。唯識は結局この世界が実在するか分からないし、ただ(唯)、識があることしか分からないよねという考え方で、量子論だったりシミュレーション仮説とも似たところがあります。あと、他にも6世紀頃のインド哲学のヴァイシェーシカ学派は、言葉は実在と1対1で対応するという思想で、1980~90年代のAIがやろうとしていた方法論と親和性があって興味深いです。2010年代のディープラーニング以降からすると古い考え方ではありますが。話をプログラミングに戻しますが、オブジェクト指向が主流になって30年以上経つわけですが、次のパラダイムシフト、ポストオブジェクト指向が今後登場するのかを考えたいと思います。アスペクト指向だったりいろいろなものが提唱されてきたのですが、オブジェクト指向を補完するものだったりして、完全に置き換わるようなものは現状では現れていません。関数型言語がそうなるかというと、多くのプログラマにとってはとっつきにくいのですよね(僕も苦手です)。オブジェクト指向はなんやかんやで人間の本来の認識に近いとは思います。道教思想が古代において受け入れられたのも同じような感覚があったからではないかとも思います。仮にポストオブジェクト指向が登場するとしたら、もしかすると東洋思想の中に似たものが既にあるのかもしれませんね。■AI時代のプログラミング言語ただ、個人的にはオブジェクト指向の次はなく、異なるパラダイムシフトが起きると思うのですよね。いいますか、もう起きているといいますか。それはAIによるものなのですが、現時点でも自然言語でこれこれこういう関数を書いてってAIに投げたらコードを書いてくれるわけですが、今は人間:AIの比率が80:20だったり70:30ぐらいかもしれませんが、これがすぐに20:80になってくるのは確実だと思います。なると、プログラマが設計してAIがコードを書くというスタイルからさらに進み、AIがプログラム全部を先に作ってしまって、プログラマが一部を書き替えるといった主従が反転することになります。そこで扱われるプログラミング言語として何が最適なのかと考えると、それは別にオブジェクト指向であってもなくてもどちらでもいいのですよね。言語とはコミュニケーションするための相互インターフェイスなのですが、お互いのうち知性が低い方に合わせる必要があります。人間と犬がコミュニケーションするとき、人間は「お手」「おかわり」など限られた単語だけで指示します。AIが今後、人間と同等か部分的には上回る知性を持ったとき、人間の知性に合わせてくることになります。プログラマならオブジェクト指向言語のソースコードを提示してもらって、それに対してここはこう書き替えて欲しいとかAIに指示するようなコミュニケーションを取るのが正確で早そうですが、非プログラマならScratchのようなビジュアルプログラミング言語でもいいですし、数学者相手なら数式の方がわかりやすいかもしれません。いや、もはやプログラミング言語である必要はなく、自然言語だけでもいいし、絵文字が含まれていたり、それが2次元上に表現されていなくても3次元でもよく、静止画でなくても動画でもよく、そしてその言語の文法は一人一人に合わせたものでよく、人間同士のコミュニケーションには使われないものになっているかもしれません。人間とAI間の言語はそうなるとして、ではAIとOSだったりハードウェア間の言語はどうなるかというと、基本的には機械語そのものではありますが、人間が読みやすいようにとは考えられず速度だけを優先したアプトプットになると思います。量子コンピュータ向けのプログラミングは人間のプログラマには難しいという声も聞きますが、AIはより量子コンピュータのハードウェアに近いコードを生成し、それはもう人間には難読なモノになってしまいそうです。■AI時代のソフトウェア開発AIがプログラマの仕事を奪うのかという議論はよく聞きますが、今のようなプログラマが全部設計してコードを書いてデバッグしてという仕事はなくなっていくのだと思います。AI主体のソフトウェア開発になれば、今よりもより大規模なソフトを少人数で、もっといえば1人で作れるようになります。大規模オープンワールドゲームも1人で3Dモデルなどの素材含めてすべて作れるようになるでしょうが、それでもそれを面白いゲームとして成立させるために、AIに対して指示出しする必要があり、ゲームロジックなど論理的な部分をきめ細かく指定することにはなりそうです。結局、AIは人間の感情を理解したり模倣できたとしても、AI自身は感情を持たないので、そこは人間の仕事として残るのだと思います。生命体ならすべからく持つ恐怖心(死に対する恐怖)は持たないというか持てないですしね。■まとめ話があっちこっちに飛んでまとまりがなく、まとめにくいのですが(笑)、まあ人類がこれまで積み重ねてきた知識体系やらなんやらをAIがすべて吸収し、新しい世界に突入するのを目の当たりに出来る時代に生まれてラッキーだったなぁーと思う次第であります。Studioでキャラクターモデルを作成し、撮影機能で画像を作成出来るのですが、背景画像の用意に困ったり、ポーズをもっと細かく調整したい場合があります。そこでUnityを利用して撮影してみようと思います。Animation」というアセットは46ドルと有料になります。Hub」を起動し、右上の「新規作成ボタン」の右にある「▼ボタン」をクリックして「2019.2.12f1」をクリックします。テンプレートが「3D」になっていることを確認し、「プロジェクト名」に適当な名前を設定します。ここでは「VRMShot」とします。最後に右下の「作成」ボタンをクリックします。Unityが起動し、以下のようなウィンドウが表示されたと思います。Storeタブをクリックします。Storeをクリックします。#6」と入力して検索します。#6」をクリックし移った画面で「ダウンロード」ボタンをクリックします。ダウンロードが完了したらそのボタンが「インポート」ボタンに変わっているので、それをクリックします。Package」ウィンドウが表示されますので、右下の「Import」ボタンをクリックします。待つと、ProjectタブのAssetsフォルダの下に「OutPost」フォルダが作成されているかと思います。それからSceneタブをクリックして元の画面に戻し、先ほどのOutPostフォルダの中のResources→Scenesフォルダをたどっていくと「NYC_block_6.unity」ファイルがありますので、それをダブルクリックします。Controller」をダブルクリックすると、ビルの一部が見えると思います。Controller」の上で右クリックしてDeleteをクリックして削除します。1つ「Environment」の中の「L_sun」をクリックし、Inspectorタブに表示される「Camera」コンポーネントのチェックマークを外します。ここでセーブをしておきましょう。最上部のウィンドウメニューからFile→Saveをクリックして下さい。■UniVRMのインストールhttps://github.com/vrm-c/UniVRM/releases上記のサイトから最新版のUniVRMをダウンロードします。2019/11/19時点ではv0.53.0が最新版です。下にある「UniVRM-0.53.0_6b07.unitypackage」をクリックしてダウンロードします。ダウンロードが終わったら、先ほどのUnityが起動している状態でダウンロードファイルをダブルクリックします。Package」の子ウィンドウが表示されますので、右下の「Import」ボタンをクリックします。待つと、ProjectタブのAssetsフォルダの下に「VRM」フォルダが作成されているかと思います。インストールはこれで成功です。■VRMファイルの読み込みVRoidStudioなどで作成したVRMファイルをUnityに読み込ませます。ProjectタブのAssetsフォルダの中で右クリックし、Create→Folderをクリックします。フォルダ名はここではひとまず「Chara」とします。「Chara」フォルダをダブルクリックして中に入ります。この段階では中身は空っぽです。そこに、VRMファイルをドラッグ&ドロップします。ここでは「Mocuko.vrm」ファイルをドラッグ&ドロップします。待つと「Chara」フォルダの中に「Mocuko.prefab」ファイルといくつかのフォルダやファイルが作成されたかと思います。■VRMモデルの配置その「Mocuko.prefab」をHierarchyタブの下の空いている辺りにドラッグ&ドロップします。すると、「NYC_Block_6」の中に「Mocuko」が追加されているのが確認できると思います。ビル群からだいぶ離れた箇所に配置されているので、良い感じの場所に移動します。頭と足元の2カ所に矢印が表示されていると思いますが、足元の方をドラッグして移動させます。ここでセーブをしておきましょう。最上部のウィンドウメニューからFile→Saveをクリックして下さい。次にカメラを設置します。Hierarchyタブのすぐ下にある「Create」ボタンをクリックし、「Camera」をクリックします。これも移動と回転をおこなって良い感じの場所に移動します。View」の数字も小さく調整しています。ここでGameタブをクリックします。表示されていなければウィンドウメニューのWindow→General→Gameをクリックすると表示されます。Aspect」と書かれているボタンをクリックし、一番下の「+」ボタンをクリックし、「Label」に「1920x1080」と書き、「Width&Height」をそれぞれ「1920」「1080」と半角数字で入力し「OK」ボタンを押します。これを最終的なレンダリング解像度とします。大きな数値を設定しても構いません。Managerをクリックします。packages」をクリックします。その右側にあるテキストボックスに「Recorder」と入力します。Recorder」の2つが表示されると思いますが、後者をクリックし、右下の「Install」ボタンをクリックします。インストールが終わったらそのボタンが「Remove」という名前に変わっていると思いますので、右上の「×」ボタンをクリックしてPackagesウィンドウを閉じます。Windowをクリックします。Recorderタブが表示されるので、そのタブを画面下のProjectタブがある場所にドッキングさせます。Sequence」をクリックします。1080p」に変更します。Frame」に変更します。RECORDING」ボタンをクリックします。すると、プロジェクトフォルダの下に「Recordings」フォルダが作成され、その中に「image_0000.png」という画像ファイルが作成されたと思います。RECORDING」ボタンをクリックすると画像ファイルが上書きされてしまいますので、次に撮影する場合は「Frame」の右側の「0」と書いているところを「1」に変更します。その後は数値を1つずつ増やしていくといいでしょう。再生ボタンをクリックして元の画面に戻します。Animation」を検索します。2019/11/19現在では46ドルですが、たまにセールなどがおこなわれていたりします。これを購入し「インポート」ボタンをクリックします。Splitに変更します。Tab」をクリックして削除します。ウィンドウメニューのWindow→General→GameをクリックしGameタブを表示し、左上のSceneの横にドッキングし、元のSceneタブを削除します。Animation→Mainをクリックし、Inspecterタブの右側にドッキングさせます。Window→Animation→Animationをクリックし、Projectタブの右側にドッキングさせます。最終的にこのようになったかと思いますが、マルチディスプレイ環境など好みで調整してもらっても問題ありません。Scene,VeryAnimation,Animationタブは同時に表示されるようにしておく必要があります。Animation」と入力して保存しておきます。Controllerをクリックします。Controller」をドラッグ&ドロップして設定します。AnimationタブとAnimationタブをクリックします。Animationタブの右側の「Create」ボタンをクリックします。先ほど作成した「Anim」フォルダを選択し保存します。Animation」ボタンをクリックします。Editorウィンドウの「Prefab」ボタンをクリックします。これでいわゆるTポーズに戻ったと思います。次にHierarchyタブに切り替え、キャラクターをダブルクリックすると、Sceneタブの中央にキャラクターが表示されたと思います。Controlタブをクリックして元に戻します。Controlタブの例えば首の丸マークをクリックして選択状態にすると、Sceneタブで首を中心に円が3つ表示されるので、そのどれかをドラッグすると回転します。Controlタブの人型以外の箇所をクリックすると選択が解除されます。両手足のIKと書かれているところのチェックマークをオンにすると、その箇所のみ回転ではなく移動で調整することが出来ます。位置を調整したあとチェックマークを外すことで、各関節の回転調整をおこなえます。両足のIKのチェックマークをオンにした状態で、足元の楕円を選択状態にして上向き矢印を下に移動させると腰を落としたり出来ます。Out」から調整出来ます。Shape」の「Face」の中になります。名前が長くて分かりづらいですが「BRW」が「眉毛」、「EYE」が「目」、「MTH」が「口」を意味しています。EditorでIKチェックマークを全て外し、何も選択されていない状態にします。それからAnimationタブをクリックし、60フレーム目(1:00)の一番上の菱形をクリックして縦列が全選択された状態になったことを確認しDeleteキーを押して削除します。Editorウィンドウの右上の「X」ボタンをクリックして終了します。UponもOriginalに変更します。この状態で実行してGameタブ内でポージングされていれば成功です。■ポージング状態で撮影するWindow→Layouts→Defaultをクリックして元のウィンドウレイアウトに戻します。HierarchyタブのキャラクターをダブルクリックすればSceneタブ内の中央にキャラクターが表示されると思います。一度Recorderタブを表示してから実行して撮影してみます。■まとめひとまず最低限はこれで完了ですが、ライティング等の設定を調整していくことで、よりイメージに近い絵を作れるかと思います。BOOTHにて公開されているものを利用させて頂きました。SHOWROOM配信が1週間ほどお休みだったので、気がついたらゲームOP風ファンアート動画を作ってた。10:37星井まゆきさんのゲームOP風ファンアート動画を作ったのですが、その作り方を簡単に解説したいと思います。以前、星井まゆきさんがSHOWROOM配信中に「自分のファンアートを作ってくれたら嬉しい」といった内容のことを話されていたのですが、僕の絵画能力は幼稚園児の頃から成長していなくて絵が描けないですし(笑)、何が作れるかなぁと考えた結果が動画作成でした。絵心にあまり自信がない方でも、トライ&エラーを繰り返すことで同様のものが作れるのではないかと思います。Studioという無料のアプリなのですが、最初から用意されている3Dモデルをカスタマイズしていく形で目的とするキャラクターを作っていくことが出来ます。それでもなかなか思い通りに作っていくのは難しいのですが、少し調整しては別名保存してスクリーンショットを撮っておき、前回からイメージがズレているなと思ったら1つ前のプロジェクトファイルに戻してやり直すのを繰り返していけば、ゴールに近づいていくかと思います。服装などはテクスチャを差し替える方法になりますので、既存モデルから大きく異なるものは作ることが出来ません。まゆき星空通販この衣装テクスチャを利用しています。完成したら後述するUnityで読み込ませるために、VRMというファイルフォーマットでエクスポートします。■UnityUnity元々はゲーム開発のためのゲームエンジンなのですが、今では映像制作や建築設計、VRアプリ開発などにも用いられているツールです。今回はこれを映像制作のメインツールとして使用します。■UniVRMUniVRMUnity上にVRMファイルを3Dモデルとして読み込むためのアセットで、上記サイトで無料公開されており、インポート方法などの解説が載っています。■UTS2.0VRMのモデルをそのまま表示しても構わないのですが、アニメ調に調整するのに便利なので、ユニティちゃんトゥーンシェーダー2.0のアセットを利用しています。Animationを利用しました。Unity上でモーション作成・編集がおこなえ、また開発者が日本の方なので、詳しい日本語マニュアルも付いています。■モーションキャプチャ「自販機」と「ダンス」のシーンのモーションだけは手付けではリアルな感じが出せないので、自作のモーションキャプチャシステムを使用しました。Tracker×3を使用し、Trackerは腰と両足に使用しています。モーションキャプチャシステムの作り方を解説し始めると膨大になりますので、ここでは省略させて頂きます。Animationでカットしたり、手のポーズや表情アニメーションを追加したりしています。■背景や小物の3DモデルUnityアセットストアには、背景や小物に使える3Dモデルが有料無料で公開されています。Particleなどを使用しています。■シーン作成1つ1つのシーンごとは、Unityのタイムラインという機能を使って作成しています。カメラの移動回転などのカメラワークのために使用しています。Recorderこのアセットを使用して、シーンごとに連番PNGとして出力します。mp4などで直接動画ファイルを出力することも可能なのですが、後述する動画編集ソフトで再圧縮がかかると画質が落ちますので、劣化しないPNGで出力します。それを、AviUtlで、読み込んで無圧縮AVIファイルに変換します。Production】を、使用させて頂きました。■ボクセルモデル一部のシーンで登場するボクセルキャラクターモデルは、MagicaVoxelこちらの無料ソフトで作成し、OBJフォーマットでエクスポートします。出力するとobj,mtl,png形式の3つのファイルが作成されますので、それをまとめてUnityに読み込みます。いらすとやを、使用して作成しました。文字は1文字ずつ拡大変形させて多少ずらして並べると、それっぽくなります。■動画編集ソフトシーンごとに出力した動画は、filmoraこのソフトで編集していきます。無料版もあるのですがfilmoraのロゴ透かしが入るため、有料版を購入します。クーポン」などでググるといいでしょう。■動画編集filmora上でBGMやAVIファイルを読み込み、並べていきます。各シーンのつながりには「トランジション」を設定していき、シーンごとの色味やフィルタは「エフェクト」から設定していきます。filmoraは「70年代」とか「VHSのゆがみ」といったエモいエフェクトが多くて最高です(笑)。最後はこのアプリからMPEG4ファイルで出力して完成です。■さいごにこの完成した動画は、さっそく星井まゆきさん本人に見て頂けたのですが、喜んで頂けたようで幸いです。こちらこそいつも楽しそうにお喋りする配信を見られて幸せです。ありがとうございます。2.0Seesaaブログ。