Bon théoriquement cela donne les formules ci-dessous. Mais les règles du dessin en perspective appliquées ici sont rudimentaires, à voir à l'expérimentation si cette projection conique est satisfaisante.
Merci pour la formule. mais elle me rend perplexe... J'ai du mal à voir son application de la cadre d'une rotation de fenêtre. Y sont évoquées des rectangles intérieurs, extérieurs... ainsi qu'une caméra. Késako ?
Pour voir une rotation, il faut un observateur que j'appelle la caméra. Cette caméra est nécessairement en avant de l'écran et je la place à mi-hauteur de cet écran. En fait sa position (son éloignement) intervient dans le coefficient. La formule reliant le coefficient à l'éloignement E ne servant à rien ici, je ne l'ai pas indiquée. Si la fenêtre tournait réellement en sortant de l'écran (c'est ce que l'on veut rendre comme effet), le point bottom-left parcourerait un cercle dans un plan perpendiculaire à l'écran que j'ai dessiné dans le plan inférieur.
Les rayons caméra-point bottom-left engendrent alors un cône dont le sommet est l'observateur-caméra. Pour projeter dans le plan de l'écran il faut prendre une section de ce cône, et dans ce genre de position, cette section est une ellipse.
Les formules indiquées ne font que paramétrer cette ellipse.
dans 1236870943:
Y sont évoquées des rectangles intérieurs, extérieurs...
L'idée d'Aligator était de mettre une vue dans une vue dans une window. Il y a alors le grand rectangle de la content view , et le petit rectangle de la vue qui tourne à l'intérieur.
Pour rendre l'effet de perspective, le coefficient choisi pour les points les plus éloignés BottomRight et TopRight) doit être inférieur à celui pour les points les plus proches de telle sorte que soit tracé un trapèze et non un parallélogramme. Voilà ce que j'essaierais en premier lieu par tâtonnement sur les coefficients arrière/avant. A voir le rendu visuel. Peut-être que jouer sur des coefficients différents pour Bottom Right et Top Right peut améliorer l'effet.
2) Si le tâtonnement ci-dessus ne fournit pas satisfaction, et pour respecter les règles de la perspective (il me semble que ce que je décris ci-après sont les règles de Dà¼rer, à vérifier pour celui que cela intéresse ... ) - je conserverais le parcours elliptique des points bottom et top left, - je choisirais une droite à l'infini parallèle à l'axe des x, à priori centré verticalement, à l'arrière de l'écran, de telle sorte que les arêtes supérieures et inférieures de la fenêtre se coupent toujours sur cette droite. Mais là je n'ai pas fait les calculs ...
La formule de calcul du x est parfaite. Un test rapide montre bien les différents x que l'on obtient pour faire une pseudo rotation de 90°.
Par contre, la formule du calcul du y me retourne des valeurs aberrantes (valeurs positives au début puis valeurs négatives). J'ai bien vérifié la formule et il ne semble pas y avoir d'erreur (j'utilise Excel et ses fonctions maths pour faire les calculs).
Par contre, la formule du calcul du y me retourne des valeurs aberrantes (valeurs positives au début puis valeurs négatives).
C'est que le w/2 est assez grand par rapport à (H-h)/2. Pour que y reste positif, il faut que (H-h) > coefficient * w.
De toutes façons, il faut prendre un coefficient entre 0 et 1, et sans doute plus proche de 0. Ce coefficient est pile le rapport "Longueur axe vertical/Longueur axe horizontal" . Intuitivement je le positionnerais entre 0.1 et 0.2
De toutes façons, il faut prendre un coefficient entre 0 et 1, et sans doute plus proche de 0. Ce coefficient est pile le rapport "Longueur axe vertical/Longueur axe horizontal" . Intuitivement je le positionnerais entre 0.1 et 0.2
Excellente intuition, Philippe. Le coeff 0.13 me donne de très bon résultats.
sont interprété par IB comme des outlets destinés à des NSTexteFieldCell. En outre, IB ne fat pas apparaà®tre les "bons" outlets. Je suis obligé de mettre les outlets IBO_machin en commentaire avant de réaliser mes liaisons. Ensuite je décommente.
J'ai repris et adapté le code de No dans mon application et bizarrement les outlets: IBOutlet NSView *IBO_vuePreferences; IBOutlet NSView *IBO_vueClient; IBOutlet NSView *IBO_vueConteneur; sont interprété par IB comme des outlets destinés à des NSTexteFieldCell. En outre, IB ne fat pas apparaà®tre les "bons" outlets. Je suis obligé de mettre les outlets IBO_machin en commentaire avant de réaliser mes liaisons. Ensuite je décommente.
Je ne comprends pas trop. Le problème survient après que tu ais modifié le code ?
J'ai repris et adapté le code de No dans mon application et bizarrement les outlets: IBOutlet NSView *IBO_vuePreferences; IBOutlet NSView *IBO_vueClient; IBOutlet NSView *IBO_vueConteneur; sont interprété par IB comme des outlets destinés à des NSTexteFieldCell. En outre, IB ne fat pas apparaà®tre les "bons" outlets. Je suis obligé de mettre les outlets IBO_machin en commentaire avant de réaliser mes liaisons. Ensuite je décommente.
Je ne comprends pas trop. Le problème survient après que tu ais modifié le code ?
Et bien par exemple, j'ajoute un NSTextField à mon interface puis j'ajoute l'outlet correspondant dans mon controleur.h (IBOutlet NSTextFieldCell *monTextField;) Quand j'essaie d'établir la liaison sous IB, ce nouvel outlet n'apparait pas dans la liste des outlets disponibles. Seuls apparaissent les outlets: IBOutlet NSView *IBO_vuePreferences; IBOutlet NSView *IBO_vueClient; IBOutlet NSView *IBO_vueConteneur;
Si je mets ces derniers en commentaire, alors mon nouvel outlet "monTextField" apparait et je peux établir le lien.
Il y a sans doute désynchronisation entre le .h dans xcode et IB. Pense à sauvegarder le .h dans xcode avant d'aller dans IB établir les liaisons.
C'est la première chose à laquelle j'ai pensé mais il ne s'agit pas de cela. Pour en avoir le coeur net, j'ai repris ton projet window-transition et je me suis contenté d'ajouter un NSTextField dans l'interface et son outlet dans Controleur.h Impossible de faire la liaison, seul l'outlet IBO_vuePreferences est visible dans la liste.
dans 1240241989:
Quel version du couple Xcode/IB utilises tu ? v2 ou v3 ?
Et un passage via l'utilitaire "ibtool" en ligne de commande sur ton fichier XIB pour vérifier qu'il est cohérent et qu'il ne trouve pas d'erreurs ?
Je ne connais pas cet utilitaire. J'ai lancé au hasard 'ibtool lefichier.xib' , l'utilitaire s'exécute mais aucun message ne s'affiche.
Note que tu peux faire toi même le test sur le mini-projet de NO, téléchargeable dans ce fil de discussion. Pour moi, c'est clairement un bug de IB ou Xcode.
Note que tu peux faire toi même le test sur le mini-projet de NO, téléchargeable dans ce fil de discussion. Pour moi, c'est clairement un bug de IB ou Xcode.
Je viens de faire l'essai. J'ai repris le projet joint dans mon message initial. Et j'ai fait les mêmes manips que toi, à savoir : - ajout d'un NSTextField dans la fenêtre principale dans IB, - ajout d'un IBOutlet dans le fichier Controleur.h dans Xcode, - liaison de l'objet Controleur vers le NSTextField via ce nouvel outlet.
Tout fonctionne nickel. Dans la capture d'écran, on voit bien que le outlet ajouté à Controleur.h apparait correctement dans l'inspecteur de l'objet Controleur. De plus, après avoir "tirer" une liaison entre Controleur et le text-field, la mini-fenêtre me propose de relier 2 outlets de Controleur.h : le premier IBO_vuePreferences, car il est déclaré en NSView, ce qui est une classe parente de NSTextField, et mon outlet nouvellement ajouté untextField, que j'ai déclaré en id.
Donc : - soit ton IB est verolé : dans ce cas, tente de supprimer les préférences et tout autre fichier cache (voir dans ton répertoire library), - soit tu fais une fausse manip quelque part dans IB lors de l'établissement de la liaison, - soit ton Controleur.h est mal renseigné.
No, merci beaucoup pour le temps passé. Il ne s'agit pas d'un problème de prefs vérolées. En procédant comme tu l'as fait, ça fonctionne parfaitement.
Mais pourrais-tu m'expliquer pourquoi tu déclares un Outlet de type id et pas un Outlet de type NSTextFieldCell? Et pourquoi est-il impossible (sauf bidouille décrite plus haut) de réaliser une liaison outlet de type NSTextFieldCell qui me semble beaucoup plus logique (a priori)?
Réponses
mais elle me rend perplexe...
J'ai du mal à voir son application de la cadre d'une rotation de fenêtre.
Y sont évoquées des rectangles intérieurs, extérieurs... ainsi qu'une caméra.
Késako ?
Si la fenêtre tournait réellement en sortant de l'écran (c'est ce que l'on veut rendre comme effet), le point bottom-left parcourerait un cercle dans un plan perpendiculaire à l'écran que j'ai dessiné dans le plan inférieur.
Les rayons caméra-point bottom-left engendrent alors un cône dont le sommet est l'observateur-caméra. Pour projeter dans le plan de l'écran il faut prendre une section de ce cône, et dans ce genre de position, cette section est une ellipse.
Les formules indiquées ne font que paramétrer cette ellipse.
L'idée d'Aligator était de mettre une vue dans une vue dans une window. Il y a alors le grand rectangle de la content view , et le petit rectangle de la vue qui tourne à l'intérieur.
Pour rendre l'effet de perspective, le coefficient choisi pour les points les plus éloignés BottomRight et TopRight) doit être inférieur à celui pour les points les plus proches de telle sorte que soit tracé un trapèze et non un parallélogramme. Voilà ce que j'essaierais en premier lieu par tâtonnement sur les coefficients arrière/avant. A voir le rendu visuel. Peut-être que jouer sur des coefficients différents pour Bottom Right et Top Right peut améliorer l'effet.
2) Si le tâtonnement ci-dessus ne fournit pas satisfaction, et pour respecter les règles de la perspective (il me semble que ce que je décris ci-après sont les règles de Dà¼rer, à vérifier pour celui que cela intéresse ... )
- je conserverais le parcours elliptique des points bottom et top left,
- je choisirais une droite à l'infini parallèle à l'axe des x, à priori centré verticalement, à l'arrière de l'écran, de telle sorte que les arêtes supérieures et inférieures de la fenêtre se coupent toujours sur cette droite. Mais là je n'ai pas fait les calculs ...
La formule de calcul du x est parfaite.
Un test rapide montre bien les différents x que l'on obtient pour faire une pseudo rotation de 90°.
Par contre, la formule du calcul du y me retourne des valeurs aberrantes (valeurs positives au début puis valeurs négatives).
J'ai bien vérifié la formule et il ne semble pas y avoir d'erreur (j'utilise Excel et ses fonctions maths pour faire les calculs).
C'est que le w/2 est assez grand par rapport à (H-h)/2. Pour que y reste positif, il faut que (H-h) > coefficient * w.
De toutes façons, il faut prendre un coefficient entre 0 et 1, et sans doute plus proche de 0.
Ce coefficient est pile le rapport "Longueur axe vertical/Longueur axe horizontal" . Intuitivement je le positionnerais entre 0.1 et 0.2
Excellente intuition, Philippe.
Le coeff 0.13 me donne de très bon résultats.
Passons maintenant au codage en C de tout ça.
IBOutlet NSView *IBO_vuePreferences;
IBOutlet NSView *IBO_vueClient;
IBOutlet NSView *IBO_vueConteneur;
sont interprété par IB comme des outlets destinés à des NSTexteFieldCell. En outre, IB ne fat pas apparaà®tre les "bons" outlets. Je suis obligé de mettre les outlets IBO_machin en commentaire avant de réaliser mes liaisons. Ensuite je décommente.
Je ne comprends pas trop. Le problème survient après que tu ais modifié le code ?
Et bien par exemple, j'ajoute un NSTextField à mon interface puis j'ajoute l'outlet correspondant dans mon controleur.h (IBOutlet NSTextFieldCell *monTextField;)
Quand j'essaie d'établir la liaison sous IB, ce nouvel outlet n'apparait pas dans la liste des outlets disponibles. Seuls apparaissent les outlets:
IBOutlet NSView *IBO_vuePreferences;
IBOutlet NSView *IBO_vueClient;
IBOutlet NSView *IBO_vueConteneur;
Si je mets ces derniers en commentaire, alors mon nouvel outlet "monTextField" apparait et je peux établir le lien.
Pense à sauvegarder le .h dans xcode avant d'aller dans IB établir les liaisons.
Quel version du couple Xcode/IB utilises tu ? v2 ou v3 ?
C'est la première chose à laquelle j'ai pensé mais il ne s'agit pas de cela. Pour en avoir le coeur net, j'ai repris ton projet window-transition et je me suis contenté d'ajouter un NSTextField dans l'interface et son outlet dans Controleur.h
Impossible de faire la liaison, seul l'outlet IBO_vuePreferences est visible dans la liste.
La version 3.1.2 (pour les deux)
J'ai fait un file -> Reload All Class Files
ça n'a eu aucun effet. Visiblement c'est un bug.
Je ne connais pas cet utilitaire. J'ai lancé au hasard 'ibtool lefichier.xib' , l'utilitaire s'exécute mais aucun message ne s'affiche.
Note que tu peux faire toi même le test sur le mini-projet de NO, téléchargeable dans ce fil de discussion. Pour moi, c'est clairement un bug de IB ou Xcode.
Je viens de faire l'essai.
J'ai repris le projet joint dans mon message initial.
Et j'ai fait les mêmes manips que toi, à savoir :
- ajout d'un NSTextField dans la fenêtre principale dans IB,
- ajout d'un IBOutlet dans le fichier Controleur.h dans Xcode,
- liaison de l'objet Controleur vers le NSTextField via ce nouvel outlet.
Tout fonctionne nickel.
Dans la capture d'écran, on voit bien que le outlet ajouté à Controleur.h apparait correctement dans l'inspecteur de l'objet Controleur.
De plus, après avoir "tirer" une liaison entre Controleur et le text-field, la mini-fenêtre me propose de relier 2 outlets de Controleur.h : le premier IBO_vuePreferences, car il est déclaré en NSView, ce qui est une classe parente de NSTextField, et mon outlet nouvellement ajouté untextField, que j'ai déclaré en id.
Donc :
- soit ton IB est verolé : dans ce cas, tente de supprimer les préférences et tout autre fichier cache (voir dans ton répertoire library),
- soit tu fais une fausse manip quelque part dans IB lors de l'établissement de la liaison,
- soit ton Controleur.h est mal renseigné.
Il ne s'agit pas d'un problème de prefs vérolées. En procédant comme tu l'as fait, ça fonctionne parfaitement.
Mais pourrais-tu m'expliquer pourquoi tu déclares un Outlet de type id et pas un Outlet de type NSTextFieldCell?
Et pourquoi est-il impossible (sauf bidouille décrite plus haut) de réaliser une liaison outlet de type NSTextFieldCell qui me semble beaucoup plus logique (a priori)?