2014年06月

2014年06月30日

modo801の新機能を調べてみた その16 modo801

前回やった「Raycast」ノードでロケータの回転を使ってRayの方向を変更する事をやってみたけどあれをもうちょっと進めてロケータの位置と向きの両方を反映させる方法をやってみたい。

fig01

ワールド座標原点で法線がY軸方向を向いている平面に「Raycast」を仕込んだマテリアルが設定されていて、「Raycst」の「HitColor」が「Material」の「DiffuseColor」に接続されている場合、平面の真上にあるオブジェクトが平面のディフューズマップとして現れるのは前回やった。これをロケータから見た画像マップにするためには、Rayが発射される平面上の全ての点をロケータ位置に移動させ、

fig02

その点の位置とRayの向きをロケータにあわせて回転させる必要がある。

fig03

つまりRayを発射するポイントの集まりを平面とするならその平面が下の画像のような感じに移動回転される必要があるわけだ。

fig04

平面上のRayを発射するすべての位置は「ShaderInputs」ノードの「World Position」から提供されるので、その位置をロケータの位置に持ってくるには、「World Position」の座標値にロケータの座標値を加算してやればいい。

まずスケマティックビューにロケータアイテムを追加して、ノードを右クリックして「Add Channel」から「World Position」を選んでノードにチャンネルを追加する。このチャンネルの出力は4X4のマトリクス(移動・回転・スケールを1つの行列であらわす同次座標変換行列ってやつだね)なので座標値ベクトルに直すために「MatrixVector」ノード(「Channel Modifier」→「Matrix」→「Matrix Vector」)を追加して「World Position」から「Matrix Input」に接続する。そして「Matrix Vector」のプロパティで「Row」プロパティを「Translation」に、「Normalize」をOFFにして、マトリクスから位置ベクトルを抽出する設定にする。さらに「Vector Maths:Add」ノード(「Channel Modifier」→「Vector」→「Vector Maths:Add」)を追加し、「Vector A」、「Vector B」の入力に上記「Matrix Vector」の「Output」と「Shader Inputs」の「World Position」を接続して加算し、それを「aycast」の「Origin」に入力する。

fig05

これでロケータで「Raycast」がRayを発射する位置がコントロール出来るようになった。下のGIFアニメはその様子で、ロケータの位置から上を見た映像が平面に描写されているのが見て取れる。

fig06

さらにロケータに「World Rotation」チャンネルを追加し、これも「Matrix Vector」で「Row」プロパティを「Y」、「Normalize」をONにしてY軸の方向ベクトルを抽出して、それを「Raycast」の「Direction」ソケットに繋ぐ。

fig07

これでロケータの回転にあわせてRayの方向も制御できるようになった。

fig08

ただしRayの発射位置は平行移動するだけなので、このままだとRayno角度を変えて行くと下の画像のように投影される画像も間延びしてしまう。

fig09

そこで今度はRayの発射ポイントの位置を回転移動させるようにする。

ロケータの「World Rotation」はロケータの回転変換の行列になっているので、「Shader Inputs」からの位置座標にこれをかけあわせれば各Rayの発射ポイントをワールド座標原点を中心に回転移動できる。

行列の掛け算は「Matrix Compose」ノード(「Channel Modifier」→「Matrix」→「Matrix Compose」)で出来る。ただ、気をつけなきゃならないのは行列の掛け算は交換法則が成り立たない事だ。AXBとBXAでは結果が異なってしまうので、「Matrix Compose」を使う時はその順番に気をつけなきゃならない。しかもその掛け算の順番を決める方法がコネクタにリンクする順番で決まってしまい、見た目ではどういう順番にかけ合わせられているのかわからない。今回の座標回転の場合、座標をまず「Matrix Compose」にリンクしてから回転行列「World Rotation」をリンクする必要がある。

