平面紋理座標和球面座標互相轉換

2021-08-28 12:13:16 字數 2121 閱讀 8689

設有一張width/height = 2:1。這個比例很重要。因為這個比例的全景剛好可以還原成一張球形全景圖。比喻展開的世界地圖。

把的寬 當成成 緯度,範圍[0-2π]。

把的高當成經度,範圍[-π/2,π/2]。

x = rcosθcosφ

y = rcosθsinφ

z = r*sinφ

從上面可以看出兩者存在著對於的關係。至於什麼關係寫起來有點麻煩。

想象一下把展開的地圖再次包裹在地球儀上。

或者想象一下用刀子把地球儀沿著本初子午線切開。然後展開成一張2:1的,至於怎麼展開,參考下面的圖,在南極北極開個口子,然後扯開,然後切開,展平。紋理的取樣和切分的區域數量有關,下圖是切割了8塊,可以切割更多的小塊來提高精度。

的寬高–球體的經緯度–球座標系–空間座標系

為了方便觀察,我製作了一張黑白的。經過經緯度轉換之後可以變成下面的效果。下圖的粒子效果是把中黑色的部分畫素提出出來換成粒子代替。

如果用一張黑白的世界地圖來代替的話就會生成乙個炫酷的鏤空粒子地球。

核心**:

function

imgtodata

(src, r, d, pcolor, name, imgcallback)

}var globegeometry =

newthree.buffergeometry()

; positionsa =

;var sprite =

newthree.textureloader()

.load

('../img/disc1.png');

var globematerial =

newthree.pointsmaterial()

; imgdata.

foreach

(e =>);

globegeometry.

addattribute

('position'

,new

three.float32bufferattribute

(positionsa,3)

);globegeometry.

computeboundingsphere()

;var globes =

newthree.points

(globegeometry, globematerial)

; globes.name = name;

imgcallback.

call

(this

, globes);}

}// 經緯度 轉 xyz uv to xyz

function

uvtoxyz

(u, v, r)

**中轉換成資料,使用的canvas畫布的處理功能實現的,逐畫素讀取if (i / 4 % 2 == 1 && y % 2 == 1 && 0 === data.data[i]),**中新增了篩選函式,%2就是每隔乙個點取樣一次,%5就是每個5個取樣一次,通過這個值就可以控制取樣點的數量,也就是後期中粒子的數量。如果畫素是黑色就讀取座標值儲存在陣列中,不是就拋棄。

x,y 對應列和行

球面點三維座標到紋理二維座標的轉換

把全景影象貼在乙個固定半徑的三維球體上,這樣該視點空間就建立起來了。這裡的固定半徑對應固 定的焦距。三維球體的半徑為r,水平轉動角度為h 0,2pi 上下轉動角度為p pi 2,pi 2 所以球面上一 點的三維座標sphere x,y,z r cosp cosh,r cosp sinh,r sinp...

球面座標系轉換為笛卡爾座標系

今天又遇到了球面座標系轉換成笛卡爾座標系,其實是乙個很簡單的問題,記錄一下以便以後檢視。假設球面座標系中的p點座標為 r,theta varphi 有時候球面座標系中的三個座標會使用另一種方式表達 r 無疑就是球體的半徑 theta 稱為傾斜角 inclination varphi 稱為方位角 az...

c 座標系互相轉換

各種座標系的各種轉換 public class tempgps public class gps wgs 84 to gcj 02 public void gcj encrypt var t this.delta new tempgps glng t.tlng lng glat t.tlat lat...