Membran einer Box nach Sound "vibrieren" lassen...

CHaoSlayeR

Erfahrenes Mitglied
Hallo erstmal zusammen! :)

Ich bin schon seit einigen Jahren immer wieder hobbymäßig an Cinema 4D dran und hab momentan Cinema 4D XL R7.3 und R8.1 auf meiner Windows-Möhre.

So, und nun zu meinem Problem:

Ich habe eine Box modelliert:
<center><a href="http://www.chaoslayer.de/3dmodels.php" target="_blank"><img src="http://www.chaoslayer.de/3dmodels/big/eltax_full.jpg" border="0" alt="Eltax Silverstone 200 silver" title="Eltax Silverstone 200 silver"></a><br>...draufklicken, um mehr Informationen zu erhalten...</center>

Soweit so gut. Nun ist für eine Animation eine Kamerafahrt um diese Box vorgesehen. Es soll dabei Musik laufen (Sound mach ich alles eigentlich mit GoldWave und auch mit After Effects direkt beim Compositing aber auch gerade mit Surround-Sound gern mit Cinema 4D). Auch gut, nun soll sich aber die Bass-Membran dieser Box nach dem Sound mitschwingen, bzw. vibrieren. Ich hab schon vieles versucht, angefangen vom Sound2Spline-Plugin bis zum Vibrations-Expression, nichts hat meine Anforderungen auch nur Ansatzweise erfüllt!

Gibt es mittlerweile vielleicht schon nen gutes Plugin für solche Fälle? Weiß jemand, wie man das sonst hinkriegen könnte?

Ich könnte dazu auch auf andere 3D-Software umspringen wie zum Bleistift MAYA, 3ds max, etc.

So, danke schon mal für alle, die evtl. Hinweise oder Tipps für mich haben!


P.S.: Ich hab allerdings kein Bock (und keine Zeit) das Ding komplett per Hand zu justieren (da müsste ich mir ja jeden einzelnen Frame die Frequenzüberlagerungen für die Bass-Membran raussuchen und die Membran entsprechend animieren. Da die Animation länger als 1 Sekunde dauern soll fällt diese Variante schon mal aus wegen "is nich!".
 
Hi!

Habe auch geschaut nach einem Sound2Position oder Sound2Spline PlugIn: das kann ja wohl nicht wahr sein :(
Und mit XPresso und C.O.F.F.E.E kam ich leider auch nicht weiter.

Aber eine Idee hätte ich, auch wenn Du mich dafür wahrscheinlich erschlagen wirst :)
Du brauchst die Wave-Form als Bild, möglichst groß. Da Du ja nur die Bass-Box animieren willst, am besten noch einen Equalizer drüberschicken.
Wie gesagt, diese Waveform als Bild speichern und in C4D als Objekte/Spline-Grundobjekte/Vectorize importieren! -> "akt. Zustand in Objekt umwandeln" und diese Spline korrigieren:
Untere oder Obere Hälfte löschen, alle Punkte selektieren und Struktur/Oberfläche bearbeiten/Werte setzen. Dort verschiebst Du alle Punkte zu x=0.
So, das ist die Bewegung der Membran :)
Auf Spline ausrichten Expression und gut ist...
 
Hi!

Uff, hätte nicht anfangen dürfen, sooo einfach ist C.O.F.F.E.E nun doch nicht, daß man's an einem Tag lernen kann... :)
Und dementsprechend unkonfortable ist es geworden, aber irgendwie geht's:
Mit folgendem Script kann man die Punkte einer Spline anhand der Samples eines .wavs in der Z-Position ausrichten.
Dabei wird das .wav durch die Anzahl der Punkte der Spline geteil und halt der Wert des jeweiligen Samples zur Z-Koordinate des jeweiligen Punktes.
Damit das Ergebnis wenigstens Befriedigend ist:

