2012-12-01 125 views
0

我正在嘗試使用RenderMonkey出來的粒子系統示例,它使用「查看逆矩陣」來公告粒子效果的四邊形。如何計算「查看逆矩陣」

我可以看到RenderMonkey中的所有值,但是我不能計算出它們如何計算「視圖逆矩陣」,它不是視圖矩陣的逆矩陣或視圖投影的逆矩陣。

這是我所知道的,名稱是「可變語義」:

ViewPosition: 
25.044189 105.753433 240.177200 1.0 

ViewProjection: 
1.663676 0.483806 -.351623 -8.377671 
-.790789 2.134270 -.804967 -12.567072 
-.084668 -.379295 -.922480 262.789917 
-.084583 -.378916 -.921558 263.527130 

View: 
1 0 0 0 
0 1 0 0 
0 0 1 -200 
0 0 0 1 

ViewTranspose: 
.913838 .148949 -.377775 0 
-.257723 .931662 -.256095 0 
.313814 .331391 .889776 0 
-.000004 -.000081 -200 1 

ViewInverse: <-This is what I want to calculate 
.941038 -.327556 .084583 25.044195 
.273659 .884044 .378917 105.753433 
-.198891 -.333427 .921557 240.177200 
0  0  0  1 

編輯,我覺得有一個在RenderMonkey的一個漏洞,因爲當我移動,除非我激活Viewmatrix永遠不會更新另一種效果,回到原來的。

從這篇文章:http://swiftcoder.wordpress.com/2008/11/25/constructing-a-billboard-matrix/

我相信它是:

V.a V.e V.i x 
V.b V.f V.j y 
V.c V.g V.k z 
0 0 0 1 

其中,V代表只是視矩陣和X,Y的旋轉部分的倒數,Z代表視圖位置。但我不能確定,直到我嘗試它,因爲渲染猴子錯誤。

回答

0

確認,我有廣告牌的工作。這裏是java:

/** 
* 
* @param viewMatrix 
*   4x4 (16 floats) 
* @param viewPosition 
*   3x1 (3 floats) 
* @param resultMatrix 
*   4x4 (16 floats) 
*/ 
public static void calculateViewInverse(float[] viewMatrix, 
     float[] viewPosition, float[] resultMatrix) { 
    // derived from: 
    // http://swiftcoder.wordpress.com/2008/11/25/constructing-a-billboard-matrix/ 
    // A rotation matrix is a 
    // "real special orthogonal matrix", which for our purposes means that 
    // its transpose is also its inverse. 
    resultMatrix[0] = viewMatrix[0]; 

    resultMatrix[1] = viewMatrix[4]; 
    resultMatrix[4] = viewMatrix[1]; 

    resultMatrix[2] = viewMatrix[8]; 
    resultMatrix[8] = viewMatrix[2]; 

    resultMatrix[5] = viewMatrix[5]; 

    resultMatrix[6] = viewMatrix[9]; 
    resultMatrix[9] = viewMatrix[6]; 

    resultMatrix[10] = viewMatrix[10]; 

    resultMatrix[3] = viewPosition[0]; 
    resultMatrix[7] = viewPosition[1]; 
    resultMatrix[11] = viewPosition[2]; 

    resultMatrix[12] = 0; 
    resultMatrix[13] = 0; 
    resultMatrix[14] = 0; 

    resultMatrix[15] = 1; 
}