[résolu] : modelsunderloc très lent ?
#1
Posté 11 octobre 2011 - 11:03
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
Posté 11 octobre 2011 - 12:59
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
Posté 11 octobre 2011 - 07:06
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
Posté 12 octobre 2011 - 07:36
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
Posté 12 octobre 2011 - 02:58
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
Posté 12 octobre 2011 - 05:05
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
Posté 19 octobre 2011 - 04:09
comme ça il scanne uniquement tes proxy
tOptionsList = [#maxNumberOfModels: 10, #levelOfDetail: #simple, #modelList: tModelList]
m = sprite(5).camera.modelsUnderLoc(pt, tOptionsList)
#8
Posté 19 octobre 2011 - 05:26
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
Posté 19 octobre 2011 - 06:16
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
Posté 19 octobre 2011 - 06:53
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)