1) Spline erstellen, die soviele Punkte hat, wie die .wav Frames hat und den Namen "Spline-Objekt" haben muß (ja, ich sag ja unkonfortabel!).
(Spline mit zwei Punkten -> Objekt-Eigenschaften/Zwischenpunkte:Natürlich, Anzahl: Frames des .wav -> akt. Zustand in Objekt verwandeln)

2) Auf Spline: Neue Expression/Coffee-Expression. Script dort einfügen. Ausführen, .wav wählen. Coffee-Expression gleich danach wieder löschen oder deaktivieren! (Jaaa, unkonfortabel, ich weiß...).

3) Die Punkte der Spline sollten nun in etwa der Waveform entsprechen.
X-Größe der Spline auf 0 und Z nach belieben.
Membran-Spline mit "Auf Spline ausrichten Expression" bewegen lassen...

Klingt kompliziert? Hm, besser als Handarbeit, oder :)
PHP:
main(doc,op)
{
	println("=====Get Soundfile=====");
	var filename = GeGetRootFilename();
	filename -> FileSelect("Sound-File",0);

	var snd = new(BaseSound);
	snd->Load(filename);

	var snd_len = snd->GetSampleCount();
	println("Array-Length: ",snd_len);

	println("=====Spline=====");
	var snd_spl = doc->FindObject("Spline-Objekt");
	var spl_arr = snd_spl->GetPoints();
	var spl_len = sizeof(spl_arr);
	println("Spline-Length: ",spl_len);

	println("=====Set Pointpositions=====");
	var spl_pnt;
	var i;
	for (i=0; i<(spl_len-1); i++)
	{
		spl_pnt = snd_spl->GetPoint(i);
		spl_pnt.z = snd->GetSample((snd_len/spl_len*i),0);
		snd_spl->SetPoint(i,spl_pnt);
		op->Message(MSG_UPDATE);
		println("Set ",i," to ",spl_pnt.z);
	}
}
 
Sorry, dass ich mich erst jetzt wieder melde. War nen paar Tage ohne Rechner unterwegs...

Also ich hab das mal ausprobiert, jedoch sowohl mit R8.1 das bei mir irgendwie nicht. Cinema 4D hängt sich dabei immer auf. Also er scheint zwar was zu machen, aber das scheint ewig zu dauern.

In R7 bekomm ich immer nen Error in dieser Zeile:

var spl_arr = snd_spl->GetPoints();

Error: "Incompatible values... NIL / OBJECT"

Desweiteren ist mir erst jetzt aufgefallen, dass ein Spline mit maximal 5000 Punkten unterteilt werden kann. Allerdings hat meine Audio-Datei über 8 Millionen Frames bzw. Samples. Sollte ich da einfach die Sample-Rate runtersetzen? Ich hab das allerdings nicht gleich mit der vollen Datei getestet, sondern mit einem Ausschnitt mit 4100 Frames, also bei mir dann 0,093 Sekunden (44'100 Hz Sample-Rate).

Außerdem hab ich nen Formel-Grundobjekt benutzt, um nicht sofort ein Spline zu erhalten. Was du als "zweipunkt Spline" bezeichnet hast konnte ich nicht finden.

Soll das eigentlich ne Mono-wav sein? 16-bit? 8-bit? signed? unsigned? etc. brauche noch mehr Informationen wie du das hingekriegt hast. Welche Version von C4D hast du dabei benutzt?

Trotzdem ein großes "DANKE" schon mal für deine Bemühungen! :)
 
Hi!

Mit Frames meinte ich die Bilder der Animation, also die 1/25 Sekunden!
D.h. bei 10 Sekunden Ton -> 250 Punkte für das Spline, nur um wenigstens bei jedem Frame eine Position zu haben.
Und ganz grundsätzlich: das Script macht nix anderes, als den Ton durch die Anzahl der Punkte der Spline zu teilen und "genau" den dortigen Wert in eine Koordinate zu übernehmen. Keine Interpolation, o.ä...

