So-net無料ブログ作成

透視投影変換 [PostScript]

変換


透視投影02.png
遠近感のある透視投影で立方体の投影図を描きます。
プログラムは平行投影変換とほぼ同じで、透視変換式が追加されています。
透視変換をプロシージャ化しようと思ったのですが、ちょっと面倒です。
ベタなやり方ですが各軸の回転変換の下にそれぞれ置いています。
spの値で遠近感が変わって来ます。

変換式は
sp:投影面と視点との距離
x1=sp*x/sp+z
y1=sp*y/sp+z

参考書籍:PC-9801/PC-8801 3次元グラフィックス入門 永山嘉昭 著


透視投影01.png

【サンプルコード】
%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 0 240 240 %%Title:立方体の投影 /yr -30 def % Y軸周りの回転角度 /xr -30 def % X軸周りの回転角度 /zr -30 def % Z軸周りの回転角度 /sp -800 def % 投影面と視点との距離 % 回転と描画プロシージャ /rotation { /sw exch def % 始点を置くかどうかを取得 % Y軸周りの回転 /x2 x1 yr cos mul z1 yr sin mul sub def /y2 y1 def /z2 x1 yr sin mul z1 yr cos mul add def /x2 sp x2 mul sp z1 add div def % 透視投影変換 /y2 sp y2 mul sp z1 add div def % 透視投影変換 % X軸周りの回転 /x3 x2 def /y3 z2 xr sin mul y2 xr cos mul add def /z3 z2 zr cos mul y2 xr sin mul sub def /x3 sp x3 mul sp z2 add div def % 透視投影変換 /y3 sp y3 mul sp z2 add div def % Z軸周りの回転 /x4 y3 zr sin mul x3 zr cos mul add def /y4 y3 zr cos mul x3 zr sin mul sub def /x4 sp x4 mul sp z3 add div def % 透視投影変換 /y4 sp y4 mul sp z3 add div def % 0なら始点、1なら線を引く、それ以外は線を引いた後、始点と線を繋ぐ sw 0 eq { x4 y4 moveto } { sw 1 eq { x4 y4 lineto } { x4 y4 lineto closepath } ifelse } ifelse } def % 立方体の座標 /a [-50 50 50 ] def /b [ 50 50 50 ] def /c [ 50 -50 50 ] def /d [-50 -50 50 ] def /e [-50 50 -50 ] def /f [-50 -50 -50 ] def /g [ 50 50 -50 ] def /h [ 50 -50 -50 ] def % 座標データを取得 /readdata { % ポイントの配列からデータを取り出し、それぞれの座標に入れる /po exch def % 座標の配列名を取得 /x1 po 0 get def /y1 po 1 get def /z1 po 2 get def } def 0 0 240 240 rectstroke % 黒背景 120 120 translate % 座標の原点を中央に移動 newpath % 底面(オレンジ) d readdata % 座標のポイント名を渡す 0 rotation % 始点か線を引くか(0 or 1)を渡し、回転して描画する c readdata 1 rotation h readdata 1 rotation f readdata 2 rotation 1 .5 0 setrgbcolor fill % 色設定 % 奥面(赤) e readdata 0 rotation g readdata 1 rotation h readdata 1 rotation f readdata 2 rotation 1 0 0 setrgbcolor fill % 左側面(青) a readdata 0 rotation e readdata 1 rotation f readdata 1 rotation d readdata 2 rotation 0 .6 1 setrgbcolor fill % 右側面 g readdata 0 rotation b readdata 1 rotation c readdata 1 rotation h readdata 2 rotation 1 0 1 setrgbcolor fill % 上面(黄) a readdata 0 rotation b readdata 1 rotation g readdata 1 rotation e readdata 2 rotation 1 1 0 setrgbcolor fill % 正面(紫) %a readdata 0 rotation %b readdata 1 rotation %c readdata 1 rotation %d readdata 2 rotation %.8 0 .8 setrgbcolor fill

タグ:PostScript
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:アート

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

トラックバックの受付は締め切りました