Rolltreppen

Aser

Erfahrenes Mitglied
tag zam
(eins vorweg, hab die Suchfunktion bereits genutzt^^)

ich will ne Rolltreppe basteln, da habe ich nun diesen coffee Code verwendet

Code:
main(doc,weg)
	{
	weg->InitLength(0);	
	var guide=doc->FindObject("Guide");
	var name;
	var len=weg->GetLength();
	var off_verb=22/len; // Länge Verbinder
	var off_kett=22/len; // Länge Kettenglied
	var kette=weg->GetDown();
	var anz=0;
	do
	{
		anz++;
		kette=kette->GetNext();
	}
	while (kette);
	kette=weg->GetDown();
	var off_verb2=off_verb/(off_verb+off_kett)/(anz/2);
	var off_kett2=off_kett/(off_verb+off_kett)/(anz/2);
	var rot=guide->GetRotation();
	var offs=Modulo(rot.z,2*PI)/(2*PI);
	var offs2=0;
	var pos,pos2,richt,m_kette;
	do
	{
		pos=weg->GetSplinePoint(weg->UniformToNatural(Modulo(offs,1)),0);
		kette->SetPosition(pos);
		name=kette->GetName();
		if (strcmp(name,"Kette"))
		{
			offs2=offs+off_verb; //Verbinder
			offs+=off_verb2;
		}
		else
		{
			offs2=offs+off_kett; // Kette
			offs+=off_kett2;
		}
		pos2=pos-weg->GetSplinePoint(weg->UniformToNatural(Modulo(offs2,1)),0);
		pos2=vnorm(pos2);
		m_kette=kette->GetMl();
		richt=vnorm(vcross(vector(1,0,0),pos2));
		m_kette->SetV2(pos2);
		m_kette->SetV3(richt);
		kette->SetMl(m_kette);
		kette->Message(MSG_UPDATE);
		kette=kette->GetNext();
	}
	while (kette);
	weg->FreeLength();
}


bisher gehts
mein Problem besteht darin, dass die Stufen am Anfang eine horizontale Bahn entlanglaufen (sollten).

Ich brauche daher ein Script, das dafür sorgt, dass die Stufen immer nach unten hängen, und sich nicht der Spline entlang ausrichten.
Glaub, dass das dann das selbe Prinzip ist wie bei einem Riesenrad mit seinen Gondeln

Vielen Dank im Voraus
 
Hi Aser!

Sollen die Treppen denn vor bzw. hinter den "Auftritten" sichtbar sein? Wenn nicht, reicht es doch, wenn Du einfach komplett auf die Ausrichtung verzichtest, die Treppen also horizontal bleiben...

Liebe Grüße,
Mark.
 
in der Kamerafahrt sieht man alles, mit diesem Gedanken habe ich auch schon gespielt, sorry, ich brauch immer noch Hilfe...
dennoch danke
 
Hi Aser!

Hm, nachdem ich's mir nun mal "genauer" angeschaut habe, komme ich drauf: ich weiß garnicht, was die "Treppen" unterhalb der Auftritte wirklich tun :-)

Somit folgend mal eine Möglichkeit, die Position und Rotation einfach voneinander trennt:
Coffee liegt am Null-Objekt, in dem sich die Treppen befinden.
Eine Spline namens "Pfad" bestimmt, "worauf" die Treppen "fahren" sollen.
Eine Spline namens "Rotation" bestimmt durch Ihre Z-Position (0-2pi) die Rotation der jeweiligen Treppe.
Das Null-Objekt "Motor" bestimmt mittels Winkel.B die Bewegung der Rolltreppe.

