忍者ブログ
20080511~ 13と7と11の倍数の論理積は13と7と11の積の倍数である。 和ァ・・・
[2854] [2853] [2852] [2851] [2850] [2849] [2848] [2847] [2846] [2845] [2843]
久々に解説ブログです。こんにちは。


Excelの2Dグラフで3Dモデリングのワイヤーフレームみたいのをやってるんですが
ようやく遠近法がまともになりました。
ExcelファイルDLはこちら。

 
今までのおさらいも兼ねて、解説していきます。

まず、今回はわかりやすいように、図のように直方体のモデルを使用します。
このように、手前(マイナスz)・奥(プラスz)と下(マイナスy)・上(プラスy)の4面のデータを用意します。
ほんとうは6面なのですが、直方体なので、左右(±x)の2面は省略します。


また、余計な1次元を追加した4次元ワンセットのベクトルとします。
4次元目はitiという仮の項目をつけておきました。
基本的に値が1しか取らないからです。
なぜこのようなあんまり意味のない次元を設けるのかといいますと
平行移動も行列演算で一括して行えるようにするためです。
 
 
=======
伸縮・移動1
次に、縮尺・平行移動1のセルの解説に移ります。
左側に用意した4列に、4行4列の行列を掛け算することで、縮尺と平行移動を行います。
がそれぞれ、x,y,z軸の縮尺と平行移動を表すセルです。

後述でファイルを添付してありますが、ファイルの使い方としては、基本的に色のついたセルだけいじってもらえればよいかと思います。


4行4列のうち、左上の3行3列(の対角成分)が縮尺を表現し
残りのセルのうち、下の3列が平行移動を表しています。



=======
回転

次に、回転部分の解説に移ります。
今回は、ロドリゲスの回転公式という、任意のベクトルを回転軸にできる回転方法を用いることにしました。

回転軸のベクトルをvとします。
それぞれ青・緑・黄がx,y,z方向成分です。
このベクトルは公式の要請から、単位ベクトルでなければいけないため、
ベクトルの絶対値(ノルム)|v|で割ったものv/|v|を改めて定義します。

このv/|v|の3成分をRで定義された行列に入れ、
このRと回転角θによって形成されるMによって
回転行列Mが作られます。
 
  
Rの1乗が交代行列で、2乗が実対称行列になっていますね

 
vベクトルの向きによっては、普通の3次元回転行列と等価になるので、よかったら色々試してみてください。
詳しくは過去日記で。



=======
伸縮・移動2
その次は、またしても縮尺・平行移動の行列を掛け算します。
最初の行列と扱い方は同じですが
回転の前に演算させるのかあとに演算させるのかによって意味が異なります。
 

伸縮・移動1

 ←z>0でないと変な描写になるとかいう
伸縮・移動2
今回の場合は、伸縮・移動1が物体そのものの伸縮と移動であるのに対して
伸縮・移動2がカメラから見た対象の伸縮と移動である、といった感じです。


=======
遠近法
そして、これらの演算によって得られたデータを使ってグラフに描画するわけですが
3次元の物体を2次元に投影するため、直接描画に関わってくるのは3つのデータセットのうち2つだけです。もちろん4つ目のitiとかいう項目も使いません。



ただし、奥に行くにつれて小さくなるという遠近法を考慮するため
横∝x/z

縦∝y/z

という数式で計算をさせます。まじでこれが遠近法のすべてでした!
このとき、比例係数Aを保持しておくとなにかと便利でしょう。



=======
ウゴなう
また、この物体の描画を動かすために
now関数からtoday関数を引いた

なう(笑)-きょう(笑)


動きの速さ1000000くらいを掛け算した値(mod関数で周期的にしてもいいです)
を、回転角度θやその他、色のついた動かしても良いセルに代入すると
delボタンを押すごとに再計算されて、動く状態が見れます。
 
↑now()-today()≒0.5ってことは、0時から約半日、つまり昼過ぎキャプチャーですね

now-todayを1000000倍した値をaとすると
b=mod(a,360)
c=π/360*b
d=sin(c)とかなんとかして
周期の進行度をf=b/360とかして、パーセンテージ表示するとかそういう



======
3点消失法~遠近両用~

ところで、この描写は3点透視図法になっていますね。
物体の角度や視点の位置によって、実質的に消失点を減らせて
2点透視図法、1点透視図法、等角投影法に近似させることができます。


左上:真正面から見た→1点消失法
右上:y軸45°回転→2点消失法
右下:テキトーな軸で回転→3点消失法
左下:移動2をx0=y0=z0=25にして、グラフの表示範囲を横・縦ともに0.9~1.1にした→等角投影法



=======
デバグ
ただし、奥行きを描写するために奥行きzに反比例したデータを用いているため、
縮尺・平行移動2を行ったあとのzがゼロや負数になるようなことがあると正しく描画されませんので気をつけてください。(先述の移動・伸縮2のgif参照)
 
ちなみに、↑以前はよっぽど遠くを描くと曲がってしまっていました。
で、遠近法を直したのが↓これ





======
コンゴの課題~循環参照へ~
ただ、正直なところ
 
伸縮・移動・回転はたかだか1回や2回行いたいわけではなく何度も行いたいので
できることならこのように、循環参照を用いて演算を行いたいんですよね。

ちょっと、できるかどうかそのうちテストしてみます。
任意の回転軸に拡張可能なロドリゲスの回転公式も、所詮1軸回りの回転であることには変わりありませんからね
ブログランキング・にほんブログ村へ
にほんブログ村

拍手[2回]

PR

コメント


コメントフォーム
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字


忍者ブログ [PR]
カレンダー
03 2024/04 05
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
ブログランキング
ブログランキング参戦中
にほんブログ村 アニメブログ 深夜アニメへ
にほんブログ村 漫画ブログ SF・ファンタジー漫画へ
にほんブログ村 科学ブログ 自然科学へ
よかったらポチッとお願いします^^
最新CM
[12/30 buy steroids credit card]
[09/26 Rositawok]
[03/24 hydraTep]
[03/18 Thomaniveigo]
[03/17 Robertaverm]
最新TB
プロフィール
HN:
量子きのこ
年齢:
43
性別:
男性
誕生日:
1981/04/04
職業:
WinDOS.N臣T
趣味:
妄想・計算・測定・アニメ
自己紹介:
日記タイトルの頭についてるアルファベットは日記の番号です
26進数を右から読みます
例:H→7番目、XP→15(P)×26+23(X)=413番目。
A=0とする仕様につき一番右の桁はAにできませんのでご了承くださいズコー
バーコード
ブログ内検索
アクセス解析