Create a SkyBox

上一篇我們將六張影像( TOP、DOWN、FRONT、BACK、LEFT、RIGHT)投影到一個立方體上,現在要將 Cube投射到一個球狀平面上,來得到一個無線視野的平面影像,利用下圖說明,可以看到 sphere與 cube影像之間的關係。

skymapdiagram

在skybox的概念下指的是我們人眼睛在球形中心向外看出去所得到一個無死角的360°的 perspective影像,然而在opengl裡本來就有內建 gluPerspective function可以使用,自動將3D的 cube轉換成2D的 perspective影像。

glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
WHratio = (width)/height;
gluPerspective(fov, WHratio, 25.0/16,16*25);
glMatrixMode(GL_MODELVIEW);

void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear, GLdouble zFar); fovy指的是視野角度,aspect指視窗長寬比,zNear與zFar指的是可視範圍。

因此可以藉由調整不同的 fov與 cube的旋轉角度而得到不同方位與不同視野的影像。

cubeimagesview in the cube

Cubeview outside of the cube

 cubeview of six cubic images


這裡我將 FRONT這張影像全填為綠色,觀看實際投影效果,可以看到影像內容會根據我不同的視角位置而有不同的 perspective結果。

cube perspective

一開始在實做skybox時,原本以為是利用 Equirectangular影像裡球座標的角度來求得在 cube裡的影像資訊,但後來玩過別人的 cubemap後才發現我大錯特錯,他們是利用 opengl將六張影像投影在 cube上後再做投影,投影方程式 opengl都已經幫我們寫好了,如果要自己實作 Perspective Projection的話應該也是可以,但過程可能會很繁瑣就是了。

 

 


reference : http://www.braynzarsoft.net/index.php?p=D3D11CUBEMAP

 

Leave a Reply

Your email address will not be published. Required fields are marked *