Code:
main(doc,op)
{
 // Position-Pfad
 var ppos  = doc->FindObject("Pfad");
 ppos->InitLength(0);
 var pposlen = ppos->GetLength();

 // Rotation-Pfad
 var prot  = doc->FindObject("Rotation");
 prot->InitLength(0);
 var protlen = ppos->GetLength();

 // Stufen zählen
 var count  = 0;
 var stair  = op->GetDown();
 while (stair) {
  count++;
  stair   = stair->GetNext();
 } 

 // Motor/Guide-Rotation -> Offset
 var guide  = doc->FindObject("Motor");
 var rot   = guide->GetRotation();
 var offset = Modulo(rot.z,2*PI)/(2*PI);

 // Treppen abarbeiten
 var cnt   = 0;
 stair    = op->GetDown();
 while (stair) {
  cnt++;
  var off = 1/float(count)*cnt+offset;
  var pos = ppos->GetSplinePoint(ppos->UniformToNatural(Modulo(off,1)),0);
  var rot = prot->GetSplinePoint(prot->UniformToNatural(Modulo(off,1)),0);
  rot.x = 0; rot.y = 0;
  stair->SetPosition(pos);
  stair->SetRotation(rot);
  stair = stair->GetNext();
 }
 ppos->FreeLength();
 prot->FreeLength();
}

Liebe Grüße,
Mark.
 
hmm
ich bin davon ausgegangen, dass mir lediglich ein Script fehlt, das jeweils pro Stufe diese hoizontal ausrichtet...
Für was brache ich dann da ein Z-Rotation-Spin:confused:
hmm... hab mit deinen Anweisungen nicht viel anfangen können... hab coffee so eingesetzt, wie ichs verstanden habe, kannst dus dir vielleicht ansehen?:rolleyes:
ich will ja nicht zuviel Zeit in anspruch nehmen, ich kenn nur niemanden, an den ich mich sonst wenden könnte^^
 

Anhänge

Hi Aser!
ich bin davon ausgegangen, dass mir lediglich ein Script fehlt, das jeweils pro Stufe diese hoizontal ausrichtet...
...hm, aber das ja nur, weil das Script von Dir diese Stufen tangential ausrichtet! Dein Script macht also so gesehen "zu viel" ;)

Code:
main(doc,op)
{
 // Position-Pfad
 var ppos  = doc->FindObject("Pfad");
 ppos->InitLength(0);
 var pposlen = ppos->GetLength();

//// Rotation-Pfad
// var prot  = doc->FindObject("Rotation");
// prot->InitLength(0);
// var protlen = ppos->GetLength();

 // Stufen zählen
 var count  = 0;
 var stair  = op->GetDown();
 while (stair) {
  count++;
  stair   = stair->GetNext();
 } 

 // Motor/Guide-Rotation -> Offset
 var guide  = doc->FindObject("Motor");
 var rot   = guide->GetRotation();
 var offset = Modulo(rot.z,2*PI)/(2*PI);

 // Treppen abarbeiten
 var cnt   = 0;
 stair    = op->GetDown();
 while (stair) {
  cnt++;
  var off = 1/float(count)*cnt+offset;
  var pos = ppos->GetSplinePoint(ppos->UniformToNatural(Modulo(off,1)),0);
//  var rot = prot->GetSplinePoint(prot->UniformToNatural(Modulo(off,1)),0);
//  rot.x = 0; rot.y = 0;
  stair->SetPosition(pos);
//  stair->SetRotation(rot);
  stair = stair->GetNext();
 }
 ppos->FreeLength();
// prot->FreeLength();
}
... die Rotation komplett auskommentiert setzt nun die Position der Stufen auf die "Positions-Spline", ohne dabei an ihrer Rotation zu rütteln -> Stufen bleiben horizontal ausgerichtet. Die zusätzliche Rotations-Spline nahm ich nur, da die Stufen bei einer "echten Rolltreppe" "über Kopf" den Rückweg nehmen. Du könntest also das "Drehverhalten" über diese zweite Spline korrigieren...

@Hierarchie:
_| Motor (Null-Objekt)
_| Pfad (Spline)
_| ggf. Rotation (Rotation)
[-] Null-Objekt mit Coffee-Script
___| stufe.1
___| stufe.2
___| stufe.3
___L etc

Liebe Grüße,
Mark.
 
Zurück