Les Voltigeurs d'URU LIVE
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Le deal à ne pas rater :
Cartes Pokémon EV6.5 : où trouver le Bundle Lot 6 Boosters Fable ...
Voir le deal

Coordonnées absolues et coordonnées relatives

Aller en bas

Coordonnées absolues et coordonnées relatives Empty Coordonnées absolues et coordonnées relatives

Message  V@-Michel Mar 25 Sep - 16:18

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 :

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 Very Happy
V@-Michel
V@-Michel
Admin
Admin

Messages : 1172
Date d'inscription : 13/05/2010
Age : 69
Localisation : Belgique

Revenir en haut Aller en bas

Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum