2014-05-05 1 views
1

J'ai utilisé GLKMathUnProject pour implémenter le picking de rayon afin que je puisse toucher un objet dans l'espace 3D. Maintenant ce que je voudrais faire est (par exemple) montrer une étiquette au-dessus de cet objet. J'ai donc besoin de convertir l'espace 3D en correctifs d'écran 2D (je sais que l'utilisation d'OpenGl et d'UIKit est une mauvaise idée et que le text to text est déjà implémenté).GLKMathProject: Tracer un UIView basé sur les correctifs OpenGl

J'ai utilisé la méthode suivante ci-dessous mais je pense qu'il me manque quelque chose. Je reçois sur un iPad L'article est devant moi, pour être honnête pas sûr de ce qu'il faut faire avec z .:
{922,111, 763,055, 0,990884}

GLKVector3 x = GLKMathProject(building.position, _baseModelViewMatrix, _projectionMatrix, viewport); 

    NSLog(@"%@", NSStringFromGLKVector3(x)); 

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(x.x, x.y, 50, 20)]; 
    label.text = @"TEST"; 
    [self.view addSubview:label]; 
+0

Quel est le problème? Vous devrez peut-être diviser ces coordonnées par 2,0 pour les affichages de la rétine. La coordonnée Z est inutile pour votre cas. Au fait, mixer OpenGL et UIKit est loin d'être une mauvaise idée. –

+0

Oh ok, c'est rétine, et est-ce ok pour montrer des étiquettes au-dessus de 3d comme des noms et des trucs (dynamiques) textos tout semble être une surcharge – Burf2000

+0

Veuillez poster comme solution que vous l'avez fixé – Burf2000

Répondre

1

Le vecteur de résultat que vous obtenez dépend de la système de coordonnées viewport, pas votre système de coordonnées de vue. En général, les X et Y doivent être divisés par la largeur et la hauteur de la fenêtre, puis multipliés par la largeur et la hauteur de la vue. Dans votre cas, cela se divise par 2 en raison de l'affichage de la rétine.

Comme pour la coordonnée Z, vous n'en avez pas besoin pour la position mais vous pouvez l'utiliser pour l'ordre Z. Par exemple, si vous avez plusieurs étiquettes de texte, vous pouvez les trier par valeur Z, de sorte que celles qui sont à l'arrière resteront à l'arrière et si 2 d'entre elles sont dans la même position, la bonne sera devant. Vous pouvez également utiliser cette valeur pour réduire la taille de certaines étiquettes. Comme pour mélanger UIKit avec OpenGL, il ne devrait pas y avoir de problème et ce n'est pas une mauvaise pratique. Vous devriez noter que vous ne pouvez pas mélanger le buffer de profondeur: Vous ne pourrez pas dessiner un objet dessiné OpenGL devant une étiquette. Si à la fin vous choisissez de dessiner des étiquettes dans OpenGL, je suggère de créer une image à partir du UIView (ou du label) et de l'utiliser comme texture plutôt que d'essayer de trouver des bibliothèques pour dessiner du texte. Ce faisant, vous serez en mesure d'utiliser tous les outils déjà utilisés tels que les polices, les couleurs, l'emballage ...

Questions connexes