2010-11-30 8 views
2

J'utilise du code qui essaie de fonctionner comme Glu.Project() puisque OpenTK ne supporte pas Glu. S est une classe dont le primaire existe en tant que modèle dans l'espace 3D à la position de l'objet. Mais les valeurs que j'en tire sont astronomiquement bien au-delà des limites de la fenêtre.Le projet GL ne fonctionne pas correctement

La matrice MODELVIEW d'un point d'arrêt:

{(1, 0, 0, 0) 
(0, 0.7071068, 0.7071068, 0) 
(0, -0.7071068, 0.7071068, 0) 
(0, -141.4214, -141.4214, 1)} 

La matrice de projection d'un point d'arrêt:

{(1.931371, 0, 0, 0) 
(0, 2.414213, 0, 0) 
(0, 0, -1.0002, -1) 
(0, 0, -2.0002, 0)} 

Est-ce que je fais quelque chose de mal ou ai-je quelque chose de mal? Est-ce que je manque quelque chose?

+0

essayées avec Glu, des résultats très très similaires. –

Répondre

0

Voici comment cela fonctionne:

GL.GetFloat(GetPName.ModelviewMatrix, out model); 
GL.GetFloat(GetPName.ProjectionMatrix, out proj); 
GL.GetFloat(GetPName.Viewport, view); 

Matrix4.Transpose(ref model, out model); 
Matrix4.Transpose(ref proj, out proj); 

Vector4 posa = new Vector4(0.0f, s.Position.Y, 1.0f, s.Position.X); 
Vector4 posb = new Vector4(s.Position.Y, 1.0f, s.Position.X, 0.0f); 
Vector4 posc = new Vector4(1.0f, s.Position.X, 0.0f, s.Position.Y); 

Vector4 one = new Vector4(1.0f, 1.0f, 1.0f, 1.0f); 
Matrix4 posv = new Matrix4(pos, posa, posb, posc); 

Matrix4 ProjPos = Matrix4.Mult(Matrix4.Mult(proj, model), posv); 
Matrix4.Transpose(ref ProjPos, out ProjPos); 

Vector2f posout = new Vector2f(
    (0 + (this.glc.Width * (ProjPos.Column0.X/ProjPos.Column0.W + 1.0f)) - (this.glc.Width/2.0f)), 
    (0 + (this.glc.Height * (ProjPos.Column0.Y/ProjPos.Column0.W + 1.0f)) - (this.glc.Height/2.0f)) 
); 

Dans le cas où tout le monde en a besoin :)

0

Avez-vous vérifié la valeur de la position avant de l'utiliser? Qu'en est-il des matrices de projection et de transformation que vous appliquez au vecteur, sont-elles saines?

Je ne suis pas familier avec OpenTK, mais les mathématiques antérieures à set2DPos() semblent assez raisonnables.

+0

Mon code s'exécute à partir de la matrice ModelView principale et les valeurs de la position sont saines que je vois le modèle à l'emplacement correct. Merci de répondre. –

+0

Ajout de données d'exemple pour les matrices telles qu'elles étaient à un point de rupture aléatoire lorsque l'objet était visible. –

+0

Je suppose que votre dernier appel est de mapper votre vertex dans l'espace de l'écran. Si c'est le cas, cela semble un peu suspect - téléchargez la spécification du noyau OpenGL et à la section 2.13.1 vous pouvez trouver l'algèbre de mapping de la fenêtre. Bonne chance! – cmannett85

1
Vector2 GetScreenCoordinates(Vector3 ObjectCoordinate) 
    { 
     // ref: http://www.songho.ca/opengl/gl_transform.html 
     Vector4 obj = new Vector4(ObjectCoordinate.X, ObjectCoordinate.Y, ObjectCoordinate.Z, 1.0f); 
     Matrix4 projection = new Matrix4(); 
     Matrix4 modelView = new Matrix4(); 
     Vector4 viewPort = new Vector4(); 

     GL.GetFloat(GetPName.ModelviewMatrix, out modelView); 
     GL.GetFloat(GetPName.ProjectionMatrix, out projection); 
     GL.GetFloat(GetPName.Viewport, out viewPort); 

     Vector4 
      eye = Vector4.Transform(obj, modelView), 
      clip = Vector4.Transform(eye, projection); 
     Vector3 
      ndc = new Vector3(clip.X/clip.W, clip.Y/clip.W, clip.Z/clip.W); 
     Vector2 
      w = new Vector2(viewPort.Z/2 * ndc.X + viewPort.X + viewPort.Z/2, 
          viewPort.W/2 * ndc.Y + viewPort.Y + viewPort.W/2); 

     return w; 
    } 
Questions connexes