坐標(biāo)轉(zhuǎn)換的一個(gè)比較成熟的想法 ///
我大概說一下怎么坐標(biāo)轉(zhuǎn)換 因?yàn)槭怯迷谖业?D渲染器里的 所以會(huì)結(jié)合一點(diǎn)
把一個(gè)三維點(diǎn)的坐標(biāo)轉(zhuǎn)化為另一個(gè)空間直角坐標(biāo)系里的坐標(biāo)?
已知一個(gè)空間直角坐標(biāo)系中一點(diǎn)A 我們想把它轉(zhuǎn)化為一個(gè)經(jīng)過任意旋轉(zhuǎn)的空間直角坐標(biāo)系中的坐標(biāo)(p2 中由兩兩垂直的綠色和橙色向量為坐標(biāo)軸的坐標(biāo)系)?
這里中目標(biāo)坐標(biāo)系的z軸正方向是確定的 即視線方向?
這里坐標(biāo)系y軸都表示高 x和z是平面? ? ?(你問我為什么??8年mc你說為什么)

明確一下已知量然后開始:?
A點(diǎn)在原坐標(biāo)系中的坐標(biāo)
新坐標(biāo)系的z軸正方向在原坐標(biāo)系中的向量坐標(biāo), 記該向量為n
新坐標(biāo)系的另一根坐標(biāo)軸與z軸的關(guān)系(當(dāng)然 你知道它坐標(biāo)也行 目的是確定新坐標(biāo)系)
首先,我們先確定新坐標(biāo)系。
????在這個(gè)例子中,平面法向量就是目標(biāo)坐標(biāo)系的z軸正方向(p2中的綠色向量),坐標(biāo)軸兩兩垂直,且因?yàn)樽罱K看到的2D畫面的的高就是高(自己根據(jù)結(jié)論理解下 不知道怎么說),所以目標(biāo)坐標(biāo)系中新x軸的必然在原坐標(biāo)系的xz平面上,即新坐標(biāo)系的x軸正方向在原坐標(biāo)系中y=0。那么根據(jù)它與z軸正方向
????確立了新坐標(biāo)系的兩條坐標(biāo)軸,第三條坐標(biāo)軸的位置就確定了,方向的話怎么發(fā)現(xiàn)怎么來就好了。
????在3D渲染器里我是用2個(gè)角度表示視線向量的,α和β,分別表示視線向量n和原坐標(biāo)系的xy面與xz面的夾角。 定義域的話 α∈[-180°, 180°], β∈[-90°, 90°]

為了計(jì)算方便,我們讓n為單位向量,即 |n| =?1
設(shè) vec(n)?= (x,y,z)? ? ? ? vec()表示是向量

那么我們就可以得到 |ON| = 1
=> |MN| = y = sinβ · |ON| = sinβ
???? |OM| =?cosβ · |ON| = cosβ
=> |OC| = x = cosα · |OM| = cosα?cosβ
???? |MC| = z = sinα · |OM| = sinα cosβ
=> vec(n) = (cosα cosβ, sinβ, sinα cosβ), |n| = 1
del x,y,z
記p1橙色向量和cyan向量分別為nh(horizontal)和nv(vertical)
設(shè) vec(nh) = (x,0,z)?
由nh⊥n 易得 x = cos(α-90°)cosβ, y = sin(α-90°)cosβ? ? => vec(nh) =??(cos(α-90°) cosβ, 0,?sin(α-90°) cosβ) = (sinα cosβ, 0, -cosα cosβ)
del x,z
同理, vec(nv) = (cosα?cos(β-90°), sin(β-90°), sinα?cos(β-90°)) = (cosα sinβ, -cosβ, sinα sinβ)
但是這里有個(gè)小問題 |n|和|nv|都為1 但是|nh|因?yàn)閥軸坐標(biāo)被固定了 所以長度不總是1 那么我們需要變換一下 方法也很簡單:
????vec(nh0) =?(sinα?cosβ, 0, -cosα?cosβ)
????nh_len = sin2α·cos2β+cos2α·cos2β
????vec(nh) = vec(nh0)/nh_len
????表達(dá)式如下:
????vec(nh) = (sinα?cosβ / (sin2α·cos2β+cos2α·cos2β), 0 ,-cosα?cosβ / (sin2α·cos2β+cos2α·cos2β))
值得注意的是它的定義域是不包含β=±90°的 所以可以在程序里加一個(gè)分類討論 如果為|β|=90°時(shí)直接把原坐標(biāo)系里的y和z換一下就是新坐標(biāo)系了 記得考慮一下正負(fù)
綜上我們就得到了得到新坐標(biāo)軸的單位向量在原坐標(biāo)系中的坐標(biāo):
????vec(n) =?(cosα?cosβ, sinβ, sinα?cosβ)
????vec(nh) = (sinα?cosβ / (sin2α·cos2β+cos2α·cos2β), 0 ,-cosα?cosβ / (sin2α·cos2β+cos2α·cos2β)), |β|?≠ ±90°
????vec(nv) =?(cosα sinβ, -cosβ, sinα sinβ)
那么接下來的事情就很簡單了 記得向量投影嗎
A' = (vec(OA)·vec(nh), vec(OA)·vec(nv), vec(OA)·vec(n))
因?yàn)槭菃挝幌蛄?,所以直接點(diǎn)乘就好了,不用再除模了,畢竟是1