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 du moment : -21%
LEGO® Icons 10329 Les Plantes Miniatures, ...
Voir le deal
39.59 €

Placer ou enlever l'Arche de Kerath dans le Relto

3 participants

Aller en bas

Placer ou enlever l'Arche de Kerath dans le Relto Empty Placer ou enlever l'Arche de Kerath dans le Relto

Message  V@-Michel Mar 10 Juil - 10:58

Mon but dans cet exposé est de vous apprendre comment placer un objet d'un âge dans un autre âge, à un endroit désiré et de taille désirée.
Nous allons placer l'Arche de Kerath sur la butte près du point d'eau de notre Relto.

Code:

#*******************#
# Arche au Relto              #
#                                  #
#*******************#
"""Insere ou retire l'Arche de Kerath pres de la riviere du Relto et en diminuant ses dimensions"""

from Plasma import *

Present = False

def Mettre (objet='',age='', vrai=True):
    """Placer ou enlever un sceneobjet dans la scene courante"""
    ob=PtFindSceneobject(objet,age)
    ob.draw.netForce(1)
    ob.draw.enable(vrai) 
     
def Insere(morceauage='',vrai=True):
    """Insère ou retire un morceau d'âge prp dans l'âge courant"""
    if vrai==True:
        PtConsoleNet('Nav.PageInNode '+ morceauage ,1)
    else:
        PtConsoleNet('Nav.PageOutNode '+ morceauage ,1)

def RArch(param = True):
 global Present
 if param == True:
  if Present == False :
  Insere('harbor',param)
  PtSetAlarm(1, R_Arch(), int(param))
  Present = True
  else :
  Mettre("ArchOfKerath", "city",True)
 else :
  Mettre("ArchOfKerath", "city",False)
class R_Arch:
    def onAlarm(self, context):
        Mettre("Water_Harbor", "city",False)
        Mettre("IslandArmsNew", "city",False)
        if context == True:
            obj = PtFindSceneobject("ArchOfKerath", "city")
            matrix = obj.getLocalToWorld()
            rot = ptMatrix44()
            rot.makeRotateMat(2, -math.pi * 10/180)
            scale=ptMatrix44()
            scale.makeScaleMat(ptVector3(0.03,0.03,0.03))
            matrix.translate(ptVector3(77.0, 1989.0, 21.0))
            obj.physics.netForce(1)
            obj.physics.warp(matrix * scale * rot)

De quoi avons-nous besoin ?

1. du fichier prp qui contient l'Arche :
-âge : city
-District_harbor.prp

2. du sceneobject dans District_harbor.prp :
-ArchOfKerath

3. de la position où je veux placer l'Arche dans mon Relto.
Pour ce faire, je vais utiliser une commande de la console Plasma de PlClient : Avatar.Debug
Ce qui nous intéresse ce sont les valeurs données par Position (world) qui nous donne la position relative de l'avatar par rapport au point central de l'âge.
Mettez-vous en Fly mode et déplacez-vous jusqu'à obtenir les valeurs 0,0,0. Vous verrez alors que le centre de l'âge de votre Relto se situe un peu en-dessous du pilier avant gauche, donc sous l'endroit où mon avatar se situe sur cette photo :

Placer ou enlever l'Arche de Kerath dans le Relto Kiimag48

Maintenant, allez en ville (privée pour ne pas gêner les autres) et faites de-même. La vous allez voir que le point 0,0,0 de l'âge se situe sous l'entrée du tunel fermé de la place (Entree de la grande Guilde).

Placer ou enlever l'Arche de Kerath dans le Relto Kiimag11

Maintenant, toujours en Fly mode, allez jusqu'au pied de l'Arche de Kerath, vos pieds touchant l'eau. Mettez-vous au milieu vous devez obtenir les valeurs : 0, -2000, 0, ce qui vous montre que le pied de l'Arche se trouve bien aligné avec le centre de l'âge mais à une distance de -2000 par rapport à ce centre.
Maintenant, montez tout droit jusqu'au sommet, là vous devriez avoir les coordonnées 0, -2000, 700
Donc, l'Arche a une hauteur de 700.

Retournez à votre Relto et placez-vous à l'endroit où nous souhaitons placer l'Arche , soit ici :

Placer ou enlever l'Arche de Kerath dans le Relto Kiimag49

Vous obtenez les coordonnées suivantes : 74, -35, 21

Maintenant comparons les coordonnées de l'Arche avec celles de l'endroit où nous souhaitons la voir dans notre Relto :

Arche (pieds) : X= 0, Y= -2000, Z= 0
point où l'on veut la placer dans le Relto : X = 74, Y = -35, Z = 21

