Pages: 1
- Accueil forums
- » Collisions
- » Coordonnées à l'écran d'un point de l'espace 3D
08-11-2008 18:03:56
- Hawk
- Membres
- Date d'inscription:
- Messages: 91
- IP: 82.121.134.3
- Courriel Site web
Voici mon problème :
J'ai un objet (un ISceneNode) placé dans mon espace 3D aux coordonnées (X,Y,Z). Je voudrais savoir comment est-ce que je peux récupérer la position de son centre (x,y) affiché à l'écran.
Merci.
Hors ligne
08-11-2008 18:33:49
- ramis
- Membres
- Date d'inscription:
- Messages: 92
- IP: 92.133.110.184
- Courriel
salut Hawk ![]()
Je ne sais pas si c'est ce que tu veux , mais tu peux récuperer la position d'un node grâce à "truc=tonnode->getPosition()" je crois .
Donc tu n'a plus qu'à récupérer seulement X et Y ... je crois que j'ai vu ça dans le tutoriel du site du zero (premier chapitre sur la GUI , dernier code , sauf qu'il l'applique à une camera (qui est aussi un node , donc tu devrais pas avoir de probleme
)
Hors ligne
08-11-2008 18:41:12
- Hawk
- Membres
- Date d'inscription:
- Messages: 91
- IP: 82.121.134.3
- Courriel Site web
Salut Ramis.
Je pense que tu n'as pas bien saisi ce que je recherche.
getPosition() donne les coordonnées du Node dans l'espace 3D.
Ce que je veux, c'est les coordonnées à l'écran, savoir en gros à quel "pixel" de l'écran est affiché mon objet (ou plutot son centre).
Hors ligne
08-11-2008 18:50:29
- ramis
- Membres
- Date d'inscription:
- Messages: 92
- IP: 92.133.110.184
- Courriel
ah :S
désolé
.Ah bah là , pas la moindre idée ...attendons quelqu'un de compétent ^^
edit : bah grillé , le competent m'a pas attendu :p
Hors ligne
08-11-2008 18:51:27
- tmyke
- Administrateurs

- Date d'inscription:
- Messages: 1025
- IP: 90.33.58.64
- Courriel
Ce n'est pas trop compliqué à réaliser. J'ai un petit code quelque part pour cela. Mais là, je pars au resto, donc je te posterais cela demain dans la matinée si tu es toujours coincé...![]()
Grosso modo, en speudo code, si cela peut te permettre d'avancer, il faut faire:
function ProjectedXY =
point=positionMesh()
v=GetViewMatrix()
p=GetProjMatrix()
TransformVect( temp, point, v)
TransformVect( temp, temp, p)
vector2 result
result.x = (temp.x + 1) * viewPortWidth/2
result.y = (temp.y + 1) * viewPortHeight/2
voilà. ![]()
Force et sagesse...
Hors ligne
08-11-2008 18:59:20
- Hawk
- Membres
- Date d'inscription:
- Messages: 91
- IP: 82.121.134.3
- Courriel Site web
Merci beaucoup, je crois que ça marche.
En fait, il me manquait les deux formules à la fin avec le viewPort.
Hors ligne
08-11-2008 19:02:22
- tmyke
- Administrateurs

- Date d'inscription:
- Messages: 1025
- IP: 90.33.58.64
- Courriel
J'oubliais avant de partir, pour la coordonnée Y, il faut souvent écrire en sus
result.y = viewPortHeight - result.y;
voilà, A+
Force et sagesse...
Hors ligne
09-11-2008 01:26:31
- dark calculator
- Membres
- Date d'inscription:
- Messages: 153
- IP: 82.67.201.37
- Courriel
Coucou,
En fait il y a quand même plus simple, il suffit de faire appel au getScreenCoordinatesFrom3DPosition du collision manager :
virtual core::position2d<s32> getScreenCoordinatesFrom3DPosition (core::vector3df pos, ICameraSceneNode *camera=0)=0;Pour plus d'info :
http://irrlicht.sourceforge.net/docu/classirr_1_1scene_1_1_i_scene_collision_manager.html
Une fonction pour simplifier encore plus :(une macro serai préferable au niveau rapidifté)
position2d<s32> get2dPos(ISceneManager*smgr,ISceneNode* n)
{
return smgr->getSceneCollisionManager()->getScreenCoordinatesFrom3DPosition (n->getPosition(),0);
}La solution de tmyke est certe plus instructif mais dans un code final reinventer la roue est rarement la bonne solution
Voila en espérant de pas avoir dis de betise, il commence a se faire tard donc mes capacités mentales sont un peu limité.
Donc go dodo
++ à tous
dark calculator
Hors ligne
09-11-2008 09:00:37
- tmyke
- Administrateurs

- Date d'inscription:
- Messages: 1025
- IP: 90.33.58.64
- Courriel
Arrff, je savais bien qu'il y avait une fonction native quelque part, merci dark calculator, effectivement, il est souhaitable d'employer les fonctions d'Irrlicht
quand elle existent.
PS: dark calculator, bonne gras'mat .
Force et sagesse...
Hors ligne
09-11-2008 11:08:36
- Hawk
- Membres
- Date d'inscription:
- Messages: 91
- IP: 83.114.156.215
- Courriel Site web
Merci beaucoup dark calculator, en effet, cette fonction est très utile.
Hors ligne
11-11-2008 17:49:00
- Hawk
- Membres
- Date d'inscription:
- Messages: 91
- IP: 82.121.15.111
- Courriel Site web
Tant que j'y suis, je voudrais savoir comment réaliser l'opération inverse, à savoir partir de la position de la souris (x,y) et obtenir la position (X,Y,Z) qui correspond.
D'après ce que j'ai pu trouver sur le net, on a besoin du z de la souris et après on effectue les opérations inverses que celles de la projection à l'écran, mais je ne sais pas exactement comment obtenir le z de la souris.
Et pour le calcul, est-ce que je suis obligé de faire les opérations avec les matrices, ou irrlicht dispose déjà d'une fonction qui prend le (x,y,z) de la souris et qui renvoie le (X,Y,Z) dans le monde 3D ?
Merci.
Hors ligne
11-11-2008 18:16:04
- tmyke
- Administrateurs

