線形ではないように見える透視変換がなぜ行列で表現できるのか?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
matrix太郎

線形ではないように見える透視変換がなぜ行列で表現できるのか?

#1

投稿記事 by matrix太郎 » 1ヶ月前

座標変換に使っている行列ってやつは、線形代数でてくるヤツですよね。

入力座標を Xin Yin Zin Win
出力座標を Xout Yout Zout Wout

としたとき、

Xout = a*Xin + b*Yin + c*Zin + d* Win
Yout = e*Xin + f*Yin + g*Zin + h* Win
Zout = i*Xin + j*Yin + k*Zin + l* Win
Wout = m*Xin + n*Yin + o*Zin + p* Win

という式があったときに、この係数 a〜p だけを抜き出したものが行列になるわけですよね

a b c d
e f g h
i j k l
m n o p

ここで不思議なのは透視変換です。
透視変換って、たとえばスクリーン上でのx座標はz距離に比例ではなく反比例すると思うんです。

zが遠くなればなるほど、限りなくxはゼロに近づきますよね。このとき、Zout = 定数/Zin のような形になると思うのですが、行列で表すのは Zout = 定数 * Zin の形だけですよね?何故この反比例の形が行列で表現できるのでしょう???

Matrix太郎

Re: 線形ではないように見える透視変換がなぜ行列で表現できるのか?

#2

投稿記事 by Matrix太郎 » 1ヶ月前

すみません
Zout = 定数/ Zin は
Xout = 定数 / Zin の間違いです

アバター
usao
記事: 1565
登録日時: 6年前

Re: 線形ではないように見える透視変換がなぜ行列で表現できるのか?

#3

投稿記事 by usao » 1ヶ月前

「同次座標」とかで調べると良いかと思います.

スクリーン上への投影座標は,XYout,Yout,ZoutをWoutで割ることで得られます.
要は,
その4x4行列を掛けただけでは,「反比例」に対応する割り算はまだ行われていない,ということになるでしょうか.

Matrix太郎

Re: 線形ではないように見える透視変換がなぜ行列で表現できるのか?

#4

投稿記事 by Matrix太郎 » 1ヶ月前

ああ、Wの意味って、それだったんですね。
確かに最終的な座標を求めるときは最後に
x = X/W
y = Y/W
z = Z/W てやってますから、
w に z の値を突っ込んでおけば z に反比例させることができますね。
ありがとうございました!

返信

“C言語何でも質問掲示板” へ戻る