2017-01-21 12 views
0

私はこの状態の値に応じてobjを回転または翻訳するのに使うこの頂点シェーダを持っています。私が使用して回転するため OpenGLESのバッファを理解するandroid

private final String vertexShader="" + 
     "attribute vec4 vertex;" + 
     "attribute vec4 colors;" + 
     "varying vec4 vcolors;" + 
     "uniform int x;" + 
     "uniform vec4 translate;"+ 
     "uniform mat4 rotate;"+ 
     "void main(){" + 
      "vec4 app_verte=vertex;" + 
      "if(x==1){" + 
      "app_verte=vertex+translate;" + 
      "}else if(x==2){" + 
      "app_verte=rotate*app_verte;" + 
      "}" + 
      "vcolors=colors;" + 
      "gl_Position=app_verte;" + 
     "}"; 

associeted行列を用いたものを、次のようにフロート[16]配列から構築されていることを、マトリックス:私は本当にハードに理解becouse

|cos(angle),-sin(angle),0,0| 
|sin(angle), cos(angle),0,0| 
|0   ,   ,0,0| 

は、今私は別の質問があります。変換のタイプを変更したい場合は、xの値を設定する必要があります。今度はコンティニュー変換をするために、私は頂点バッファが同じであると仮定し、変換後にバッファの値が変更されます。今度は同じコーディネイトで変形して描くので、何も起こりません。私は最初に座標バッファを置くだけです。 VRAMと同じバッファを毎回入れずに使用する方法があります。また、変更したバッファを変更したバッファを自分のバッファobjにプルする方法がない場合は、配列を使ってポイントを変換せずにバッファに入れてバッファ?? 私の英語のために申し訳ありません、本当にありがとうございます。

+0

:あなたはタッチイベントを処理し、指を上または下に移動したときに、前方または後方左側ながら、右に移動するならば、それはこのようになりますオブジェクトを回転します。質問を簡略化できますか?頂点シェーダーの各頂点をどのように変換するかを尋ねる場合は、uniform xの代わりにもう1つの属性float xを使用してください – Sung

答えて

0

頂点バッファはこのように設計されているため、トラフィックを減らすためにGPUに一度だけ送信します。その後、行列(または変換ベクトルなどの他のシステム)を使用して頂点シェーダで変換を適用し、最大4×4浮動小数点バッファのみを送信します。

私はあなたの問題が複数のシステムを同時に使用しているということを理解しています。翻訳ベクトルと行列がありますが、いずれか一方を使用します。あなたのケースでは、単にシェーダ内に両方とも適用することができるかもしれませんapp_verte = rotate*app_verte + translate;またはapp_verte = rotate*(app_verte + translate);すでにこれら2つは同じではないと私はあなたが何かを必要とするだろうと推測しているapp_verte = rotate2*(rotate1*app_verte + translate1) + translate2;は解決できません操作は時間の経過とともに増加します。

したがって、あなたのケースではマトリックスでなければならない単一のシステムを選択する必要があります。変換マトリックスを送信する代わりに、アプリケーションのCPU部分でマトリックスを変換し、それをシェーダに送信することができます。行列を乗算し、平行移動と回転行列を生成するためのツールを見つける必要があります。あなたはあなた自身を作ることができますが、すでに投稿したものを見ることができます。最後の値は1ではなく、0でなければなりません。

最初に、同一性が設定された単一の行列があります。これはx=0に相当します。次にx=1の場合、その行列を変換行列myMatrix = generateTranslationMatrix(x, y, z)として設定します。 x=2の場合は、回転行列myMatrix = generateRotationMatrix(x, y, z, angle)と同じです。今度は操作を続行する必要があるときは、2つを連結するには単純にそれらを掛け合わせます。したがって、両方の場合にはmyMatrix = generateTranslationMatrix(x, y, z)*generateRotationMatrix(x, y, z, angle)を実行します。

Matrix myMatrix; 

onLoad() { 
    myMatrix = Matrix.identity(); 
} 

onTurnRight(float angle) { 
    myMatrix = myMatrix * generateRotationMatrix(0, 1, 0, angle); 
} 

onMove(float x, float y, float z) { 
    myMatrix = myMatrix * generateTranslationMatrix(x, y, z); 
} 

は、その後、あなたが必要としてではなく、たとえば、あなたのコードに他のメソッドを追加することができます。しかし、最終的にはあなただけの配向状態を操作するためのいくつかのメソッドをしたいので、値が同様に分離しておく理由はありませんあなたの質問を得ることは困難

onFingerMoved(float x, float y) { 
    const float xfactor = 0.01; // Modify to control the speed of rotation 
    const float yfactor = -0.1; // Modify to control the speed of movement 

    float dx = previousX - x; 
    float dy = previousy - y; 
    onTurnRight(dx); 
    onMove(.0, .0, dy); // Assuming the Z coordinate is forward 

    previousX = x; 
    previousY = y; 
} 
関連する問題