- Date d'inscription:
- Messages: 1025
- IP: 90.56.146.231
- Courriel
La souris n'a pas de coordonnée z car par définition elle évolue dans un monde 2D (ta dalle).
Par contre, ce que tu veux faire s'apparente en quelque sorte à une opération de picking, et tu
devrais trouver les grands principes sur ce type d'operation. A la différence que tu ne pointe pas
un objet, mais on va dire un point imaginaire dans ton espace....
Force et sagesse...
Hors ligne
11-11-2008 19:28:55
- Hawk
- Membres
- Date d'inscription:
- Messages: 91
- IP: 82.121.15.111
- Courriel Site web
En fait ce que je fais, c'est exactement du picking (pour un éditeur de Map).
Je suis conscient que la souris est en 2D, mais je me disais (enfin c'est ce que j'ai cru comprendre en parcourant divers sites) qu'en donnant une coordonnée Z, qui (je crois) correspondrait à la distance entre l'écran et le point de l'espace visé, on pourrait faire l'opération inverse. Je crois savoir à peu près comment déterminer le Z, mais je voudrais surtout savoir s'il n'y a pas la fonction sur Irrlicht qui fait les calculs.
En tout cas, merci pour la réponse.
Hors ligne
11-11-2008 19:50:20
- tmyke
- Administrateurs

- Date d'inscription:
- Messages: 1025
- IP: 90.56.146.231
- Courriel
Hawk Ecris:
En fait ce que je fais, c'est exactement du picking (pour un éditeur de Map).
Je suis conscient que la souris est en 2D, mais je me disais (enfin c'est ce que j'ai cru comprendre en parcourant divers sites) qu'en donnant une coordonnée Z, qui (je crois) correspondrait à la distance entre l'écran et le point de l'espace visé, on pourrait faire l'opération inverse
Oui, je comprends parfaitement ou tu veux en venir, et en théorie il n'y a pas de soucis je pense.
Hawk Ecris:
mais je voudrais surtout savoir s'il n'y a pas la fonction sur Irrlicht qui fait les calculs..
Là, comme je suis encore très jeune dans l'emploie et la connaissance d'Irrlicht (la preuve plus haut), et je ne sais pas si il existe une fonction toute faite pour ce genre de calcul.
A voir, si tu trouves pas, je fouillerais dans le code de mon ancien moteur3D pour pondre un truc dans la semaine...
Force et sagesse...
Hors ligne
11-11-2008 23:48:52
- Hawk
- Membres
- Date d'inscription:
- Messages: 91
- IP: 160.228.152.6
- Courriel Site web
Merci beaucoup pour ton aide.
Hors ligne
12-11-2008 17:16:42
- dark calculator
- Membres
- Date d'inscription:
- Messages: 153
- IP: 88.178.191.172
- Courriel
Toujours la même adresse : http://irrlicht.sourceforge.net/docu/classirr_1_1scene_1_1_i_scene_collision_manager.html
Si les devs ont penser à faire dans un sens ils ont faient dans l'autre aussi.
2 fonctions peuvent t'intérésser :
virtual core::line3d< f32 > getRayFromScreenCoordinates (core::position2d< s32 > pos, ICameraSceneNode *camera=0)=0
Returns a 3d ray which would go through the 2d screen coodinates.
virtual ISceneNode * getSceneNodeFromScreenCoordinatesBB (core::position2d< s32 > pos, s32 idBitMask=0, bool bNoDebugObjects=false)=0
Gets the scene node, which is currently visible under the given screencoordinates, viewed from the currently active camera.En gros soit tu veut recuperer le plus prets et tu fais getSceneNodeFromScreenCoordinatesBB sinon tu recupere le ray avec getRayFromScreenCoordinates et tu teste les collisions avec celui-ci(cf le lien pour voir les fonctions de collision ligne/triangleselector)
En espérant que tu comprennes l'anglais sinon n'hésite pas a demander
dark calculator
Hors ligne
12-11-2008 17:46:30
- Hawk
- Membres
- Date d'inscription:
- Messages: 91
- IP: 160.228.152.6
- Courriel Site web
Merci Dark Calculator.
Pour le getRayFromScreenCoordinates, je l'avais déjà lu sur un autre topic, pour le picking, c'est pratique, mais ce que je cherche à faire aussi, c'est trouver un point dans l'espace 3D pas forcément associé à un Node (pour déplacer un objet par exemple). Mais je pense pouvoir me débrouiller avec ça.
L'autre fonction, je ne l'avais pas vue, merci, ça peut servir.
Hors ligne
12-11-2008 18:34:22
- dark calculator
- Membres
- Date d'inscription:
- Messages: 153
- IP: 88.178.191.172
- Courriel
Tu peut utiliser
vector3d<T> getClosestPoint (const vector3d< T > &point) const
bool getIntersectionWithSphere (vector3d< T > sorigin, T sradius, f64 &outdistance) constde line3d que tu peut récupérer du getRay, si tu as la distance z à la camera, il te suffit de faire un getRayFromScreenCoordinates(pos)->getClosedPoint(camera>getPosition() + vector3df(0,0,z)); je suis pas sur mais sa me semble bien
dark calculator
Hors ligne



