忍者ブログ

カレンダー

04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

最新コメント

[11/20 かいせい]
[11/18 NONAME]
[10/01 かいせい]
[10/01 masafumi]
[09/28 なんとなく]

最新トラックバック

プロフィール

HN:
Kaisei+
性別:
男性

バーコード

ブログ内検索

カウンター

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

インナースケルトンの計算をしてみた

bunny_pointset.pngbunny_innerskeleton_pointset.png
点群モデルから,点群の内側にあるスケルトンを計算してみました.
この昔は気付かなかったことが今では気付けるようになっているので,今後が楽しみです.
PR

いやー,まいっちんぐ

最近,大変忙しいので,更新するためのネタをコーディングすることもできないす.
なんだかんだで,結構まともに仕事しているんですよ.

仕事で開発していて思うことは,開発の時間が意外と取りにくいということ.打ち合わせや会議が多いんだね.
何をするにも仰々しい許可が必要だし.
なんだかなー.
責任を分散するための処理が無駄に多いような.

最近はレンダラーを書いてます.趣味でね.

まいっちんぐマチコ先生
http://jp.youtube.com/watch?v=5h-uFGHrgsQ
メガネ君の「ボインですね」が心にしみる

ボクセル(Voxel) 内外判定でできる演算

ボクセルは内外を定義するだけで,任意の形状を定義することができます.
この性質を利用して,ボリュームデータの形状の操作を行ってみようと思います.

まずは前回の肉のついた螺旋を真ん中でばっすり切ってみます.
ボリュームデータなので中身が詰まっています.

voxel_voxel_cut.pngvoxel_03voxel_cut.pngvoxel_06voxel_cut.png

これは,任意のボクセルを内側と定義した後に,手前半分を外とすることでものを切っています.
内外だけで,もの形状を定義しているので,内外だけで操作できることがわかります.
この形状操作を利用して,任意の形状から,別の任意の形状を削りとるような操作もできます.

voxel_voxel_cut_r.png voxel_03voxel_cut_r.png voxel_06voxel_cut_r.png voxel_15voxel_cut_r.png

上の図は,でっかい立方体から,螺旋状に削り取るような操作を行った結果です.
削り取る操作は,一般的にCSG(Constructive Solid Geometry)やブール演算(boolean)と呼ばれる操作のひとつです.
CSGやブール演算と呼ばれる操作は3つあり,それぞれ「和(union)」「差(difference)」「積(intersection)」と呼ばれています.それぞれ二つの形状を足し合わせた形状,一方からもう一方を差し引いた形状,二つの重なった部分の形状を意味します.
今回の図は差を表現しています.
内側のボクセルの集合Aから内側のボクセルの集合Bを引くという処理を行います.
差を式で表せば,A - B です.
同様に,和と積は,内側の集合Aと内側の集合Bを足す処理,集合Aと集合Bがどちらもが内側の部分を取り出す処理を行います.
和を式で表せば,A ∪ B,積はA ∩ Bとなります.
まぁ,簡単にこのような操作が行えるのがボリュームデータの魅力のひとつですかね.

ボクセル(Voxel) 導入

ボクセル(Voxel)とは三次元のボリュームデータを扱うための最小単位で,画像でいうところのピクセル(Pixel,画素)にあたるものです.

大概どんなにものでも表面の内側に中身が詰まっている.
かわいいあの娘にも,ちゃんと中身がある.
ペラペラの面で構成されているわけではない,ちゃんと脳も筋肉も臓器もあるはず.
別に女だけじゃなくて,身の周りの家の壁や,板なんでも中身がある.
CGで体積があるもの,中身が詰まっているものを扱う時に,面しか定義されていなかったら,不自由極まりない.というか,面しか定義されていないのに,中身を扱えるわけがない.
たとえば,表面だけの大根を切っても,切り口はペラペラの面だけで,中身がないわけだ.これは現実離れしている.
たぶん,そういうのを問題に思った輩が,ボリュームデータを考えたんだと思う.
そういうボリュームデータを扱う方法の一つがボクセルです.

3次元空間内に,ボクセルと呼ばれる空間の要素が敷き詰まっていて,その要素で「もの」を定義します.
ボクセルの表現として,小さな立方体を格子状に敷き詰める方法があります.
他にも8面体や12面体などを敷き詰める方法もあるようですが,考えるのが面倒なのと実装が面倒なので,ボクは立方体を格子状に並べればいいんじゃないのって思っています.

ですから,立方体を格子状に並べて,ものを定義してみます.
xyzの三次元にボクセルを敷き詰めて,内側/外側の2値で形を定義してみようと思います.
内側というは中身,外側というはその「もの」の内側ではないということです.

何の形が表現に好ましいのかわからないので,とりあえず螺旋を作ってみました.
螺旋の媒介変数tを用いた関数は以下です.
x = a cos(t)
y = a sin(t)
z = b t
aとbはそれぞれ係数です.
螺旋の関数で,螺旋上のボクセルを内側とします.
voxel_voxel.png

うん,格子状のボクセルで,螺旋が表現されている.
せっかくだから,この螺旋を太らせてみよう.
螺旋に該当したボクセルからある距離内もボクセルを内側と定義してみよう.

voxel_03voxel.png

太った.もう少し太らすと.

voxel_06voxel.png

太った太った.
しかし,古い論文に出てそうなライティングしているなぁ.
まぁこういう古典的な色が好きなんですよ.

とにかく,格子状のボクセルを内外を定義するだけで形を作れるというです.
こうやって,形状を定義すると,切っても中身があるように見えるのだ.(次回,やってみるわ)
ただ見ての通り,立方体の格子だと,見た目がひどい.
まぁこれは立方体が大きいというのが問題のひとつかもしれないが,小さくしようとすると,それに依存してデータ量が膨大になるので,私のようなヘッポコなコンピュータしか使わない人には,難しい問題ですね.

40年ぶり

「40年ぶり!!」
雨の中,帰宅するために妙なテンションで歩いていたら,前方からさらに変なテンションのおっさんが歩いてくる.
突然,40年ぶり,と声をかけられました.
思わず,「よぉ,40年ぶりやな」,とか言っている自分がいましたけど,ボクは30年も生きていません.
不思議なことも起こるものです.