簡體   English   中英

在紋理球體上給定4個點,提取2d平面及其投影的紋理

[英]given 4 points on a textured sphere extract a 2d plane and it's projected texture

設置場景我正在使用Scenekit中的某個功能,在該功能中,我在球體的中心有一個攝像頭。 球體周圍包裹着紋理。 假設這是在房間內部捕獲的360度圖像。

到目前為止,我已經確定了球面上與地板角對應的位置。 我可以提取並創建一個新的平面2d平面,該平面與從相機的角度來看的地板尺寸相匹配。 例如,如果房間的地板較長,我會創建一個梯形平面。

問題但是我希望新的2d平面具有地板的紋理,而不僅僅是形狀。 考慮到我要提取的不是原始紋理圖像,而是投影到球體上的結果,我該怎么做?

僅供參考,我對Scenekit和3D圖形工具還很陌生,而對opengl甚至還比較新

我假設您的圖像結構可以讓您直接選擇任意方向的像素。 例如,如果將方向的方位角映射到圖像的x坐標,並將方向的高度映射到圖像的y坐標,則可以將方向轉換為這些參數,並在這些坐標處選擇顏色。 如果不是這種情況,則必須找到相應光線(從攝影機開始)與球體的交點,並找到該交點處的紋理坐標。 然后,您可以使用此紋理坐標來選擇顏色。

現在,您基本上有兩個選擇。 第一種選擇是為平面生成新的紋理。 第二個選項是從着色器采樣球形圖像。

選項1-生成新紋理

您知道平面的范圍,因此可以生成新的紋理,其尺寸與平面的范圍成比例。 您可以使用任意分辨率。 然后,您需要做的就是填充此紋理的像素。 為此,您只需生成給定像素的射線並在球面圖像中找到相應的顏色,如下所示:

input: d1, d2, d3, d3 (the four direction vectors of the plane corners)
//  d3 +------+ d4
//  d1 +------+ d2
for x from 0 to texture width
    for y from 0 to texture height
        //Find the direction vector for this pixel through bilinear interpolation
        a = x / (width - 1) //horizontal interpolation parameter
        b = y / (height - 1) //vertical interpolation parameter
        d = (1 - a) * ((1 - b) * d1 + b * d3) + a * ((1 - b) * d2 + b * d4)
        normalize d
        //Sample the spherical image at d
        color = sample(d)
        //write the color to the new planar texture
        texture(x, y) = color
    next
next

然后,您可以將新紋理應用於平面。 如果將平面表示為兩個三角形,則重心插值可能更合適。 但是,只要平面是矩形,結果將是相同的。

請注意, sample()方法取決於您的圖像結構,需要適當地實現。

選項2-在着色器中采樣

在選項2中,您執行的操作與在選項1中相同。但是,您在片段着色器中進行了此操作。 您使用平面的頂點及其各自的方向(這可能只是頂點位置),然后讓GPU對其進行插值。 這直接為您提供了方向d ,您可以使用它。 這是一些偽着色器代碼:

in vec3 direction;
out vec4 color;
void main()
{
    color = sample(normalize(direction));
}

如果您的圖像是立方體貼圖,您甚至可以讓GPU進行采樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM