Forums Développement Multimédia

Aller au contenu

Demande d'accompagnement et formation pour projet

Director

17 réponses à ce sujet

#1 mathbell

    Ceinture Jaune

  • Members
  • PipPip
  • 17 messages

Posté 21 August 2009 - 20:49 PM

Bonjour a tous,

Je suis débutant sous director.

Toutefois après une semaine travaille sur diector j'ai réalisé une petit application qui permet de faire :
- pivoter
- translater
- et zoomer
un objet en 3d provenant de Google Sketch up via une interface utilisateur "bouton"
Je me suis aidé du didacticiel suivant:

http://download.macromedia.com/pub/directo..._for_dir_fr.zip

Mais je bute sur des notions donc je ne maîtrise pas du tout.

1)Problème de lecture de l'anime après publication


Message du d'erreur voir mon lien
http://www.flagrantdelice.net/3D/test3.htm

2)rotation orbitale de la camera via un bouton

j'ai trouvé un script:
model.rotate(vector(10,10,10), vector(0,1,0), 20, #world), 20, sprite(1).camera)

Sur mon bouton ça devrais donner cela:

property pClick

on mouseenter(me)
-- curseur de souris entre sur le bouton
pClick = 0
end

on mousedown(me)
-- souris dans la surface du bouton, on orbite la caméra
-- si un clic survient, on stoppe l'orbite
if(pClick) then return
else model.rotate(vector(10,10,10), vector(0,1,0), 20, #world)

end

on mousewithin(me)
-- clic souris activé
pClick = 1
-- orbite...
model.rotate(vector(10,10,10), vector(0,1,0), 20, #world)
end

mais j'ai le message d'erreur suivant
-
"scrpt error: Operation expected
else model?.rotate(vector(10,10,10), vector(0,1,0), 20, #world)

J e comprend pas trés bien, si je fait une rotation simple exemple:
sprite(1).camera.rotate(0,0,0.2)

ça fonctionne mais c'est pas ce que je veux, car je voudrait plutôt faire une rotation orbitale.

Je vous fournie tous les fichiers pour que vous voyez plus en précision mes problème.
http://www.flagrantdelice.net/3D/source/testexemple2.rar

Bien à vous

Votre Padawan apprenti gourou.gif

Mathieu


#2 mathbell

    Ceinture Jaune

  • Members
  • PipPip
  • 17 messages

Posté 22 August 2009 - 18:54 PM

Aidez moi je suis pommé ...

icon_rolleyes.gif

#3 glurp

    Modérateur

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 1260 messages

Posté 22 August 2009 - 19:16 PM

Pour un mouvement orbital, je t'ai expliqué ma manière de faire icon_wink.gif http://director.mediabox.fr/index.php?show...ost&p=52478

Essaie de ne pas utiliser de code tout fait que tu ne comprends pas... Tente plutôt de créer toi même ce comportement, tu n'apprendras que plus vite.

#4 mathbell

    Ceinture Jaune

  • Members
  • PipPip
  • 17 messages

Posté 24 August 2009 - 19:02 PM

Salut Glurp,

J'ai réussi a faire les 2 mouvements orbitaux :
en effet Rotation plus translation:

mais mon problème maintenant est que :
si je suis en vue de dessus la camera fait une orbite et plus une rotation.
Ce que je viens de comprendre grâce à toi c'est que il me faut allouer sur le même bouton, en fonction de mon inclinaison, une rotation simple dans le cas ou la caméra n'a pas effectuée d'orbite ou un orbite dans le cas ou la camera a fait une inclinaison.

Mais la je ne sais pas vraiment comment je peux m'y prendre.
Toute fois j'ai une idée. Je peux en plus de changer les coordonnée de a camera changer les coordonné du modèle.

Je t'avoue que je ne sais pal le faire.

En plus de tout cela, il me faut bloquer la camera ou le modèle afin d'éviter que le terrain se renverse comme sur cette exemple

http://v3d.pagesjaunes.fr/montpellier/


Pour voir le résultat voici la source:
http://www.flagrantdelice.net/3D/source/exemple3.rar

c'est pas si simple que je pensais ...

Mathieu


#5 glurp

    Modérateur

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 1260 messages

Posté 25 August 2009 - 20:05 PM

Salut mathbell,

J'admets que ton problème m'échappe un peu...
Hélas, je n'ai plus de licence D11 pour le moment et je ne peux donc pas ouvrir ton exemple.

Je te déconseille de bouger le modèle si ce que tu veux c'est un mouvement de caméra (ça sent trop la bidouille).
En théorie, tu dois pouvoir manipuler ta caméra comme tu veux, mais il faudra peut-être se replonger dans ses math icon_wink.gif

Quand tu travailles sur un mouvement 3D, il est souvent plus simple de se faire une représentation papier (perso je me fais des petits dessins) avant de programmer.

Mais si la trigonométrie te donne des boutons, n'oublie pas que Director t'aide avec des fonctions toutes faites comme "angleBetween" et "pointAt"

#6 mathbell

    Ceinture Jaune

  • Members
  • PipPip
  • 17 messages

Posté 25 August 2009 - 22:11 PM

Salut ,

J'étudie "angleBetween" et "pointAt" pour voir comment ça marche
sinon j'ai réussi a faire fonctionner l'application tu peux aller voir le résultat ici icon_biggrin.gif icon_biggrin.gif icon_biggrin.gif icon_biggrin.gif

http://www.flagrantdelice.net/3D/test%20exemple3.htm

tu comprendras mon problème de changement de repère en rotation incliné ou a plat.

Je vais y arriver, je suis motivé je laisserai pas tomber !! icon_twisted.gif icon_twisted.gif

merci pour ton aide précieuse

Mathieu

#7 glurp

    Modérateur

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 1260 messages

Posté 26 August 2009 - 09:51 AM

Ok, je vois.

Tente de travailler plus simplement ; au lieu d'essayer de corriger en relatif avec des rotates utilise plutôt transform.rotation en absolu.

Finalement tu n'as besoin que de 4 valeurs :

- le point visé
- l'inclinaison de la camera
- la rotation de la camera
- la distance entre la camera et le point visé

Sur cette base, tu peux effectuer tous tes calculs dans une boucle.
Tes boutons ne modifies pas la position de ta camera directement mais ces valeurs.

#8 mathbell

    Ceinture Jaune

  • Members
  • PipPip
  • 17 messages

Posté 26 August 2009 - 13:11 PM

OK sa y est !

J'ai réussi a faire pratiquement, ce que je voulez comme résultat.
pour les rotations je laisse tomber les boutons , en définitive le clic gauche de la souris me convient trés bien.

http://www.flagrantdelice.net/3D/test%20exemple3.htm

Cependant:

Pour finaliser cette interface,

1) je voudrais bloquer la rotation verticale lorsque (afin d'éviter de me retrouvé dessous l'objet) :

- Bloquer quand la camera est en vue de dessus (pas de carte a l'envers ou au dessous)
- Bloquer quand la camera observe l'objet en vue de coté (comme si que l'on se trouvais au sol)

2) J'ai remarqué avec ma méthode, que la rotation se fait par rapport a l'objet et pas par rapport au monde ...
c'est à dire qu'il serait plus logique que je puisse changer le centre de rotation afin de pouvoir tourner autour d'un autre bâtiment sur la carte par exemple.

De plus il est vrai que grâce a des petit schémas c'est plus facile mathématiquement parlant.
Merci Infiniment Glurp pour ton aide si précieuse.

SUR MON OBJET 3D

Lingo


property _world
property axeY
property axeX
property camAxeZ
property clic
property rightClic
property lastLoc

on beginsprite me

_world = sprite(me.spritenum).member
axeY = _world.newmodel("axeY")
axeX = _world.newmodel("axeX")

camAxeZ = sprite(me.spritenum).camera -- _world.camera(1)

camAxeZ.transform.position = vector(0,0,500)

camAxeZ.parent = axeX
axeX.parent = axeY

camAxeZ.pointat(vector(0,0,0))

clic = false
rightClic = false

end


on mousedown me
clic = true
lastLoc = the mouseloc
end


on mouseup me
clic = false
end


on mouseupoutside me
clic = false
end


on rightMouseDown me
rightClic = true
lastLoc = the mouseloc
end


on rightMouseUp me
rightClic = false
end


on enterFrame me

if clic then
diffLoc = the mouseloc - lastLoc
-- horizontal
axeY.rotate(0,0,diffLoc.loch)
--axeY.rotate(2,diffLoc.locH,0) -- autre AXE, en fonction de l'orientation
-- vertical:
axeX.rotate(diffLoc.locv,0,0)

end if

if rightClic then
diffLoc = the mouseloc - lastLoc
-- zoom / dezoom
camAxeZ.translate(0,0,diffLoc.locv)
end if

lastLoc = the mouseloc

end


on moveTo mVector

axeX.transform.position = mVector

end


on setZoom mDistance
--changement camera/cible:
camAxeZ.transform.position = vector(0,0,mDistance) -- avec mDistance >0
end


on endsprite me
_world.deletemodel(axeX.name)
_world.deletemodel(axeY.name)
end

Math

#9 mathbell

    Ceinture Jaune

  • Members
  • PipPip
  • 17 messages

Posté 26 August 2009 - 22:16 PM

j'ai mis à jour mon projet,

lien ici:
le clic gauche de la souris permet de faire la rotation

http://www.flagrantdelice.net/3D/NKC.htm

Ici on se rend bien compte que la camera orbite toujours par rapport au même point, c'est gênant !

J'attends vos critiques et vos conseilles

Mathieu icon_eek.gif

#10 glurp

    Modérateur

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 1260 messages

Posté 27 August 2009 - 08:46 AM

Hello,

rotate peut prendre un 4è paramètre qui est le point de repère. essaie avec #self (par défaut, c'est #world)

#11 mathbell

    Ceinture Jaune

  • Members
  • PipPip
  • 17 messages

Posté 27 August 2009 - 23:23 PM

Salut glurp

Merci pour cette 4 éme valeur.
Cela fonctionne comme je le desirais avec les translations sur mes flèches de déplacement.

MES LORSQUE J'APPLIQUE SUR le code de l'effet souris pour le rotation, rien ne se passe. l'origine du centre de rotation reste le méme

je re poste le code appliqué sur mon objet 3D:

Lingo


property _world

property axeY
property axeX
property camAxeZ

property clic
property rightClic
property lastLoc

on beginsprite me

_world = sprite(me.spritenum).member
axeY = _world.newmodel("axeY")
axeX = _world.newmodel("axeX")

camAxeZ = sprite(me.spritenum).camera -- _world.camera(1)

camAxeZ.transform.position = vector(0,-16000,12000)

camAxeZ.parent = axeX
axeX.parent = axeY

camAxeZ.pointat(vector(0,3000,0))

clic = false
rightClic = false

end


on mousedown me
clic = true
lastLoc = the mouseloc
end


on mouseup me
clic = false
end


on mouseupoutside me
clic = false
end


on rightMouseDown me
rightClic = true
lastLoc = the mouseloc
end


on rightMouseUp me
rightClic = false
end


on enterFrame me

if clic then
diffLoc = the mouseloc - lastLoc
-- horizontal
axeY.rotate(0,0,diffLoc.loch)
--axeY.rotate(0,diffLoc.locH,0) -- utiliser l'un ou l'autre, selon l'orientation du pivot

-- plan vertical:
axeX.rotate(diffLoc.locv,0,0,#world)

end if

if rightClic then
diffLoc = the mouseloc - lastLoc
-- zoom / dezoom
camAxeZ.translate(0,0,diffLoc.locv,)
end if

lastLoc = the mouseloc

end


on moveTo mVector

axeX.transform.position = mVector

end


--on setZoom mDistance
--pour chancher la distance camera/cible:
-- camAxeZ.transform.position = vector(0,0,mDistance) -- avec mDistance >0
--end


on endsprite me
_world.deletemodel(axeX.name)
_world.deletemodel(axeY.name)
end


Dans le cas d'un objet en 3D comme une théière par exemple, pour la visualisation il est nécessaire que l'origine de la rotation et d'inclinaison soit au centre de l'objet.
Mais dans le cas d'un Terrain en 3D il est pertinent de pouvoir modifier le point d'origine et donc de changer les coordonnées du centre de rotation .

Ai-je mal compris ?
que dois je faire pour déplacer le centre à l'origine de mon modelé ?
Dois je modifier le centre de mon objet ou déplacer le point visée de la camera ?


Mathieu

#12 mathbell

    Ceinture Jaune

  • Members
  • PipPip
  • 17 messages

Posté 28 August 2009 - 19:10 PM

Salut

J'ai mis à jour mon projet

j'ai l'origine au centre de mon objet

http://www.flagrantdelice.net/3D/NKC.htm

Mathieu

#13 glurp

    Modérateur

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 1260 messages

Posté 29 August 2009 - 11:33 AM

Salut mathbell,

Je persiste à dire que selon moi la solution la plus simple est celle expliquée ici icon_rolleyes.gif :
http://director.mediabox.fr/index.php?show...ost&p=52523

Dans ton cas tu ne pourras pas éternellement tourner autour du monde (en gros le point (0,0,0)).
Si tu te balades dans une ville, à chaque translation, tu devras aussi déplacer ton point de repère.

Pour vérifier si tu ne passes pas "en dessous" ou "à l'envers", il y a plusieurs méthode mais la plus simple est de vérifier que l'inclinaison de ta camera (transform.rotation.x je pense ici) est entre 0 et 90 (ou -90, à vérifier). En cas de dépassement, tu la redresses dans un sens ou dans l'autre.

#14 mathbell

    Ceinture Jaune

  • Members
  • PipPip
  • 17 messages

Posté 30 August 2009 - 16:12 PM

Citation (glurp @ Aug 29 2009, 11:33 AM) Voir le message
Salut mathbell,

Je persiste à dire que selon moi la solution la plus simple est celle expliquée ici icon_rolleyes.gif :
http://director.mediabox.fr/index.php?show...ost&p=52523

Dans ton cas tu ne pourras pas éternellement tourner autour du monde (en gros le point (0,0,0)).
Si tu te balades dans une ville, à chaque translation, tu devras aussi déplacer ton point de repère.

Pour vérifier si tu ne passes pas "en dessous" ou "à l'envers", il y a plusieurs méthode mais la plus simple est de vérifier que l'inclinaison de ta camera (transform.rotation.x je pense ici) est entre 0 et 90 (ou -90, à vérifier). En cas de dépassement, tu la redresses dans un sens ou dans l'autre.


Salut Glurp,

Merci , j'y suis arrivé !!!
Glurp = Love

voila ce que j'ai fait:


on enterFrame me

if clic then
diffLoc = the mouseloc - lastLoc
-- horizontal
axeY.rotate(0,0,diffLoc.loch)

--axeY.rotate(0,diffLoc.locH,0) -- utiliser l'un ou l'autre, selon l'orientation du pivot

-- plan vertical:
-- Bloque la camera à 90°

if axeX.transform.rotation.x < 90 then
axeX.rotate(diffLoc.locv,0,0,#self)


else if axeX.transform.rotation.x > 90 then
axeX.transform.rotation.x = 90
end if

if axeX.transform.rotation.x < 90 then
axeX.rotate(diffLoc.locv,0,0,#self)


else if axeX.transform.rotation.x > 90 then
axeX.transform.rotation.x = 90

end if

---------------------------------------------------------
-- Bloque la camera à 90°

if axeX.transform.rotation.x > 0 then
axeX.rotate(diffLoc.locv,0,0,#self)


else if axeX.transform.rotation.x < 0 then
axeX.transform.rotation.x = 0
end if

if axeX.transform.rotation.x > 0 then
axeX.rotate(diffLoc.locv,0,0,#self)


else if axeX.transform.rotation.x < 0 then
axeX.transform.rotation.x = 0

end if

end if



Toutefois, tu as bien compris mon probléme du centre de mon monde
Mais la , pour resoudre ce probléme, je suis nul , je manque de vocabulaire lingo
Alors comment je peux faire concrètement pour qu'à chaque translation, je déplace mon point de repère.

j'imagine que je dois me tourner sur le code des flèches ...

j'y suis presque
Pour voir le resultat c'est ici:

http://www.flagrantdelice.net/3D/NKC.htm

Math

#15 glurp

    Modérateur

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 1260 messages

Posté 31 August 2009 - 17:27 PM

Salut mathbell,

Bien, ton code avances icon_wink.gif

Pour le point de repère qui change ce n'est pas bien compliqué.
C'est juste une valeur "sur le sol" qui subit les même translations que la camera.

Ensuite tu l'utilisera à la place du #world dans le rotate().

#16 mathbell

    Ceinture Jaune

  • Members
  • PipPip
  • 17 messages

Posté 04 September 2009 - 15:25 PM

Salut Glurp,

J'ai remplacé "#world" par "camera" , en effet le centre du point visé de la camera se modifié lors de mes translations.

mais maintenant le problème et que lorsque j'incline la camera, mes rotations ne sont plus des orbites mais cela bascule ma carte
icon_redface.gif icon_redface.gif icon_eek.gif

rrrrrrrrrrrrrrrrrraaaaaa
je suis certain que la solution doit être simple, mais je n'y parvient pas.

help ....

#17 glurp

    Modérateur

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 1260 messages

Posté 08 September 2009 - 22:29 PM

Salut mathbell,

Chose promise, chose due... ;)
J'ai donc fait un tuto sur le sujet, j'espère que ça t'aidera pour ton travail.
http://director.medi...?showtopic=9355

#18 papwal

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 201 messages

Posté 18 September 2009 - 04:03 AM

Ca fait plaisir de voir qu'il y'a des gars qui bossent sur le wiki

Merci à toi glurp gourou.gif



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

FFP