Pages: 1
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
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
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
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
Dernière modification par ramis (08-11-2008 19:51:26)
Hors ligne
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à.
Hors ligne
Merci beaucoup, je crois que ça marche.
En fait, il me manquait les deux formules à la fin avec le viewPort.
Hors ligne
J'oubliais avant de partir, pour la coordonnée Y, il faut souvent écrire en sus
result.y = viewPortHeight - result.y;
voilà, A+
Hors ligne
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/cl … nager.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
Dernière modification par dark calculator (09-11-2008 02:32:13)
Hors ligne
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 .
Hors ligne
Merci beaucoup dark calculator, en effet, cette fonction est très utile.
Hors ligne
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
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....
Hors ligne
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
Hawk :
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 :
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...
Hors ligne
Merci beaucoup pour ton aide.
Hors ligne
Toujours la même adresse : http://irrlicht.sourceforge.net/docu/cl … nager.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
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
Tu peut utiliser
de 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
Pages: 1