Aller au contenu


[résolu] :  modelsunderloc très lent ?


  • Vous ne pouvez pas répondre à ce sujet
9 réponses à ce sujet

#1 gegedade

    Ceinture Marron

  • Members
  • 125 messages

Posté 11 octobre 2011 - 11:03

Bonjour à toutes et à tous,

Voyons. En arrivant sur une frame, je cherche à déterminer le nom du modèle sur lequel je passe la souris.

Donc :
put "je commence !"
dept=the milliseconds
if not(the mouseDown) then
cursor 260
pt = the mouseLoc
if sprite(5).camera(1).modelsUnderLoc(pt)>[] then
put the milliseconds-dept
end if
end if
eh bien... the milliseconds-dept, à la première application du script, ça fait... 18 secondes ! 18 000 millisecondes ! Après la première application, le script agit bien en quelques millièmes, mais l'entrée est catastrophique !... Je ne comprends pas. Avec _movie.tracescript, je vois bien que tout se bloque sur le "if sprite(5).camera(1).modelsUnderLoc(pt)>[], et que rien ne survient avant l'affichage du temps.

Alors évidemment, mon modèle contient 23 000 faces... C'est à cause de ça à votre avis ?

Si oui, voyez-vous une autre manière de repérer soit un modèle se trouvant sous la souris, soit une partie de la texture (qui fait 4096 x 4096, j'ai essayé le script de James Newton modifié par Alexx et offert par Matse, mais il utilise aussi modelsunderloc... et de toutes façons je n'arrive pas à le faire fonctionner.

Merci d'avance !

#2 gegedade

    Ceinture Marron

  • Members
  • 125 messages

Posté 11 octobre 2011 - 12:59

Comme bien souvent, on a tendance (du moins j'ai tendance) à envoyer des posts et à trouver un semblant de solution après...

J'ai mis dans le startMovie
dept=the milliseconds
toto=member(1).camera(1).modelsUnderLoc(point(320,275))
put "lancement : " & the milliseconds-dept

Eh bien là j'obtiens environ 5 secondes. Et lorsque j'arrive sur la frame où je repère le modèle sur lequel se trouve la souris (c'est-à-dire non plus sur l'acteur, mais sur le sprite) eh bien le repérage est maintenant instantané.

Je parle de semblant de solution car, même si je vais me contenter de ce résultat, je ne comprends absolument pas pourquoi ça marche comme ça !

à bientôt...

#3 glurp

    Modérateur

  • Moderateur
  • 1 249 messages

Posté 11 octobre 2011 - 07:06

Salut gegedade,

modelUnderLoc et modelsUnderRay sont de bonne méthodes, mais très lentes si utilisées sur des modèles complexes.
Le truc est donc d'utiliser des "collision box" invisibles.

Ensuite, de mémoire il existe 2 façons de faire :
- Tu spécifies la liste de modèles à scanner en paramètre
- Juste avant l'appel de fonction, tu retires les modèles hi-poly de la scène avec removeFromWorld

Si je me souviens bien, la deuxième méthode est la plus rapide ;)

#4 gegedade

    Ceinture Marron

  • Members
  • 125 messages

Posté 12 octobre 2011 - 07:36

Merci Glurp ! Comme ça fait plaisir de lire les fidèles...

Voui, bonne idée le removefromworld, mais le problème est que j'ai besoin de tout conserver à l'écran. En fait il s'agit de réagir au survol de certaines zones d'un modèle 3D. La solution qu'on a essayée : cloner dans 3DS Max des parties du modèle et donc les transformer en modèles, les détacher légèrement, puis les rendre invisibles. Lorsqu'on passe la souris, ces modèles apparaissent en premier dans la liste modelsunderloc.

Si je fais un removefromworld, je perds la visualisation de mon modèle complexe de fond, non ?

Ce qui est vraiment curieux, c'est que le temps pour appliquer la simple ligne :
if member(1).camera.modelsunderloc(pt)[1]<>"objet then
varie d'une manière qui me semble totalement aléatoire de 4 à 18 secondes. Et ça a l'air d'aller plutôt mieux en dcr via le Net qu'en local ! Mystère, mystère...

Ah, mais une idée me vient, et si j'ai le temps je vais tenter le coup... Pourquoi ne pas cloner mon acteur en enlevant effectivement le modèle complexe, le coller sur un sprite en dehors de la scène, et regarder les modelsunderloc sur cet acteur-là en ajoutant ce qu'il faut au mouseH ? Voilà, c'est ça le travail d'équipe, une idée plus une idée égalent parfois quelque chose ! Encore merci, il me tarde d'essayer !

J'espère que tout va bien pour toi, à un de ces jours !

Modifié par gegedade, 12 octobre 2011 - 07:40 .


#5 glurp

    Modérateur

  • Moderateur
  • 1 249 messages

Posté 12 octobre 2011 - 02:58

Non non, tu te compliques la vie :)

