Adobe Acrobat 3D, JavaScript i animacje. Dodatek.

6 Comments

Pomiędzy wierszami naszego cyklu wystąpiła nagle potrzeba stworzenia szybkiej instrukcji montażu/demontażu elementów produktu. Czyli dokument PDF, zaimportowany model z jedną tylko animacją. I to taką, żeby po kliknięciu przycisku animacja odtwarzała się w przeciwną stronę. Proste?

AnimationController wyposażamy w jedną linijkę kodu:

var Animation1 = new AnimationController(scene.animations.getByName("Sequence-1"));

Teraz Advanced->Document Processing->Document JavaScripts, tworzymy nowy skrypt, podajemy mu znaną funkcję Context() i nakazujemy ustawić początkowe właściwości animacji:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 
function Context()
{
    return getAnnots3D(0)[0].context3D;
}
 
// funkcja odwracająca kierunek animacji po jej zakończeniu
function reverse()
{
  // nie ruszamy animacji w biegu
  if(Context().Animation1.getRunning())
    return false;
  // odwroc animacje
  Context().Animation1.setPlayForward(!Context().Animation1.getGoingForward());
  // usun timer
  app.clearInterval(timeout);
}
 
function initialize()
{
  // sprawdzanie, czy obiekt 3D jest zainicjalizowany
  if(waitingFor3DActivated)
  {
    var a3d = getAnnots3D(0)[0];
    if(a3d.activated)
    {
      // obiekt zainicjalizowany, teraz można już na nim pracować
      waitingFor3DActivated = false;
      app.clearInterval(timeout);
      context3D = a3d.context3D;
 
      // najpierw odtwarzamy do przodu
      Context().Animation1.setPlayForward(true);
      // na wszelki wypadek, reset
      Context().Animation1.reset();
    }
  }
}
 
timeout = app.setInterval( "initialize()", 1000 );
var waitingFor3DActivated = true;

Teraz tworzymy przycisk i w jego właściwościach, w zakładce Actions wybieramy Mouse Up->Run a JavaScript.

Jaki skrypt chcemy uruchomić? Taki, który zatrzymaną animację uruchomi w kierunku przeciwnym do tego, z którego przyszła lub odwróci bieg aktualnie odtwarzanej animacji. No to jazda:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// jesli animacja jest w trakcie
if(Context().Animation1.getRunning())
{
  Context().Animation1.pause();  // musze wyjasniac? :)
  // odwroc animacje
  Context().Animation1.setPlayForward(!Context().Animation1.getGoingForward());
  // usun timer
  app.clearInterval(timeout);
}
 
// uruchom animacje (w ustawionym kierunku)
Context().Animation1.play();
// zaloz timer
timeout = app.setInterval("reverse()", 100);

Cała filozofia. Jeśli komuś się przyda, to te 5 minut poświęcone na napisanie tego posta nie będzie pięcioma straconymi minutami :)

6 thoughts on “Adobe Acrobat 3D, JavaScript i animacje. Dodatek.”

  1. Dzień dobry, bardzo ciekawy tutorial, ale mam pytanko – czy można gdzieś znaleźć skrypt, który będzie obracał animację obiektu o 360 stopni wokół osi pionowej? Mam bardzo złożony model, a szef się uparł i nie umiem tego pewnie prostego tematu rozgryźć.. Dziękuję za ewentualną odpowiedź.

    1. @Romek:
      Na chwilę obecną, z tego co wiem, nie da się tego zrobić programowo. Ktoś (czyt. twórca modelu, czy ogólnie osoba zajmująca się modelami 3D) musi utworzyć animację zawierającą obrót modelu. Następnie z pomocą AnimationController należałoby ustawić dla tej animacji setLoop(true) i ewentualnie sterować play/pause/reset.

      Co do programowego tworzenia animacji, przyznam się, nie interesowałem się tym tematem (rozejrzę się), ale jak znam Adobe, nie ma takiej możliwości. Bo to by było za duże ułatwienie :)

  2. to chyba jedyna strona ktora wogole cos tlumaczy tak po ludzku :) ale…
    wszystko swietnie ale u mnie nie dziala ten sposob. model 3d wrzucilam w 3d reviewer, stworzylam banalna animacje demonatzu/montazu czesci, wyeksportowalam wszystko do pdf, stworzylam przycisk play animation no i lipa bo cos gdzies mi nie wyszlo jak nalezy. problem w tym ze moja wiedza o javascript jest zadna wiec szukanie gdzie jest blad to dla mnie nie wykonalne. stad tez mam kilka pytan i bede bardzo wdzieczna za odpowiedz: czy eksportujac moj model do pdf istnieje mozliwosc ze animacja sie niewyeksportuje? ta jedna linijka kodu ktora nalezy wklepic do animation controller…mowimy caly czas o tym pliku ktory byl jako zalacznik do controlling animations? mam wrazenie ze caly czas robie wszystko jak przedstawiles a jednak animacja nie dziala….
    z gory dziekuje za wszelkie wskazowki,
    pozdrawiam

    1. @Aga: trochę czasu minęło od kiedy ostatni raz bawiłem się w animacje, ale na szybko spróbuje odpowiedzieć to, co pamiętam:

      1. Tak, AnimationController to skrypt dołączony do “Controlling Animations”. Trzeba go zapisać na dysku, a potem dołączyć do swojego PDFa.
      2. Trzeba też pamiętać o drugim pliku (document javascript) i o funkcji Context(). Gdzieś to na pewno napisałem…
      3. Znając Adobe, owszem, możliwe jest, że przy eksporcie modelu do PDFa animacja zniknie. Możliwe, że zniknie cały model. Nie zdziwiłbym się, gdyby zniknął Twój monitor, albo Twój kot zamienił się w leminga (nie masz kota? Ale pracujesz w Acrobacie? To spójrz pod biurko…).
      Dla pewności sugerowałbym zapisać model w .u3d i wstawić go do nowo utworzonego PDFa.
      4. Wydaje mi się, że pisałem o jednej funkcji, a nie linijce, ale nie jestem pewien, czy mówimy o tym samym. Dla pewności – patrz punkt 2 powyżej.

    1. @Aga:
      Nie jestem pewien, czy dobrze rozumiem, ale wychodzi mi, że Context() masz podłożoną pod eventa, a powinno to być wrzucone do skryptów dokumentu ładowanych na starcie, czyli Advanced->Document Processing->Document Javascripts.
      Pamiętaj, żeby potem zapisać plik, zamknąć go (najlepiej cały program) i otworzyć ponownie.
      Jeśli to nie to, to się poddaję :/

      BTW, fajny francuski Acrobat! :)

Leave a Reply

Your email address will not be published. Required fields are marked *