2017-01-24 6 views
0

私は新しいOpenGLプログラマーです。私は、数千の三角形で構成された高さマップを3Dグラフ形式でプロットしています。それらは3軸の-1と+1の間にプロットされるようにスケーリングされます。今私はX軸だけをズームインすることができ、適切なスケールと変換行列を適用することでX軸でも平行移動できます。これにより、効果的にデータをズームインして、選択した方向にx方向に移動できます。 問題は、いったんズームすると、x方向のデータがグラフの境界である-1から+ 1の範囲外に広がることです。私はこのデータを表示しないことを望む。 これは最新のOpenGLではどうですか?次のように行列の :OpenGLの描画を軸の2つの座標間でどのように制限できますか?

 plottingProgram["projection_matrix"].SetValue(Matrix4.CreatePerspectiveFieldOfView(0.45f, (float)width/height, 0.1f, 1000f)); 
     plottingProgram["view_matrix"].SetValue(Matrix4.LookAt(new Vector3(0, 0, 10), Vector3.Zero, new Vector3(0, 1, 0))); 

をし、頂点シェーダは、ここ

public static string VertexShader = @" 
    #version 130 

    in vec3 vertexPosition; 

    out vec2 textureCoordinate; 

    uniform mat4 projection_matrix; 
    uniform mat4 view_matrix; 
    uniform mat4 model_matrix; 

    void main(void) 
    { 
     textureCoordinate = vertexPosition.xy; 
     gl_Position = projection_matrix * view_matrix * model_matrix * vec4(vertexPosition, 1);   
    } 
    "; 

あるグラフへのリンクです: http://va2fsq.com/wp-content/uploads/graph.jpg

おかげ

+0

問題のあるケースのスクリーンショットを追加できますか?現在使用している行列(射影、...)も表示してください。 – BDL

+1

リクエストが完了しました – Tom

答えて

0
はあなたに 編集をありがとう

私はこれを解決しました。 glScissorのようなものを試した後、私はglClip_distanceに起こった。だから私の最初の試みは、今

in vec3 vertexPosition; 
uniform vec4 plane0 = (-1,0,0,1); 
uniform vec4 plane1 = (1,0,0,1); 

void main(void) 
{ 
    gl_ClipDistance[0] = dot(vec4(vertexPosition,1), plane0; 
    gl_ClipDistance[1] = dot(vec4(vertexPosition,1), plane2; 

に設定したシェーダで制服を置いこれで問題はvec4面が任意のモデル行列のスケーリングや変換によってスケーリングおよび翻訳されていることです。それはうまくいかないでしょう。あなたはまた、翻訳することができます

 Vector4 clip1 = new Vector4(-1, 0, 0, 1.0f/scale); 
     Vector4 clip2 = new Vector4(1, 0, 0, 1.0f/scale); 

     plottingProgram["model_matrix"].SetValue(Matrix4.CreateScaling(new Vector3(scale,1,1)) * Matrix4.CreateTranslation(new Vector3(0,0,0)) *Matrix4.CreateRotationY(yangle) * Matrix4.CreateRotationX(xangle)); 
     plottingProgram["plane0"].SetValue(clip1); 
     plottingProgram["plane1"].SetValue(clip2); 

と完全な頂点シェーダは

public static string VertexShader = @" 
    #version 130 

    in vec3 vertexPosition; 

    out vec2 textureCoordinate; 

    uniform mat4 projection_matrix; 
    uniform mat4 view_matrix; 
    uniform mat4 model_matrix; 

    uniform vec4 plane0; 
    uniform vec4 plane1; 

    void main(void) 
    { 
     textureCoordinate = vertexPosition.xy; 

     gl_ClipDistance[0] = dot(vec4(vertexPosition,1), plane0); 
     gl_ClipDistance[1] = dot(vec4(vertexPosition,1), plane1); 

     gl_Position = projection_matrix * view_matrix * model_matrix * vec4(vertexPosition, 1); 
    } 
    "; 

で与えられますので、解決策は、頂点シェーダの外側のクリップベクトルを移動し、次のようにそれらに反対のスケーリングを適用することです同じやり方で。

関連する問題