#0 

08-11-2008 19:03:56

Hawk
Membre
Lieu: Wissous
Date d'inscription: 08-11-2008
Messages: 91
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


#1 

08-11-2008 19:33:49

ramis
Membre
Date d'inscription: 27-10-2008
Messages: 92

salut Hawk smile
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 wink )

Hors ligne


#2 

08-11-2008 19:41:12

Hawk
Membre
Lieu: Wissous
Date d'inscription: 08-11-2008
Messages: 91
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


#3 

08-11-2008 19:50:29

ramis
Membre
Date d'inscription: 27-10-2008
Messages: 92

ah :S
désolé big_smile .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


#4 

08-11-2008 19:51:27

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

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é...

wink


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à.   wink


Force et sagesse...

Hors ligne


#5 

08-11-2008 19:59:20

Hawk
Membre
Lieu: Wissous
Date d'inscription: 08-11-2008
Messages: 91
Site web

Merci beaucoup, je crois que ça marche.
En fait, il me manquait les deux formules à la fin avec le viewPort.

Hors ligne


#6 

08-11-2008 20:02:22

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

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


#7 

09-11-2008 02:26:31

dark calculator
Abonné
Date d'inscription: 25-02-2007
Messages: 153

Coucou,
En fait il y a quand même plus simple, il suffit de faire appel au getScreenCoordinatesFrom3DPosition du collision manager :

Code:

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é)

Code:

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 wink

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


#8 

09-11-2008 10:00:37

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

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


#9 

09-11-2008 12:08:36

Hawk
Membre
Lieu: Wissous
Date d'inscription: 08-11-2008
Messages: 91
Site web

Merci beaucoup dark calculator, en effet, cette fonction est très utile.

Hors ligne


#10 

11-11-2008 18:49:00

Hawk
Membre
Lieu: Wissous
Date d'inscription: 08-11-2008
Messages: 91
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-11-2008 19:16:04

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

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


#12 

11-11-2008 20:28:55

Hawk
Membre
Lieu: Wissous
Date d'inscription: 08-11-2008
Messages: 91
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


#13 

11-11-2008 20:50:20

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

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...
wink


Force et sagesse...

Hors ligne


#14 

12-11-2008 00:48:52

Hawk
Membre
Lieu: Wissous
Date d'inscription: 08-11-2008
Messages: 91
Site web

Merci beaucoup pour ton aide.

Hors ligne


#15 

12-11-2008 18:16:42

dark calculator
Abonné
Date d'inscription: 25-02-2007
Messages: 153

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 :

Code:

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 wink

dark calculator

Hors ligne


#16 

12-11-2008 18:46:30

Hawk
Membre
Lieu: Wissous
Date d'inscription: 08-11-2008
Messages: 91
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


#17 

12-11-2008 19:34:22

dark calculator
Abonné
Date d'inscription: 25-02-2007
Messages: 153

Tu peut utiliser

Code:

vector3d<T> getClosestPoint (const vector3d< T > &point) const
bool     getIntersectionWithSphere (vector3d< T > sorigin, T sradius, f64 &outdistance) const

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 wink

dark calculator

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
883 membres
1429 sujets
11121 messages
Dernier membre inscrit: Saidov17
117 invités en ligne
Aucun membre connecté
RSS Feed