Animationssequenz erst teilweise abspielen, dann weiter abspielen…

Fragen & Antworten zur Steuerung von 3D Inhalten in PDFs über JavaScript
Antworten
Ricpat
Beiträge: 5
Registriert: 09.01.2010, 05:45

Animationssequenz erst teilweise abspielen, dann weiter abspielen…

Beitrag von Ricpat » 12.07.2010, 21:01

Hallo liebe Acronauten und Freunde des Portablen Dokumenten-Formats!

Meine Wenigkeit ist zwar nicht unbedingt völlig neu auf dem Sektor PDF, bisweilen jedoch in diesem Forum noch nicht aktiv in Erscheinung getreten, da ich mir Kraft dieses wirklich guten Forums hier bisher immer schnell eine Lösung zu eigen machen konnte. Danke vorweg an dieser Stelle! 

Kürzlich bin ich auf ein PDF-Dokument gestoßen, welches eine sehr nützliche Funktion in sich birgt, die ich gern einmal zu durchleuchten wünsche. Und zwar handelt es sich um eine Datei mit 3D-Annotation, welche per Javascript über entsprechende Schaltflächen gesteuert werden. Beeindruckt hat mich hierbei die Tatsache, dass einer der vorhandenen Buttons mit gleich zwei Funktionen versehen war: Bei einmaligem Betätigen wurde ein Teil der im U3D-Modell hinterlegten Animation abgespielt und nach dem zweiten Betätigen ein weiterer Teil der Sequenz. Hier geht's zu diesem Beispiel …

der Button im Dokument verwendet folgenden Javascript-Befehl:
____________________________________

a3d = getAnnots3D(this.pageNum)[0];

if (a3d)
{
 c3d = a3d.context3D;
 if (c3d)
 {
  c3d.playSequenceAndSwitchReverse(*,*);
 }
}
____________________________________

Das hat mich sehr beeindruckt, da mir hierzu gleich die Idee kam, künftig die Handhabung interaktiver PDF-Dokumente weitaus einfacher und mit entsprechend weniger Buttons zu erstellen. Triviales Beispiel: Play- und Pause-Button etwa ließen sich problemlos in einem zusammenfassen, wie man es aus der Praxis auch von etlichen Bedienelementen kennt.

Leider ist es mir bisher noch nicht geglückt, an das eingebettete Javascript zu gelangen, welches dem 3D-Modell unterliegt. Daran versuche ich mich aber garnicht erst länger; das ist meines Wissens nicht so ganz ohne Weiteres (mit Multivalent …?) möglich.
Zudem kenne ich mich mit Javascript leider auch zu wenig aus, als dass ich mir da konstruktive Resultate versprechen könnte.
Bisher verwende ich das von Adobe veröffentlichte AnimationContoller-Javascript aus diesem Beitrag hier. Damit lassen sich ja eine ganze Menge objektbezogene Ereignisse, wie auch ansatzweise beschrieben, mithilfe einzelner Buttons triggern.

Zur Frage:
[fontsize=2]Gibt es eine Möglichkeit den oben erwähnten Javascript-Befehl auf das AnimationController-Script angwendet zu bekommen, durch etwaige gegenseitige Ergänzungen oder sonstige Anpassung?
[/fontsize]
Zugegeben stoße ich beim Stöbern auf den etlichen auch sehr aufschlussreichen Seiten von Adobe oft mangels fehlender Programmierkenntnisse auf unüberwindbare Verständnisslücken, welche den persönlichen Horizont an Möglichkeiten leider einschränken.
Empfehlungen zu einer passend ausführlichen Lektüre o.ä. zum Thema sei natürlich jederzeit willkommen!

Das soweit vorab…
Danke & Gruß
Ricpat

Ricpat
Beiträge: 5
Registriert: 09.01.2010, 05:45

Animationssequenz erst teilweise abspielen, dann weiter abspielen…