Il suffit de faire un removeFromWorld() AVANT de lancer le rayon, puis de faire un addToWorld(), le tout dans la même méthode !
Le temps entre les deux étant moindre qu'une frame tu ne verras rien (à moins de forcer avec un updatstage)

Ainsi, les objets complexes ne sont pas scannés, seul leur équivalent low-poly (une box, un cylindre,...) l'est ;)

#6 gegedade

    Ceinture Marron

  • Members
  • 125 messages

Posté 12 octobre 2011 - 05:05

Ouaouh, super !

Merci merci. Je tiens tout le monde au courant de l'avancement du projet... Il semble hélas qu'il y en ait de moins en moins sous Director... Sic transit gloria mundi.

Amitiés

#7 papwal

    Ceinture Marron

  • Members
  • 199 messages

Posté 19 octobre 2011 - 04:09

y'a pas moyen de faire passer une modelList à la méthode modelsUnderLoc ?

comme ça il scanne uniquement tes proxy

tModelList = [member("3D").model("foo"),member("3D").model[10]]
tOptionsList = [#maxNumberOfModels: 10, #levelOfDetail: #simple, #modelList: tModelList]
m = sprite(5).camera.modelsUnderLoc(pt, tOptionsList)


#8 gegedade

    Ceinture Marron

  • Members
  • 125 messages

Posté 19 octobre 2011 - 05:26

Merci aussi !

En fait, c'est à la première commande qu'il est lent, et vraiment c'est assez aléatoire (parfois il met 3 secondes, parfois 10 - maintenant il n'y passe plus 18 secondes). Bon, ce n'est pas gênant du tout. Je regarderai qaund même si la commande est aussi lente en repérant un seul modèle en début de movie, puis en reproduisant la commande sur tous les modèles (qui sont très peu nombreux de toutes façons !).

Vous pouvez voir un tout début de résultat à http://www.larrau.or...ion/default.htm - pardon pour l'interface qui est pourrie, on en est au lancement du projet.

Amitiés directoresques !

#9 papwal

    Ceinture Marron

  • Members
  • 199 messages

Posté 19 octobre 2011 - 06:16

hein ???? ça se compte en secondes ????

y'a un gros problème dans ton programme alors là

heu... normalement les méthodes modelunderray / modelunderloc, c'est fait pour être balancé sur un petit nombre de proxies low-poly (boites ou tetraèdres), et ça prend normalement moins d'une milliseconde

#10 gegedade

    Ceinture Marron

  • Members
  • 125 messages

Posté 19 octobre 2011 - 06:53

Pas d'affolement ! C'est au premier appel de la fonction que ça se compte en secondes. Effectivement, les appels suivants durent moins d'une milliseconde...

J'ai mis les infos en début de post, c'est bien le premier appel qui me posait problème...

Mais ce n'est pas grave !





1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS - Tel. 0826 466 613 - Fax. 01 72 70 31 38

FFP