Und ich muß Dir sagen, daß das Script auch bei mir (v8) abschmierte, wenn ich es z.B. aktiviert ließ - dann blieb allerdings nichts stehen, sondern Cinema4D war so sauer, daß er ohne "Tschüß" zu sagen verschwand :(
Deshalb die "so genaue" Anleitung, die funktionieren sollte.

Probiere es also am besten mal mit wirklich vorerst nur 10 Sek Ton -> 250 Punkte Spline...
(mit der zwei Punkte Spline, die man teilt, meinte ich ganz simple "...-Spline zeichen" und zwei Punkte erzeugen :)

Sorry, hoffe ich mache Dir mit dem deppertem Script nicht mehr Arbeit als ohne; würde es gerne "vernünftig" programmieren, dazu fehlt mir aber im moment leider die Zeit...
 
So, jetzt hab ich die COFFEE-Expression zum laufen gebracht, war ja eigentlich doch kein Problem (war wohl nur zu blöd, die Anleitung so zu interpretieren, wie sie gemeint war)...

...ich konnte zumindest das Spline erstellen. Mein nächstes Problem sieht allerdings folgendermaßen aus:

<center><img src="http://www.chaoslayer.de/img/%5Bothers%5D/c4d_bass1.png" border="0"></center>

So, da ist meine Bassmembran mal von oben in der Isobatendarstellung. Man sieht also, dass das Ding schön einfach ist. Da das aber auch genauso in der Realität aussieht (zumindest die Aussenseite) ist das auch gut so. Wenn die Membran nun schwingen soll, dann sollen sich nur die im Bild markierten Punkte des Rotations-Splines bewegen, die anderen Punkte ausserhalb sind diejenigen, die fest mit der Aufhängung der Membran verbunden sind. Wie krieg ich das jetzt hin, dass die Punkte jeweils ihre Z-Position nach dem Spline (den ich hier mal "position" getauft habe) zu richten? über PLA kriegt man leider nur manuelle Veränderungen hin, nicht aber Positionsveränderungen einzelner Punkte des Splines den Punkten folgend eines anderen Splines. Mein erstes Modell von der Membran bestand aus drei Teilen und wäre hier zur reinen Animation besser geeignet, sieht jedoch in Detail-Renderings absolut e aus:

- Lathe-NURBS (membran innen)
- Ring (Übergang von beweglichem zum festen Teil der Membran)
- Röhre (festes Außenteil)

Also steck ich gleich im nächsten Problem. Trotzdem schon mal danke für dein COFFEE-Expression, das werd ich wohl noch öfter benutzen, wie mir scheint. Vielleicht bau ich das ja noch mal aus, wenn meine eigenen Programmierkenntnisse etwas fortgeschritten sind und ich dazu die nötige Ruhe hab... :)
 
Zuletzt bearbeitet:
Hi!

"Der Computer hilft uns Probleme zu lösen, die wir ohne ihn garnicht hätten." :)

Hmpf, mit einem Loft-Nurbs hättest Du eine ganze Spline zu animieren...

Aber: über Xpresso kannst Du ganz simple die Punkte ansprechen. Lasse ein Null-Objekt ("null-on-wavespline") auf der Waveform-Spline entlangfahren. Mit der Xpresso-Node "Punkt" weist Du nun dem gewünschten Punkt (Punkt-Index) der Box-Lathe-Nurbs die jeweilige Koordinate des "null-on-wavespline" zu.
Bei mehreren Punkte kannst Du mit dem "Iteration"-Node den Punkt-Index mit mehreren Punkten bedienen...
 

Anhänge

  • membran.gif
    membran.gif
    2,1 KB · Aufrufe: 830
Hi!

Geh, Zeit hin oder her, so ein beknacktes Programm läßt einen echt nicht los:
Habe mich nocheinmal drangesetzt... :rolleyes:

