Coordonnées absolues et coordonnées relatives
Page 1 sur 1
Coordonnées absolues et coordonnées relatives
Avec l'utilisation des robots, il apparaît bien vite que les déplacements "magiques" sont une nécessité si l'on veut que les avatars puissent se rendre facilement à des points inaccessibles autrement.
Il faut donc comprendre comment s'opère le placement d'objets et, tout particulièrement comment déterminer la position d'un avatar dans un âge.
Il nous faut un point de repère. Soit on utilise le centre de l'âge comme point de repère sois la dernière position connue de l'avatar avant son déplacement.
Dans les deux cas, on utilise un système de coordonnées x y et z permettant de localiser l'avatar dans les 3 plans. On utilise une classe du module Plasma : ptVector3.
Les coordonnées X Y et Z sont fournies par les fonctions getX(), getY() et getZ()
Et, inversément on peut créer un objet ptVector3 en indiquant les coordonnées X Y et set grâce aux fonctions setX(x) setY(x) et setZ(z)
X Y et Z sont des nombres flottants positifs ou négatifs. Mais dans la pratique, j'arrondis les valeurs tout en arrondissant à l'unité supérieure pour la hauteurs Z afin d'être certain que l'avatar ne s'enfoncera pas dans le sol au moment de l'atterrissage ! Cela est bien suffisant pour notre usage.
Pour connaître les coordonnées du point où se situe l'avatar :
PtpJoueur(idplayer) est une fonction qui retourne le Ptplayer du joueur a partir de son nom ou son numero d'ID de KI dont voici le code :
Donc, on crée un objet PtVector3 appelé position qui va contenir les coordonnées de l'avatar
On extrait ces coordonnées X Y Z pour les imprimer à l'écran et la fonction revoie le ptVector3 de la position de l'avatar pour un usage ultérieur dans une autre fonction.
A quoi sert la fonction getLocalToWorld() ?
Elle permet de définir une matrice de l'objet par rapport au point central de l'âge. Nous allons y revenir dans la suite :
Placer un avatar a une position définie X Y Z.
Voici la fonction qui réalise cela :
1.On définit une matrice pos avec la fonction Plasma ptMatrix44(). Cette matrice est une sorte de grille en 3 dimensions qui va servir de point de repère à l'objet avatar.
2.Cette grille est placéee à la position x y z grâce à la fonction translate.
3.On déplace notre avatar sur ce point avec physics.warp(pos)
Pas plus compliqué que cela.
Maintenant si on veut déplacer un avatar d'un point à un autre. Il s'agit d'un déplacement relatif et plus absolu. Donc une translation de l'objet. Dans ce cas on utilise la fonction suivante :
Tout d'abord, j'utilise la fonction précédente AvatarPosition(idplayer) pour obtenir la position absolue de l'avatar.
Ensuite je détermine les nouvelles coordonnées x y z en ajoutant celles passées en paramètres. Et enfin je déplace de manière absolue l'avatar en utilisant la fonction créée précédemment AbsAvTeleport.
Voilà. ce sera tout pour aujourd'hui
Il faut donc comprendre comment s'opère le placement d'objets et, tout particulièrement comment déterminer la position d'un avatar dans un âge.
Il nous faut un point de repère. Soit on utilise le centre de l'âge comme point de repère sois la dernière position connue de l'avatar avant son déplacement.
Dans les deux cas, on utilise un système de coordonnées x y et z permettant de localiser l'avatar dans les 3 plans. On utilise une classe du module Plasma : ptVector3.
Les coordonnées X Y et Z sont fournies par les fonctions getX(), getY() et getZ()
Et, inversément on peut créer un objet ptVector3 en indiquant les coordonnées X Y et set grâce aux fonctions setX(x) setY(x) et setZ(z)
X Y et Z sont des nombres flottants positifs ou négatifs. Mais dans la pratique, j'arrondis les valeurs tout en arrondissant à l'unité supérieure pour la hauteurs Z afin d'être certain que l'avatar ne s'enfoncera pas dans le sol au moment de l'atterrissage ! Cela est bien suffisant pour notre usage.
Pour connaître les coordonnées du point où se situe l'avatar :
- Code:
def AvatarPosition(idplayer):
"""Retourne le ptvector3 de l'avatar de numero idplayer"""
avatarKey=PtGetAvatarKeyFromClientID(idplayer)
Savatar=avatarKey.getSceneObject()
Pavatar = PtpJoueur(idplayer)
navatar = Pavatar.getPlayerName()
matrix = Savatar.getLocalToWorld()
position = ptVector3()
position = matrix.getTranslate(position)
X=position.getX()
Y=position.getY()
Z=position.getZ()
print "Position de %s : %f, %f, %f" %(navatar, X, Y, Z)
return position #retourne le ptVector3 de l'avatar
PtpJoueur(idplayer) est une fonction qui retourne le Ptplayer du joueur a partir de son nom ou son numero d'ID de KI dont voici le code :
- Code:
def PtpJoueur(nom):
"""Retourne le Ptplayer du joueur a partir de son nom ou son numero d'ID de KI """
Liste = PtGetPlayerList()
Liste.append(PtGetLocalPlayer())
nom = str(nom)
nom = nom.lower().replace(' ', '')
for joueur in Liste:
if ((joueur.getPlayerName().lower().replace(' ', '') == nom) or (str(joueur.getPlayerID()) == nom)):
return joueur
break
Donc, on crée un objet PtVector3 appelé position qui va contenir les coordonnées de l'avatar
On extrait ces coordonnées X Y Z pour les imprimer à l'écran et la fonction revoie le ptVector3 de la position de l'avatar pour un usage ultérieur dans une autre fonction.
A quoi sert la fonction getLocalToWorld() ?
Elle permet de définir une matrice de l'objet par rapport au point central de l'âge. Nous allons y revenir dans la suite :
Placer un avatar a une position définie X Y Z.
Voici la fonction qui réalise cela :
- Code:
def AbsAvTeleport (idplayer=0,x=0,y=0,z=0):
"""Teleporte un avartar de numero de KI=idplayer par rapport au centre de l'âge)"""
avatarKey=PtGetAvatarKeyFromClientID(idplayer)
navatar = PtGetClientName(avatarKey)
Savatar=SCOAvatar(navatar)
Savatar.netForce(1)
pos = ptMatrix44()
pos.translate(ptVector3(x,y,z))
Savatar.physics.warp(pos)
1.On définit une matrice pos avec la fonction Plasma ptMatrix44(). Cette matrice est une sorte de grille en 3 dimensions qui va servir de point de repère à l'objet avatar.
2.Cette grille est placéee à la position x y z grâce à la fonction translate.
3.On déplace notre avatar sur ce point avec physics.warp(pos)
Pas plus compliqué que cela.
Maintenant si on veut déplacer un avatar d'un point à un autre. Il s'agit d'un déplacement relatif et plus absolu. Donc une translation de l'objet. Dans ce cas on utilise la fonction suivante :
- Code:
def AvatarTeleport (idplayer,x=0,y=0,z=0):
"""Teleporte un avatarde numero de KI = idplayer depuis sa position actuelle dans les 3 directions"""
avatarKey=PtGetAvatarKeyFromClientID(idplayer)
navatar = PtGetClientName(avatarKey)
Savatar = SCOAvatar(navatar)
Savatar.physics.netForce(1)
Savatar.netForce(1)
Ptvectavatar = AvatarPosition(idplayer)
destx = Ptvectavatar.getX() + x
desty = Ptvectavatar.getY() + y
destz = Ptvectavatar.getZ() + z
AbsAvTeleport (idplayer, destx, desty, destz)
Tout d'abord, j'utilise la fonction précédente AvatarPosition(idplayer) pour obtenir la position absolue de l'avatar.
Ensuite je détermine les nouvelles coordonnées x y z en ajoutant celles passées en paramètres. Et enfin je déplace de manière absolue l'avatar en utilisant la fonction créée précédemment AbsAvTeleport.
Voilà. ce sera tout pour aujourd'hui
V@-Michel- Admin
- Messages : 1172
Date d'inscription : 13/05/2010
Age : 69
Localisation : Belgique
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|