2012-02-09 20 views
0

私はJOGLを使ってJavaで書いている小さなオープンGLアプリケーションを持っています。オープンGL変換

私は基本的に私が達成しようとしているものを変換

を適用するCURRENT方法が隣同士に2つのオブジェクトを持つことです見つけようとして壁に頭をバッシングしています。基本的に私はオブジェクトを作成します(すべての三角形を計算するメソッドです - 両方のオブジェクトが表示されているので、両方のオブジェクトが表示されているので、両者は重なっています)、ディスプレイにVBOとdrawElementsを配置します。私の問題は、glTranslatef、glRotatef、glScalefを使わないオンラインの例やチュートリアルを見つけることができないということです。これは私には知らされていますが、古いOpen GLの固定機能の一部になっていました。

編集:(前のコードは削除されました)

私の代わりに叙事詩が失敗します。彼がシェイダーコードを言ったとき、シェイダーを読み込んでコンパイルする.javaファイルを意味すると思っていました。 glslファイルにあったシェーダコードを意味していただけです。私は今、rx、ry、rzを保持する3つのmat4変数をどこに持つのかを見ています。奇妙なことは、スケールを設定して行列を変換しても、私のシェイプは表示されなくなるということです。回転行列は、仮定するように設定され、最後の行は "glPosition = rz * ry * rx * vPosition;"です。私は翻訳とスケール行列を宣言してから、 "= s * t * rz * ry * rx * vPosition"を実行しようとしましたが、サイコロはありませんでした。ここで

は、現在のシェーダコードです:私は下の二つの行列のコメントを外し、同じglPosition文を残せば

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ステートメントは機能しませんでした(私は驚くことではありませんが、行列の乗算にはそれほど優れていません)。私はまた、試してみるだけでs * vPositionを実行しようとしましたが、再び何も見えません。

+0

この宿題はありますか? – Lukasz

+0

はいこれはコンピュータグラフィックスクラスの割り当てです。ほとんどの課題は、三角形メッシュを表示するためのOpenGLコマンドを学習することでした(つまり、VBBを作成してglBegin()やglEnd()ではなくgpuに送る)。しかし、彼は変換にどのようにアプローチすべきかについてはわかりませんでした。私のインターネット検索では、glRotatefなどを使用することがすべて指摘されていましたが、今日私は彼にそれについて尋ねたとき、彼はそれが古い標準であり、今はシェイダーによって制御されていると言いました。しかし、Shaderのプログラムコードにはそれを処理するものは何もなく、電子メールに応答するのはひどいです。 – user1028885

+0

"glTranslatef、glRotatef、glScalefを使わない例やチュートリアルをオンラインで見つけることはできません" [見たか?](http://www.opengl.org/wiki/Getting_started#Tutorials_and_How_To_Guides) JOGLを使用していない可能性がありますが、十分に翻訳できるはずです。これらの最初の5つは、純粋なシェーダベースの技術を使用しています。 –

答えて

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

あなたの教授のように、glTranslateなどの呼び出しでglLoadMatrix経由で独自の行列を使用したいと思うようです。ここで

0

現在のシェーダコードです:

[… code example …] 

シェーダで行列を計算しないでください。もしそれらが定数であれば、コンパイラはそれらを定数に変換するでしょうが、それでもなお柔軟性はありません。これを行う適切な方法は、あなたのメインプログラムで行列を計算してから、それをOpenGLに渡すだけです。行列の数学の全体は簡単です。 Cコーダーの場合、私は公開ドメインにhttps://github.com/datenwolf/linmath.hを提供します。これをJavaに変換するのは簡単です。

+0

このリンクをありがとうございました。これと他のいくつかのリソースの間で私はついにそれを得ました!誰かが将来それを使うことができるように私は解決策を投稿しようとしています。再度、感謝します! – user1028885

関連する問題