Diesmal wirklich ein wenig kompfortabler:
1.Null-Objekt erstellen.
2.Dort "Neue Expression/C.o.f.f.e.e Expression".
3.Coffee-Tag wählen und dort angefügtes Script "Laden..."
4."Ausführen".
5.Soundfile wählen. Das Script erzeugt die Spline "waveform".
6.fertig :)

Anmerkung: da es sich ja um eine "Expression" und nicht um ein "PlugIn" handelt, wird das Script immer wieder gestartet. Dem habe ich Abhilfe geschaffen, indem geprüft wird, ob die Spline "waveform" existiert: wenn ja, wird das Script nicht mehr ausgeführt...
Dennoch: nach Spline-Erstellung am besten Coffee-Expression löschen...
 

Anhänge

  • c4d_waveform.txt
    1,9 KB · Aufrufe: 169
COOL! :)

bei mir unter R7 super, unter R8.1 gar nicht, da hängt er sich immer noch auf. Aber besser so als andersrum. In XPresso muss ich mich erst mal nen bissl einarbeiten, scheint ja wohl nen mächtiges Tool zu sein...

...aber irgendwie gefällt mir das noch nicht so. Ich hab mal nen paar kleine ausschnitte von songs gemacht und auch ne simple Bewegung der Membran dazu hergestellt, jedoch ist die Spline noch verbesserungswürdig, meines erachtens nach....

Erster Vorschlag:

da mir das nicht gefällt, dass nur genau der Wert des Sounds an einem minimalen Punkt jeweils gemessen wird könnte man die Bewegung etwas harmonischer wirken lassen, indem man den nächsten Punkt vorberechnet und aus dem arithmetischen Mittel der Summe sämtlicher Sound-Samples zwischen diesen beiden Punkten so eine bessere Näherung an eine realistische Bewegung bei nur 25 FPS erhalten. Man nimmt dann das Ergebnis des Mittelwertes als y-Wert für den Spline und nicht ein einzelnen herausgegriffenen Punkt. Ich habe nämlich beobachtet, wie im Spline einige sehr markante Stellen (z.B. beats auf der Base-Drum) komplett fehlen, was mir nach einem Testrendering erst aufgefallen ist.


Zweiter Vorschlag:

Da ich selbst die Animation an sich so realistisch wie möglich machen möchte, werde ich für dieses Ding auf jeden Fall auch Motion Blur verwenden. Könntest du eine Stelle im Expression einbauen, an der man bestimmen kann, wieviele zwischenpunkte man in der Spline haben will, zwischen den Hauptpunkten für jeden einzelnen Frame im Film? Das wär cool, so 9-fach oder 16-fach würd ich dann schon machen wollen (auch wenn das Rendering dann wahrscheinlich das Mac-Labor in der Hochschule mal ne Woche lang ausser Kraft setzt...). Durch das Motion Blur wird dann der Eindruck verstärkt, dass die Membran wirklich im Fim so sauschnell schwingt, wie das in der Realität der Fall ist...

Ich werd mal versuchen, ob ich selbst in deinem Expression durchsehe und mal gucken, ob ich da was rumpfuschen kann, sodass das stimmt, hehe...
 
Hi!

Bzgl. Interpolation und feineres Sampling:
Sorry, aber von meiner Seite war's das... :(
Aber ich denke mal, das Script ist wirklich nicht kompliziert und diese Änderungen dürften ein Klacks sein:
feineres Sampling: über snd_frames und pointCount erhöhen.
Interpolation: hatte ich auch angedacht, befürchtete nur, die schnelle Variante: statt "einem" Sample immer Snd_Samples/Snd_Frames Samples zu nehmen könnte "Null" produzieren... Somit eigentlich mein Grundgedanke: Sound im Audioprogramm vorher mit dem Equalizer zusammenstutzen und vielleicht sogar "glätten" lassen...
Noch viel Spaß und wenn Du eine feine Lösung hast, poste die doch bitte hier, würd' mich interessieren... :)
 
Zurück