Beitrag von Ricpat » 27.08.2010, 12:16

Hatte es derweil nochmal hiermit – einem Skript von einem Bekannten – versucht, sprich also dem Button als Funktion "Javascript ausführen" zugewiesen:

____________________________________

private var an:boolean = true;

function Movie():void{
    if (an==true){
   
    // Spiele Film Vorwärtz

     C3D = getAnnots3D(0)[0].context3D;
 C3D.MyAnimation.setPlayRange(4,5);
 C3D.MyAnimation.setCurrentPosition(0);
 C3D.MyAnimation.setPlayForward(true);  
 C3D.MyAnimation.setPingPong(false);
 C3D.MyAnimation.play();

        an = false;
 
    }else{
  
  // Spiele Film Rückwärtz
 
 C3D = getAnnots3D(0)[0].context3D;
 C3D.MyAnimation.setPlayRange(0,4);
 C3D.MyAnimation.setCurrentPosition(0);
 C3D.MyAnimation.setPlayForward(true);  
 C3D.MyAnimation.setPingPong(false);
 C3D.MyAnimation.setLoop(false);
 C3D.MyAnimation.play();
   
        an =true;
    }
}


Movie(); 
____________________________________

Leider blieb auch dieses bisher erfolglos… Hierzu irgendwelche Ideen oder Anregungen?

Grüße
Ricpat

Ricpat
Beiträge: 5
Registriert: 09.01.2010, 05:45

Animationssequenz erst teilweise abspielen, dann weiter abspielen…

Beitrag von Ricpat » 08.09.2010, 11:37

Inzwischen wurde eine Lösung gefunden, die sich beschreibt, wie folgt:

Und zwar  habe ich jeweils eine JavaScript-Funktion unter dem Menüpunkt "Erweitert" >> "Dokumentverarbeitung" >> "Dokument-JavaScripts" angelegt.

Für das den sog. "Toggle-Button" der Animation, welcher jeweils einen Animations-, bzw. Zeitabschnitt im gegenseitigen Wechsel wiedergibt:
_____________________________________________

var stat = true;

function player()
{

    console.println("PLAY - function - "+ stat);
  

    C3D = getAnnots3D(0)[0].context3D;
    if(stat){
        C3D.MyAnimation.setPlayRange(0,4);
    }else{
        C3D.MyAnimation.setPlayRange(4,5);
    }
    C3D.MyAnimation.setCurrentPosition(0);
    C3D.MyAnimation.setPlayForward(true);  
   
    C3D.MyAnimation.play();

     stat = (stat==true) ? false : true;

}
_____________________________________________

Dem Button nebst der Annotation ist dann der Logik nach lediglich der Befehl "player();" zuzuweisen. Funktioniert bisher ohne Weiteres, wie gewünscht.

Für das Ein- und Ausblenden bestimmter Teile des 3D-Modells habe ich dann eine weitere JavaScript-Funktion unter "Dokument-JavaScripts" beigefügt:
_____________________________________________

var stat = true;

function onoff()
{

C3D = getAnnots3D(0)[0].context3D
C3D.scene.nodes.getByName("linke_Gehaeusehaelfte").opacity = (stat==true) ? 0.1 : 1;

stat = (stat==false) ? true : false;

}
_____________________________________________

Die Schalfläche triggert dann die Funktion durch den Befehl "onoff();" im JavaScript-Editor.

Selbiges werde ich zudem noch mit der Reihenschaltung mehrerer, verschieden perspektivischer Ansichten mit Hilfe eines einzelnen Buttons realisieren.
Hierbei bin ich mir noch nocht so ganz schlüssig, ob eine gänzliche JavaScript-Lösung notwendig ist – [fontsize=3]vielleicht kann sich speziell hierzu jemand zu Wort melden, der evtl. einen heißen Tipp zur Sache parat hat?[/fontsize]

Grüße
Ricpat

Antworten