さらに、ロケータの「World Position」マトリクスは原点にあるポイントをロケータの位置に移動させる移動変換の行列でもあるので、これを座標値にかけることは、座標値にロケータの座標値を加算するのと同じ意味になる。だから上の例でやったベクトルに変換して加算みたいな事をやらなくても「Matrix Compose」で一緒に変換することが出来る。

順番としては、原点にあるポイントを「Shader Inputs」からの移動変換行列でRayを発射するポイントに移動させ、それをロケータの「World Rotation」行列で原点を中心に回転変換し、最後にロケータの「World Position」行列でロケータ位置に移動変換するという順番になる。「Matrix Compose」へのリンクはこの順番で行う。「ShaderInputs」の「World Position」はベクトルなのでマトリクスに変換する必要があるので「Matrix Construct」ノード(「Channel Modifier」→「Matrix」→「Matrix Construct」)を使って「Matrix Type」プロパティを「Position」にして変換している。

下の画像が「Matrix Compose」を組み込んだもの(クリックすると大きくなるよ)。

fig10

そしてこれがその結果。Rayの発射位置がロケータの回転にあわせて回転移動したので平面に投影される画像も歪まなくなった。

fig11

でもまだこれじゃ充分じゃないけどね。長くなったので続きはまた次回。

modo801ブログ目次



take_z_ultima at 11:30|この記事のURLComments(0)TrackBack(0)modo | CG

2014年06月27日

2015の新機能を調べてみた その18 3dsmax 2015

前回に引き続き「ShaderFX」について調べてみたい。

前回の「V」マークの話でだいぶ「Graph Nodes」カテゴリのノードの事がわかってきたので今回はその話。

「ツール」→「詳細モードを切り替え」で「詳細モード」に切り替えると、下のように「Graph Nodes」メニューが出てくる。

fig01

ここにはグラフノードの構造自体を構築するのに役立つノードがいろいろ入っているようで、ノードの構造はコードをどう出力するかってことになってくるわけだ。

上から見て行くと、まず論理演算用のノードが3つある。

fig02

「AND」ノードは論理積で「A」、「B」2つの入力がTrueの時だけ「bool」出力がTrueになり「A」、「B」どちらか1つでもFalseになればFalseになる。「Not bool」出力はその逆の値が出る。

「NOT」ノードは否定で「A」入力の値が反転して「bool」出力に出る。「A」がTrueなら「bool」はFalse、「A」がFalseなら「bool」はTrueになる。

「OR」ノードは論理和で、「A」、「B」2つの入力のうちどちらか一方でもTrueなら「bool」出力はTrueになり、「A」、「B」が両方ともFalseに時だけ「bool」出力はFalseになる。「Not bool」はその逆の値が出る。

いずれも入力も出力も「V」がついてるからコード化前に値が確定して無いとならない。この論理演算自体はコードとして出力されず、論理演算の結果得られるノード構造がコード化するわけだね。

「Default Value」は既定値を導入するための仕組みで、「Result」出力は「Alternate」が接続されていれば必ずその入力値が出力され、接続されていなければ「Default」の入力値を使う。

fig03

だから「Default」入力に既定値としたいものを必ず繋ぐ必要がある。

例えば下のように「Color」ノードで赤を作ってそれを「Default」に繋げて、グループの入力側を「Alternate」に、「Result」をグループの出力に繋いだグループを作った場合、

fig04

このグループを「Diffuse Color」に繋いで見ると赤色になり、

fig05

「Color」入力に「Texture Map」を繋ぐと「Diffuse Color」がテクスチャマップの画像になる。

fig06

このグループはコード出力される時に消えて、「Color」入力が繋がっていない状態なら赤色の「Color」ノードが「Diffuse Color」に直接接続されているものとしてコード化される。「Color」入力に「TextureMap」が繋がっていればそれが「Diffuse Color」に直接接続されているものとしてコード化される事になる。

それではまた来週。

maxまとめページ



take_z_ultima at 11:30|この記事のURLComments(0)TrackBack(0)3ds Max | CG

2014年06月26日

FUJITSU ScanSnap S1500のパッド交換してみた