Je vous rappelle que X est représente un déplacement latéral par rapport au centre de l'âge, Y est le déplacement avant-arrière et Z est le déplacement vertical.
Si X est positif, il s'agit d'un déplacement vers la gauche, si Y est négatif, il s'agit d'un déplacement vers l'avant et si Z est positif, il s'agit d'un déplacement vers le haut.
Dans notre cas, nous remarquons que l'Arche est très en avant du centre de l'âge (-2000). Donc nous devrons le ramener de 2000-35 = 1965. Nous devrons également le décaller vers la gauche de 74 et le monter de 21.

Si je réalise mon programme sur base de ces données, je vais bien obtenir l'Arche à l'endroit désiré dans mon Relto mais elle sera beaucoup trop volumineuse car, comme nous l'avons déterminé plus haut, sa hauteur est de 700 alors que, par exemple, la hutte de notre relto n'est que de 20, soit 35 fois plus grande.
Il va donc falloir ajuster sa taille. Je vais donc la restreindre de 20/700 = environ 0.03. C'est ce coefficient multiplicateur que j'indique dans l'instruction :
makeScaleMat(ptVector3(0.03,0.03,0.03))

En indiquant 0.03 pour x,y et z, je conserve les proportions de l'Arche.

Il a fallu également tourner l'Arche de 10 degrés afin de l'aligneravec le rebord de la falaise, en utilisant l'instruction :
makeRotateMat(2, -math.pi * 10/180)

Maintenant, après plusieurs essais et ajustements, les coordonnées que j'emploie varient légèrement de celles calculées théoriquement car il faut bien entendu tenir compte de la précision apportée aux calculs. J'effectue la translation avec l'instruction :
translate(ptVector3(77.0, 1989.0, 21.0))

Et, enfin les deux instructions suivantes permettent de rendre visible par tous l'Arche déplacée :
obj.physics.netForce(1)
obj.physics.warp(matrix * scale * rot)


Il ne nous reste plus qu'à taper dans la console Python de PlClient :
RArch(True) pour placer l'Arche et RArch(False) pour la faire disparaître. Admirez le résultat.

Placer ou enlever l'Arche de Kerath dans le Relto Kiimag50

Je vous laisse le soin de comprendre les fonctions utilisées et, en cas de problème, le faire savoir ici Very Happy
Petite précision : si vous quittez le jeu, votre Relto reprendra son aspect normal. Il vous faudra relancer la commande si vous souhaitez revoir l'Arche dans votre Relto (et dans tous les âges que vous visiterez Razz (d'où la commande RArch(False) pour l'enlever)
V@-Michel
V@-Michel
Admin
Admin

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

Revenir en haut Aller en bas

Placer ou enlever l'Arche de Kerath dans le Relto Empty Re: Placer ou enlever l'Arche de Kerath dans le Relto

Message  V@-Annabelle Mar 10 Juil - 22:23

Question J'aurais dû aimé plus les maths étant jeune!!!

Tu importes tous les objets ou seulement l'Arche?

Car si tu fais qu'importer un objet, ce serait génial pour moi (... en enlevant tous les positionnements, coordonnées, translations, rotations et j'en passe.)

J'ai besoin quelque fois d'importer que quelques objets et non tout le prp au complet que je supprime à 99% de toute manière.
V@-Annabelle
V@-Annabelle
Modérateur
Modérateur

Messages : 340
Date d'inscription : 14/05/2010
Localisation : Canada

Revenir en haut Aller en bas

Placer ou enlever l'Arche de Kerath dans le Relto Empty Re: Placer ou enlever l'Arche de Kerath dans le Relto

Message  V@-Michel Mer 11 Juil - 9:21

Malheureusement, il n'est pas possible de n'importer que les sceneobjects. Il faut, au préalable importer le prp qui le(les) contient et supprimer tout ce qu'on n'a pas besoin.
En effet, il faut charger en mémoire le prp qui va positionner chaque objet de la scène en mémoire et la commande que tu utilises pour enlever un objet, en fait ne l'enlève pas, il le rend simplement invisible mais il est toujours chargé en mémoire !

Par exemple, ici pour l'Arche c'est tout le harbor qui est importé et tu remarqueras que j'ai juste enlevé Water_Harbor et IslandArmsNew, car le reste ne se voit pas car en-dehors de la sphère du Relto. Regarde cette photo. C'est ce que l'on voit en Fly mode une fois le prp 'harbor' chargé :

Placer ou enlever l'Arche de Kerath dans le Relto Kiimag12

