2017-06-22 55 views
4

我正在製作應用程序,我正在渲染360圖像,並且我想在相機前面添加一個對象或十字線(廣告牌概念)。如何將對象放在相機前面總是

所以我已經厭倦了堆棧溢出本身的很多事情,但我沒有得到任何想法我可以做到的下面是我的代碼,我正在嘗試做。

Vector3 position; 
    float[] newPosition4 = new float[4]; 
    position = obj.getPosition(); 
    float[] posVec4 = {0, 0, -8, 0.0f}; 
    float[] HeadViewMatrix_inv = new float[16]; 
    Matrix4 HeadViewMatrix4 = new Matrix4(); 
    HeadViewMatrix4.setAll(getCurrentCamera().getViewMatrix()); 
    HeadViewMatrix4 = HeadViewMatrix4.inverse(); 

    //Copy matrix to HeadViewMatrix array, 
    HeadViewMatrix4.toFloatArray(HeadViewMatrix_inv); 

    //Translation of viewMatrix 
    Matrix.multiplyMV(newPosition4, 0, HeadViewMatrix_inv, 0, posVec4, 0); 
    obj.setPosition(newPosition4[0], newPosition4[1], newPosition4[2]); 

所以任何人都可以幫助我。

回答

4

如果我明白你在問什麼這是非常簡單的事情。你需要構造一個新的矩陣或者簡單地刪除當前的矩陣(使用標識)。

與借鑑A(-0.5, 0.0, 0.0)B(0.5, 0.0, 0.0)線將繪製在屏幕中間的直線垂直線標識。這將會佔用屏幕中間大小的一半。

我建議你使用正投影矩陣與屏幕座標,並將你的對象放在中間,因爲你會做一個恆定大小的另一個視圖(width/2height/2)。

但是,如果要保持始終可見,請確保在繪製此元素時禁用了深度緩衝區。

如果出於某種原因想要使用平截頭矩陣將對象保留在您面前,甚至可能保持深度測試,那麼您只需保持相同的投影矩陣(平截頭體部分)並將視圖矩陣設置爲標識(來自相機的那個)。設置好這些後,您只需將對象放置在絕對零度(.0f, .0f, distanceToObject)的前面。

+0

謝謝!!我是gettting視圖矩陣,其中我可以看到一個世界矩陣,這是我的360圖像,我想添加一個覆蓋在該圖像,如果我將刪除當前矩陣,所以我如何獲得圖像的視圖..如果你可以自由交談,可以談談Skype或Gmail。 –

+0

您好馬蒂奇你能幫我在這 –

+0

你想在屏幕空間的廣告牌,所以你不需要一個視圖轉換,或投影矩陣來在屏幕空間中呈現。使用Matic建議的座標和非常小的z值,以便在虛擬凸輪前呈現。 (即,x和y將在標準化的設備座標=屏幕空間座標中,並且z是區間[近平面,遠平面]的比特範圍中的非線性深度值 – StarShine

2

如果你想使用畫布,我可以提供一個簡單的解決方案。

<RelativeLayout 
    android:id="@+id/layout_container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <!-- Camera Preview --> 

    <FrameLayout 
     android:id="@+id/camera_preview" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 
</RelativeLayout> 

將SurfaceView和Canvas添加到此FrameLayout並在該畫布內繪製任何您希望的內容。

+0

但是我正在使用不允許父母進行的cardbaordview或者孩子,我已經解決了這個問題,無論如何感謝 –