書籍を電子化して検索しやすくしようと思って買ったScanSnap S1500。だいぶ使い倒したせいか最近紙が詰まったりする事が増えてきた。タスクバーに隠れている「ScanSnap Manager」から「消耗品の管理」を選んで機械の状態を表示してみた。

fig01

パッドはとっくに耐久数を超えちゃってる。しかも倍w

ピックローラーにはもうちょっと活躍してもらうとして、パッドはさすがに交換しないとイカンだろうと思ったわけだ。

ちょっとわかず辛いけどフタをあけるとローラーとパッドは向かい合わせのところにあって、これらが紙を1枚ずつ取り出してスキャナに送り込んでくれるわけだ。

fig04

で、下が新しいやつと使い倒したものの比較。ウケから見てもヨレヨレだけど、

fig02

横から見たらこの減りようにびっくりw

ゴムの部分の厚みが殆どない。

fig03

これじゃさすがに機能しないわなw

てなわけで交換してみたらやはり効果てきめん。今までのストレスがウソのようにスイスイ読み込めるようになった。この際だからローラーも替えておくべきか・・・。



take_z_ultima at 18:58|この記事のURLComments(0)TrackBack(0)Goods 

modo801の新機能を調べてみた その15 modo801

前回に引き続き新機能「Nodal Shading」で使われるノードを調べてみたい。今回は「Raycast」ノード。

fig02

これは「Origin」座標から「Direction」方向にRayを飛ばしてその先にあるエレメントから以下の値を取得して出力するノードのようだ。

  • Hit Distance:エレメントまでの距離
  • Hit Position:Rayとエレメントの交点位置
  • Hit Normal:Hit Positionでのエレメントの法線
  • Hit Color:Hit Positionでのエレメントの色
  • Hit Opacity:Hit Positionでのエレメントの不透明度

このノードもスケマティックビューに呼び出すと自動的に「Shader Inputs」が付いてきて、シェーディングする各ピクセルごとに個別に処理が出来るようになっている。

fig01

例えば下の画像のように平面と球体があって、それぞれ別のマテリアルが設定されている場合、

fig04

平面の方のマテリアルの「Diffuse Color」に下の画像のように「Raycast」の「Hit Color」を接続すると、

fig05

平面の「Diffuse Color」は下の画像のように色がマッピングされる。

fig06

これは各ピクセルの位置から法線方向にRayが飛んで、ヒットした先の色をそのピクセルの色にしているわけだ。

fig07

このノードのプロパティは以下の通り。

fig03

Rayを飛ばす距離は「Far Clip」で制限する事が出来て、この値が0の場合は制限無くRayが飛ぶ。

Rayが衝突判定をするエレメントは5つのスイッチで切り替えが出来る。

  • Include Polygons:ポリゴン表面を含む
  • Include Volumetrics:「Blobs」や「Volumes」、「Sprites」などのヴォリューメトリクスを含む
  • Include Environment:環境を含む。何もヒットしなかった時に無限遠で環境がヒットする。
  • Include Back Face:ポリゴンの裏面を含む
  • Limit to Same Surface:同じメッシュレイヤ内の同じマテリアルに限定する

「Limit to Same Surface」はマニュアルにはこう書いてあって、

Limit to Same Surface: This toggle limits the sample made by the Raycast node to the same surface the ray is cast from (adjoining surfaces would be ignored, per surface of course).

Rayを飛ばしているサーフェスに繋がっているサーフェスや同じサーフェスは無視させるスイッチのように受け取れるんだけど、実際やってみるとサンプリングできるのは同じメッシュレイヤ内で同じRayを飛ばしているサーフェスのみとなってしまった。

例えば前出の例で平面のマテリアルに仕込んだ「Raycast」で「Limit to Same Surface」をONにするとこのように平面の「Diffuse Color」は球体を無視して環境の色になってしまう。

fig08

球体を平面と同じマテリアルにしてもダメで、

fig09

球体自体を平面と同じメッシュレイヤに移したら互いにヒットしあって合わせ鏡のようになった。

