二日前の投稿、「もみの木🌲?試作」ですが、どんな考え方で立体の形を生成するのか、ざっくりと説明してみたのが上の図です。
CGを生成するプログラムにもいくつか手法がありますが、今回使っているソフトmagicavoxelのプログラミングでは「距離関数」という考え方で作っていきます。
「この点からこの距離の内(外でもいいのですが)に入っている部分がモノがある領域」
という感じで「この距離」という部分を関数式で書いていきます。
プログラミング
またサイコロ3DCGのソフトmagicavoxelでプログラミングを試みています。shaderと呼ばれるプログラムを書いて3Dのモデルを生成するのですが、今は木を作ろうとしています。木と一言でいっても、いろいろな樹形があり、一個のプログラムで全部できるというのはかなり難しいのですが、とりあえず”もみの木”のような芯の幹が一本真ん中に貫いていて、樹形は三角形になるような木を作ってみました。
上の画像の左右の木のように、パラメーターを調整することで葉の付き方は色々変えられます。
まだちょっとイメージ通りの木にならないので、改良の余地がある。
以前も雪のかぶったモミの木を作ったことがあるのですが、この時はチクチクと手で作っていました。今回はプログラムで作るので結構違って、何よりパラメーターをいじる事でいろんな形を作れるというのが大きい。
こちらは前に作ったやつです↓。
このところ3DCGアプリmagicavoxelの制作の投稿が多いですが、また作ったのでアップします。プログラム(shaderという)を使って立体の形を作るということに少しずつ慣れてきて「あんなのも作れるかも」というのが楽しくなってきました。
今回作ったのは、僕が好きな植物”ヤツデの実”の形をイメージした架空の植物です。先端の実の部分は透明のマテリアルにしてガラスとか氷のようにしました。これによって幻想的で面白くなったと思います。
ライティングは黒背景で露出もギリギリまで抑え、氷のキラキラが効果的に出るようにしました。
このmagicavoxelというアプリはサイコロを積んで立体を作るものなので、基本的に細かく見るとサイコロの粒々が出てしまうのですが、今回の氷の粒に見立てた部分は氷の表面なので、ギザギザがあっても違和感がなくてリアルな出来映えになった。
作成画面はこんな感じです↓
先端の実の部分の大きさや、実の数、中心部分の「花柄(かへい)」の太さ、後ろにあるピンクのやつのような感じに開き具合の調整、などなどをパラメーターで変えることができます。
いつも使っている3DCGのソフトMagicaVoxelですが、サイコロを積み木のように積み上げて立体物を作るというものです。基本チクチク手で積み上げていくのですが、滑らかな有機的な曲線などは手では限界があります。その場合、簡単なプログラム(shader:シェーダーと呼ぶ)を書いて、それをソフトの中で実行することで色んな数学的な曲線を持つ立体を作ることができるのです。
今回作ってみたのが「山がいくつか連結した連峰のようなもの」。実際に使っている動画もTwitterの方に投稿したので、それを貼ってみます。
#magicavoxel で山を生成する #shader を作りました。自動でいろんな山々を生成します。個々の山の稜線は正規分布曲線にしています。@mode_visさんの3D_Metaballs https://t.co/2ywblh4N9x を参考にさせていただきました。ありがとう! pic.twitter.com/b18DlBtkdI
— 斉藤重之 (@shigenokura) 2024年9月9日
書いてある通り、プログラムのベース部分は@mode_visという方が公開していたものを参考にさせていただきました。
シェーダーはglslというプログラム言語で書きます。割と短いプログラムでできるので、思ったよりも難しくはありません。記述にミスがあってもいわゆる暴走するなんてことはほとんどなく最初から動かないだけで怖くない。今回は参考にさせていただいた元のプログラムの中の「球体を作れ」という部分を「正規分布曲線の山を作れ」という式に変えたのですが、ホントに割とすんなり成功した。
そもそも(理想上の)山の形がどのような式で表されるのか?という疑問があったのですが、知っている中で山型の曲線といえば正規分布ぐらいしか思いつきません。
そこで一応AI(ChatGPT)に聴いてみると・・・
山の形状は
- Bagnoldのプロフィール
- ロジスティック関数
- ガウス分布
などの形状でモデル化されることがあります。
ということです。3つ目の「ガウス分布」というのが正規分布のことなので「大丈夫だ!」と採用しました。
今のところ、作った画像(一番上の画像)は色味を白っぽくして山水画の雰囲気にしています。
プログラムを組んでいるとたまにこの1970年1月1日が出てくることがあります。時刻の変数に何かの拍子でゼロが入った時にこれが出てくるんだなーというのはなんとなく理解していたのですが、よく考えたらなぜゼロが1970年になっているのか?
これはUnixTimeというもので、コンピュータのOSーUnixで時間を扱う形式です。1970年の1月1日0時0分0秒(Unixエポックというらしい)を0として、1秒ごとの累積ということになっています。今日の今(投稿のちょっと前3月12日PM12:00)のUnixTimeは
それで、なぜ1970年かということですが、これといった特別な理由はないようです。UnixOSが広まったのがこの頃で、ちょうど切りのいいところをゼロにしたかったという感じらしい。ちなみにそれより前の時刻もマイナスを使って表せばよいので、僕が生まれたUnixエポックの1カ月ちょっと前(1969年11月末)も-3300000(日本時間)とかで表せる。
ちなみにちなみに、エクセルでは日付形式に「0」を入れると「1900年1月0日」になるんですね。