2017-01-24 4 views
0

Je suis un nouveau programmeur opengl. Je suis en train de tracer une carte de hauteur composée de milliers de triangles dans un format graphique 3D. Ils sont mis à l'échelle de sorte qu'ils sont tracés entre -1 et +1 dans les trois axes. Maintenant, je suis capable de zoomer dans l'axe X seulement et je suis capable de traduire dans l'axe X aussi bien en appliquant l'échelle appropriée et les matrices de traduction. Cela me permet effectivement de zoomer directement dans les données et de les déplacer dans la direction x comme je le choisis. Le problème est, une fois que j'obtiens un zoom, les données dans la direction x s'étend maintenant en dehors de la région -1 à + 1 qui délimite un graphique. Je veux que ces données ne soient pas affichées. Comment cela se fait-il dans OpenGL moderne? Merci Edit: Les matrices sont les suivantes:Comment restreindre le dessin en OpenGL entre deux coordonnées dans l'axe?

 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))); 

et le vertex shader est

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);   
    } 
    "; 

Voici un lien vers le graphique: http://va2fsq.com/wp-content/uploads/graph.jpg

Merci

+0

Pouvez-vous ajouter une capture d'écran du cas problématique? Veuillez également montrer les matrices que vous utilisez actuellement (projection, ...). – BDL

+1

Fait à la demande – Tom

Répondre

0

J'ai résolu ceci. Après avoir essayé beaucoup de choses comme glScissor, je suis tombé sur glClip_distance. Donc, mon essai initial placé un uniforme dans le shader qui a été mis à

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; 

Maintenant, le problème est que les plans de vec4 sont mis à l'échelle et traduites par une mise à l'échelle de la matrice de modèle ou de transformations. Donc ça ne marcherait pas. Donc, la solution est de déplacer les vecteurs clip en dehors du vertex shader et appliquer la mise à l'échelle opposée à eux comme suit:

 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); 

et le vertex shader complet est donné par

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); 
    } 
    "; 

Vous pouvez également traduire de la même manière.