2012-02-09 95 views
0

我有一個使用JOGL在Java中編寫的小型開放GL應用程序。Open GL轉換

我撲我的頭撞在牆上試圖找到應用轉換

基本上我想要做到的是有彼此相鄰的兩個對象的當前方式。基本上我創建對象(計算所有三角形的方法 - 我知道這是工作的,因爲兩個對象都顯示出來,它們只是彼此重疊),然後在顯示器中將它們放入VBO並調用drawElements。我的問題是我看不到任何示例或教程在線,不使用glTranslatef,glRotatef和glScalef,我已經被告知已經過時並且曾經是舊開放GL的固定功能方面的一部分。

編輯:(以前的代碼刪除)

史詩失敗代表我。當他說他的着色器代碼時,我認爲他的意思是加載和編譯着色器的.java文件。它只是打我,他的意思是在一個glsl文件中的SHADER CODE。我現在看到他有3個mat4變量,它們保存了rx,ry和rz。奇怪的是,即使我設置了一個縮放和平移矩陣,我的形狀不再出現。旋轉矩陣按照人們設想的設置,最後一行是「glPosition = rz * ry * rx * vPosition;」我試着宣佈翻譯和比例矩陣,然後做「= s * t * rz * ry * rx * vPosition」,但沒有骰子。

這是當前shader代碼:

attribute vec4 vPosition; 
uniform vec3 theta; 
uniform vec3 trans; 
uniform vec3 scale; 

void main() 
{ 
// Compute the sines and cosines of each rotation 
// about each axis 
vec3 angles = radians (theta); 
vec3 c = cos (angles); 
vec3 s = sin (angles); 

// rotation matricies 
mat4 rx = mat4 (1.0, 0.0, 0.0, 0.0, 
       0.0, c.x, s.x, 0.0, 
       0.0, -s.x, c.x, 0.0, 
       0.0, 0.0, 0.0, 1.0); 

mat4 ry = mat4 (c.y, 0.0, -s.y, 0.0, 
       0.0, 1.0, 0.0, 0.0, 
       s.y, 0.0, c.y, 0.0, 
       0.0, 0.0, 0.0, 1.0); 

mat4 rz = mat4 (c.z, -s.z, 0.0, 0.0, 
       s.z, c.z, 0.0, 0.0, 
       0.0, 0.0, 1.0, 0.0, 
       0.0, 0.0, 0.0, 1.0); 

//mat4 t = mat4 (1.0, 0.0, 0.0, trans.x, 
//    0.0, 1.0, 0.0, trans.y, 
//    0.0, 0.0, 1.0, trans.z, 
//    0.0, 0.0, 0.0, 1.0); 

//mat4 s = mat4 (scale.x, 0.0, 0.0, 0.0, 
//    0.0, scale.y, 0.0, 0.0, 
//    0.0, 0.0, scale.z, 0.0, 
//    0.0, 0.0, 0.0, 1.0); 

gl_Position = rz * ry * rx * vPosition; 
//gl_Position = s * t * rz * ry * rx * vPosition; 
} 

所以基本上,如果我去掉底部的兩個矩陣,但留下出現相同的,沒什麼glPosition聲明。此外,註釋掉的glPosition語句不起作用(儘管我並不感到驚訝,但在矩陣乘法方面我不太好)。我也嘗試過只是s * vPosition,只是爲了嘗試只能縮放,但再次沒有任何可見的東西。

+0

這功課嗎? – Lukasz 2012-02-09 21:58:40

+0

是的,這是一個計算機圖形類的作業。大部分任務是學習用於顯示三角網格的openGL命令(即創建一個VBO並將其發送到gpu,而不是glBegin()和glEnd())。但是他沒有讓我們知道我們應該如何處理轉換。從我的互聯網搜索中,一切都指向了使用glRotatef等。但是當我今天向他詢問時,他說這是一箇舊標準,現在它受着色器控制。但是,他的着色器程序代碼中沒有任何處理它的代碼,並且他在回覆電子郵件時非常糟糕。 – user1028885 2012-02-09 22:12:22

+0