fig10

繋がったサーフェスではどうかと言うと、下の画像は「Limit to Same Surface」をOFFにした場合。向かい合っている面どうしヒットしあっているし、他のサーフェスもヒットしている。

fig11

「Limit to Same Surface」をONにすると他のサーフェスはヒットしなくなり、向かい合った面のみヒットするようになった。

fig12

マニュアルを読んだ感じじゃ恐らくこの機能は合わせ鏡みたいになったり自分の影が出たりするのを防いだりする機能としてあると思うんだけど、実装はその逆になっちゃってる気がする。

また、飛ばすRayのタイプによってヒットしたエレメントからサンプリングする要素を変更できる。

  • Shading:ヒットした位置のDiffuse、Specular、Reflection、illuminationがサンプリングされる
  • Shadow:Rayがヒットするかどうかがサンプリングされる
  • Material:Diffuse Colorのみがサンプリングされる
  • Normal:ヒットした位置の法線(バンプマップやノーマルマップ、ディスプレースメントなどの影響も含む)がサンプリングされる。

「Raycast」ノードには「Hit Position」とか「Hit Distance」とかあるのでこれでロケータを動かしたり出来ないかと思って試してみたんだけど、どうやら「Raycast」が実行されて値が取得出来るのがロケータなどの位置が確定した後らしく、作用させる事が出来なかった。だからここから作用させられるのはシェーダー系のチャンネルだけのようだ。

「Origin」や「Direction」入力は何も繋がないで直接値を設定する事も出来る。

fig13

またカーソルをあわせれば設定されている値が表示される。

fig14

また、位置や方向をロケータでコントロールするようなことも可能だ。下の画像はその例(クリックすると大きくなるよ)。

fig15

シーンにロケータを1つ追加して、そのロケータをスケマティックビューに追加し、そのスケマティックビュー上のロケータを右クリックして「Add Channel」で「World Position」と「World Rotation」を追加し、そこに「Matrix Vector」ノードを接続し、「World Position」と接続した「Matrix Vector」ノードと「Shader Inputs」の「World Position」を「Vector Maths:Add」ノードで加算してから「Origin」につなぐ。この時、「Matrix Vector」のプロパティで下のように設定する。

fig16

これで「World Position」行列から位置ベクトルが抽出できるわけだ。

同様に「World Rotation」からの方の「Matrix Vector」は「Direction」に繋ぎ、、「Matrix Vector」のプロパティで下のように設定する。これでロケータのY軸が向いている方向の単位ベクトルが取得出来る。

fig17

これが実際やってみたもの。

fig18

左下のロケータの緑色の線の方向にレイを飛ばした結果が平面に反映されている。この例ではワールド座標原点にある平面の上にあるピクセル座標にロケータの座標値を加算しただけで、平面が平行移動しているだけなので投影される球体が歪んでしまっている。正投影にするには平面の回転とかも組み込まないとダメだね。

それではまた次回。

modo801ブログ目次



take_z_ultima at 12:03|この記事のURLComments(0)TrackBack(0)modo | CG

2014年06月25日

3Dプリンター daVinci 1.0 を使ってみた その10

新品になって戻ってきたダビンチでさっそくおかしかった多角形のプリントをしてみた。下がその結果。左下から4、6、8、16、32、64角形で、外接円の半径が1cmのものだ。

fig01

おお、綺麗に出てるw

寸法を測ってみると64角形はほぼ直径2cmになってるし、正方形は1辺が1.41cmになっている。

側面は6角形、8角形、16角形の直線部分に多少のうねりがあるけど、64角形はなかなか滑らかな円周になっている感じだ。

fig02

こうなってみると、前の状態でよく使ってたなって感じだなwww

まあ縦と横の線はキチンと出てたんだけどね・・・。

さっそく水耕栽培用の苗を固定する器具をプリントし始めてみた。園芸用の支柱の固定器具とか作らなきゃいけないものがいろいろあるので、これからしっかり活躍してもらわないとね。



Archives