Ici, on voit la sphère à droite qui est tout mon Relto (l'âge ou je suis) et à gauche le port (harbor) avec l'Arche. On peut également voir le décor de fond de la ville.
Donc, théoriquement, si je n'ai besoin que de l'Arche je devrais enlever tous les autres objets. C'est faisable mais, par facilité, je ne retire que les objets qui me gênent dans mon Relto comme l'eau et ses reflets ou bien le faisceau bleu du GZ.

Dans l'article ci-dessus, j'utilise la fonction mettre() pour placer ou enlever des objets du décor (Sceneobjects en englais). Donc, pour chaque objet à placer ou à enlever il faut une ligne de commande.
Mettre("ArchOfKerath", "city",True) ou Mettre("Water_Harbor", "city",False) le nom de l'objet, le nom de l'âge auquel cet objet appartient, True pour placer et False pour retirer.
Lorsque j'ai beaucoups d'objets à retirer ou à placer, je me suis fais une autre fonction que j'ai appelée Triobjets(nom).
Je l'avais déjà expliquée dans un autre sujet. Mais, en gros, on place dans cette fonction, une liste appelée Objets dans laquelle on énumère tous les objets que l'on veut voir disparaître (0) ou que l'on veut rajouter (1) une fois le (les) prp chargé(s).
De cette manière, on se crée une bibliothèque, une fois pour toute. Il suffit simplement de taper, par exemple, Triobjets("Arche") et tous les objets que l'on a entrés dans la liste Objets de Arche vont s'effacer ou se placer. C'est beaucoup plus rapide que de devoir taper 10 ou plus commandes pour enlever, un par un chaque objet que l'on n'a pas besoin. Revoici le code de cette fonction (cette commande appelle la fonction mettre(), donc ne pas oublier de la placer dans le même module):

Code:
 
def Triobjets (nom=''):
    """ajoute et suppression d'objets d'un age donne"""
    if nom == 'PR' or nom == 'Phil' or nom == 'Phils Relto':
        #Relto de Phil
        Objets = ("RTDirLightCoolDesertFill,philRelto,0","SkyHigh,philRelto,0","SkyLow,philRelto,0","WaterSkyReflection,philRelto,0",\
        "SfxRainEmit,philRelto,0","RainParty,philRelto,0","SfxRoofRainEmitL,philRelto,0","SfxRoofRainEmitR,philRelto,0","ShelfA_Book01,philRelto,0",\
        "ShelfA_Book02,philRelto,0","ShelfA_Book03,philRelto,0","ShelfA_Book06,philRelto,0","ShelfA_Book07,philRelto,0","ShelfA_Book08,philRelto,0",\
        "ShelfA_Book09,philRelto,0","ShelfA_Book002,philRelto,0","ShelfA_Book003,philRelto,0","ShelfA_Book004,philRelto,0","ShelfA_Book005,philRelto,0",\
        "ShelfA_Book006,philRelto,0","ShelfA_Book007,philRelto,0","ShelfA_Book008,philRelto,0","ShelfA_Book009,philRelto,0","ShelfA_Book010,philRelto,0",\
        "ShelfA_Book011,philRelto,0","ShelfA_Book012,philRelto,0","ShelfA_Book028,philRelto,0","FogLayerBill,philRelto,0","DRC Vest,philRelto,1",\
        "DRCVest detector Region,philRelto,1")
        #Placer ici les objets d'autres ages a placer (1) ou a enlever (0)
    elif nom == 'Arche':
        #Arche de Kerath
        Objets = ("Water_Harbor,city,0","IslandArmsNew,city,0","GPSGreatZero,city,0","GreatZeroBeam-RTProj,city,0","GreatZeroBeamMaster,city,0","GreatZeroStrobe,city,0")
    elif nom == 'Autrechose':
        pass   
    for obj in Objets :
        Lobj=obj.split(',')
        print Lobj[0]
        print Lobj [1]
        print Lobj [2]
        if Lobj [2] in ['true','True','TRUE','1']:
            Lobj2=True
        else:
            Lobj2=False   
        Mettre (Lobj[0],Lobj[1],Lobj2)

Encore une astuce.
Voir les objets importés du fichier prp n'est pas toujours facile à cause de l'effet de brouillard qui entoure un âge. Mais il y a une solution : enlever ce brouillard Very Happy Comment ?
Dans la console python, il suffit de taper ceci : PtFogSetDefLinear (0, 5000, 0).
Le premier chiffre donne le point de départ par rapport au centre de l'âge. Le second donne l'étendue du rayon d'action du brouillard et le troisième son intensité croissante de façon linéaire (d'où le nom de la fonction) depuis le point de départ jusqu'au point de fin.
Donc, ici, je mets comme point de départ 0, qui est le centre de l'âge et 5000 qui est suffisant pour tout couvrir et comme intensité 0 pour enlever ce brouillard.
Pour l'intensité, utilisez un nombre décimal compris entre 0 et 1. Par exemple 0.5 vous donnera un brouillard avec 50 % d'intensité et 1.0 vous donnera 100%