「我看不到任何示例或教程在線,不使用glTranslatef,glRotatef和glScalef」[你看?](http://www.opengl.org/wiki/Getting_started#Tutorials_and_How_To_Guides)可能不會使用JOGL,但你應該能夠很好地翻譯它們。那些使用純基於着色器的技術的前五者。 – 2012-02-09 22:17:50

回答

0

在datenwolf的鏈接和我發現的一些其他資源之間,我能夠編寫一個(而非準系統)列主要訂單矩陣類用於我的任務。如果有其他人發現它有用,我會在此發佈源代碼。

import java.nio.FloatBuffer;

public class CGMatrix { 

public CGMatrix() { 
} 

public static float[][] identity() { 
    return new float[][]{{1.0f, 0, 0, 0}, 
      {0, 1.0f, 0, 0}, 
      {0, 0, 1.0f, 0}, 
      {0, 0, 0, 1.0f}}; 
} 

public static float[][] rotateX(float angle) { 
    double r = angle * (Math.PI/180); 
    float s = (float)Math.sin(r); 
    float c = (float)Math.cos(r); 
    return new float[][] {{1, 0, 0, 0}, 
         {0, c, s, 0}, 
         {0, -s, c, 0}, 
         {0, 0, 0, 1}}; 
} 

public static float[][] rotateY(float angle) { 
    double r = angle * (Math.PI/180); 
    float s = (float)Math.sin(r); 
    float c = (float)Math.cos(r); 
    return new float[][] {{c, 0, s, 0}, 
         {0, 1, 0, 0}, 
         {-s, 0, c, 0}, 
         {0, 0, 0, 1}}; 
} 

public static float[][] rotateZ(float angle) { 
    double r = angle * (Math.PI/180); 
    float s = (float)Math.sin(r); 
    float c = (float)Math.cos(r); 
    return new float[][] {{c, s, 0, 0}, 
         {-s, c, 0, 0}, 
         {0, 0, 1, 0}, 
         {0, 0, 0, 1}}; 
} 

public static float[][] scale(float sx, float sy, float sz) { 
    float[][] m = identity(); 
    m[0][0] *= sx; 
    m[1][1] *= sy; 
    m[2][2] *= sz; 
    return m; 
} 

public static float[][] translate(float tx, float ty, float tz) { 
    float[][] m = identity(); 
    m[3][0] = tx; 
    m[3][1] = ty; 
    m[3][2] = tz; 
    return m; 
} 

public static float[][] multiply(float [][] a, float[][] b) { 
    float[][] m = identity(); 
    for(int j = 0; j < 4; ++j){ 
     for(int i = 0; i < 4; ++i) { 
      m[i][j] = 0; 
      for(int k = 0; k < 4; ++k) { 
       m[i][j] += a[i][k]*b[k][j]; 
      } 
     } 
    } 
    return m; 
} 

public static FloatBuffer buffer(float[][] m) { 
    float[] n = new float[16]; 
    int k = 0; 
    for(int j = 0; j < 4; ++j) { 
     for(int i = 0; i < 4; ++i) { 
      n[k] = m[j][i]; 
      k++; 
     } 
    } 
    return FloatBuffer.wrap(n); 

} 

} 

所以在我的情況下,我爲翻譯,縮放和旋轉設置了單獨的矩陣。

所以,如果,例如,我想沿z的翻譯,然後沿Y,則規模旋轉,我可以這樣做:

cgMatrix = gl2.glGetUniformLocation(shaderProgID, "cgMatrix"); 
    float[][] t = CGMatrix.translate(0, 0, 0.5f); 
    float[][] s = CGMatrix.scale(1, 0.75f, 1); 
    FloatBuffer m = CGMatrix.buffer(CGMatrix.multiply(t, CGMatrix.multiply(ry, s))); 
    gl2.glUniformMatrix4fv(cgMatrix, 1, false, m); 

凡轉換恰巧左到右(即第一它的翻譯,然後旋轉,然後縮放)

無論如何,我希望能對其他人有所幫助!

感謝您的所有回覆。

1

這聽起來像你的教授希望你通過glLoadMatrix使用你自己的矩陣副glTranslate等..調用。

0

這是當前shader代碼:

[… code example …] 

着色器,請不要計算矩陣。如果它們是常量,編譯器可能會將它們變成常量,但它仍然非常不靈活。這樣做的正確方法是計算主程序中的矩陣,然後僅將它們傳遞給OpenGL作爲統一。整個矩陣數學的東西很簡單。對於C編碼器,我在公共領域提供https://github.com/datenwolf/linmath.h。將它翻譯成Java應該很容易。

+0

非常感謝您的鏈接。在這個和其他一些資源之間,我終於明白了!我即將發佈解決方案,以防其他人在將來使用它。再次感謝! – user1028885 2012-02-10 19:24:32