Regardez ces deux images . La première où je suis en Fly mode à 2000 du Relto (j'ai laissé 50% du brouillard d'origine sinon on ne verrait rien que du bleu) et l'autre, à la même place après avoir retiré tout le brouillard.

Placer ou enlever l'Arche de Kerath dans le Relto Kiimag13

Placer ou enlever l'Arche de Kerath dans le Relto Kiimag14

J'espère que cela répondra à ta question.
V@-Michel
V@-Michel
Admin
Admin

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

Revenir en haut Aller en bas

Placer ou enlever l'Arche de Kerath dans le Relto Empty Re: Placer ou enlever l'Arche de Kerath dans le Relto

Message  V@-Michel Mer 11 Juil - 9:51

Encore une précision concernant le déplacement des objets.

Tous les objets du décor ne sont pas déplaçables. Cela n'est possible qu'avec ceux qui possèdent des coordonnées. Par exemple vous ne saurez pas déplacer les épaves du port car elles n'ont pas de coordonnées. Elles sont fixées au décor. Voici comment savoir quels objets sont déplaçables.
Nous allons prendre l'exemple de l'Arche.

Ouvrez Plasmashop (version 3).
Cliquez sur Ages > city
Doublecliquez sur District_harbor.prp de façon à ouvrir Prpshop
Dans PrpShop, cliquez sur city > harbor >Scene Object.
Doublecliquez sur ArchOfKerath. Vous voyez une fenêtre apparaître. Si "Coordinate Interface" est en surbrillance, cela veut dire que l'objet a des coordonnées et qu'il peut donc être déplacé (ou, dans d'autres circonstances, déplacer votre avatar sur cet objet ou encore déplacer un autre objet sur cet objet).
Dans le cas de l'Arche, vous voyez que cet objet a des coordonnées et qu'il peut donc être déplacé.
Faites la même chose avec "Boat01" et vous verrez que "Coordinate Interface" est en sousbrillance et donc qu'il ne peut être déplacé. C'est dommage, car j'aurais bien voulu avoir une miniature de l'épave sur l'étagère de mon Relto Laughing .

Si vous le désirez, vous pouvez cliquer sur "Coordinate Interface" de l'Arche pour voir les coordonnées de cet objet. Ce qui est intéressant c'est l'onglet "Local to world", colonne Pos où l'on notera la position relative de l'objet presque équivalente à celle que nous avions trouvée en déplaçant notre avatar dans mon exposé de départ.
Je n'ai pas encore très bien étudié ces chiffres et donc je ne sais pas (encore) vous dire exactement à quoi ils correspondent.Razz
V@-Michel
V@-Michel
Admin
Admin

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

Revenir en haut Aller en bas

Placer ou enlever l'Arche de Kerath dans le Relto Empty Re: Placer ou enlever l'Arche de Kerath dans le Relto

Message  Lyrositeur Mer 11 Juil - 12:21

Juste une précision au cas où tu ne l'as pas déjà découvert : tu peux enlever les SceneObjects pour toi-même (et pour d'autres qui utilisent des Internal clients) mais tu ne peux pas l'enlever pour les clients réguliers. Ce ne sera qu'après un redémmarrage que tout partira.
Lyrositeur
Lyrositeur
Escaladeur
Escaladeur

Messages : 96
Date d'inscription : 03/07/2012
Age : 28
Localisation : Montréal, Canada

http://www.lyros.net

Revenir en haut Aller en bas

Placer ou enlever l'Arche de Kerath dans le Relto Empty Re: Placer ou enlever l'Arche de Kerath dans le Relto

Message  V@-Michel Mer 11 Juil - 19:25

Quelques nouveaux objets dans mon Relto, ils proviennent du quartier. Pouvez-vous les retrouver ?

Placer ou enlever l'Arche de Kerath dans le Relto Kiimag51

Le ballon de plage dans ma hutte

Placer ou enlever l'Arche de Kerath dans le Relto Kiimag52

Demain, je vous parlerai de comment placer un objet près de soi ou près d'un autre objet. 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

Placer ou enlever l'Arche de Kerath dans le Relto Empty Re: Placer ou enlever l'Arche de Kerath dans le Relto

Message  Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

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