Construction Set "Rotate" auf mehrere Objekte anwenden

Fellan

Freund des Hauses
Folgendes Szenario:
Sobald der Spieler Activator X betätigt, soll sich eine gesamte Schrankwand um 180 Grad drehen, sodass der Spieler die Rückseite der Schrankwand sieht. Das ganze soll aber nicht a la ""Plopp" - Schrankwand umgedreht" passieren, der Spieler soll dabei zusehen können, wie die Schrankwand erst langsam nach vorn fährt, sich dann dreht und wieder zurück an die Wand bewegt wird.

Problem dabei:
Wenn ich die Schrankwand per "Rotate"-Befehl über Zeit drehen lasse, dreht sich zwar die Schrankwand, aber nicht die Bücher darin bzw. die Gerätschaften dahinter, die der Spieler ja später noch benutzen soll.

Schrankwand in ihrer normalen Position
Das passiert, wenn man nur die Schrankwand dreht
So ähnlich soll es aber aussehen (Bücher bleiben an Ort und Stelle)
So soll es am Ende aussehen

Ist es möglich, mehrere Objekte mit "Rotate" rotieren zu lassen, wobei sie sich aber nicht um die eigene, sondern um die Achse von Objekt X drehen sollen?


Die Schrankwand soll sich aber natürlich nicht nur stumpf umdrehen, da dann die Hälfte der Schrankwand in der eigentlichen Wand verschwindet - das sieht nicht aus. Ich will, dass sich die Schrankwand erst schrittweise nach vorn bewegt, wo sie genug Raum zum drehen hat. Danach soll sie natürlich wieder zurück an die Wand fahren.

Gibt es einen Befehl wie "Rotate", mit dem man ein Objekt mit einer bestimmten Geschwindigkeit nicht rotieren, sondern in der Position verschieben kann?
 
hallo Fellan,also zu dem Problem mit den Gegenständen,das kannst du evt. lösen in dem du den auf dem regal vorhandenen Sachen eine neue ID gibst,und deren nif`s änderst und zwar mit NifSkope jede einzeln laden und unter"bhkCollisionObject\bhkRigidBody" den unterpunkt "MASS"auf 0.0000 setzt!
das hat zu folge das diese Gegenstände dann nicht mehr bewegt werden können!
der einzige nachteil währe das du die vorhandenen Bücher zwar noch lesen aber nicht mehr einstecken könntest!;)
ich denke das könnte so funzen:D
 
Nein, das möchte ich nicht. Ist es also nicht möglich, alle Objekte gleichzeitig zu bewegen so dass sie sich dann, wie im CS, um die Achse des erstgewählten Objektes bzw. des größten Objektes drehen?
 
Wenn ich Objekt X bewege, heißt das doch nicht, dass das Parent Y von X auch bewegt wird. Parent hat meines Wissens nur was mit "Activated" oder eben nicht "Activated" bzw. "Enabled" bzw. "Disabled" zu tun.
 
Joa, das wäre möglich. Nur müsstest du dafür mit Sin und Cos arbeiten. Und weil das CS nativ kein Cos und Sin unterstützt müsstest du ein Script mit Näherungswert davon verwenden (es gibt solche Berechnungen). Dann die Entfernung zum Rotationspunkt ausrechnen und X und Y Bewegung berechnen lassen und rotieren.
Das ist bestimmt nicht einfach, doch es ist möglich ;)

MfG
Junker Locklear
 
Was heißt denn bitte "nativ" Sinus und Kosinus unterstützen? Und um welchen Sinus- oder Kosinuswert geht es? Wie errechne ich den Näherungswert von Sinus oder Kosinus von was?

Ist es einfach möglich, ein Objekt bzw. mehrere Objekte sichtbar zu verschieben? Ich will, dass ein Sound abgespielt wird und die ganzen Objekte in der Schrankwand und natürlich die Schrankwand selbst nach vorn gezogen werden, das soll man aber sehen können.
 
oder du machst dir ahlt die Mühe, rote auf jedes obejkt anzuwenden..

dann drehen sich die Teile um ihre eigene Achse, das will er ja nicht :D

Was heißt denn bitte "nativ" Sinus und Kosinus unterstützen? Und um welchen Sinus- oder Kosinuswert geht es? Wie errechne ich den Näherungswert von Sinus oder Kosinus von was?

Ist es einfach möglich, ein Objekt bzw. mehrere Objekte sichtbar zu verschieben? Ich will, dass ein Sound abgespielt wird und die ganzen Objekte in der Schrankwand und natürlich die Schrankwand selbst nach vorn gezogen werden, das soll man aber sehen können.

Naja, CS kennt kein Sinus und Cosinus (meines Wissens) und um Objekte relativ zu einem Punkt zu rotieren ginge nur so... Ne Formel für die Näherung gibt es, doch ich kenne sie nicht mehr...
Generell wird Sinus und Cosinus ständig in der 3D-Spieleentwicklung benötigt. Umso ärgerlicher, dass das CS das nicht kennt :(

Aber es gäbe vlt. noch eine andere Möglichkeit. Und zwar indem du die Objekte im Schrank in NifSkope verschiebst, sodass der Mittelpunkt den Mittelpunkt vom Schrank entspricht. Ich bin mir nicht sicher ob das klappt, doch es wäre einfach als die Sinus-Cosinus Variante

MfG
Junker Locklear
 
Es wäre noch einfacher, wenn ich die Schrankwand einfach nach vorne ziehe. Aber ist das denn im CS überhaupt möglich?
 
Es geht um die Sinus- und Kosinus-Funktion.

Wenn du den großen Schrank drehst, dann bewegt sich das Ende des Schrankes ein gutes Stück. Wenn du jetzt ein Buch darin drehst, dann dreht sich das Buch zwar auch, da es aber kleiner ist, bleibt es an einer ganz
anderen Stelle stehen.

Das ist durchaus komplizierter.

Zeichne dir das am besten mal auf. Dann siehst du, welchen Weg die einzelnen Teile zurücklegen müssen.
 
Es wäre noch einfacher, wenn ich die Schrankwand einfach nach vorne ziehe. Aber ist das denn im CS überhaupt möglich?
Ist es schon. Du musst es nur mit einem Timer verbinden, sodass jedes frame der Schrank um eine sehr kleine Distanz bewegt wird. Ich bin mir aber nicht 100%ig sicher, ob das dann auch flüssig aussieht oder ein klienes bisschen abgehackt...
 
Jede Sekunde dürfte sehr abgehackt aussehen. Ist es nicht möglich, Zehntelsekunden-Timer zu erstellen?
 
Object Scripts werdsen soweit ich weiß jedes frame ausgeführt, nur Magic Scripts kommen nur einmal pro Sekunde zur Geltung. Wenn du es also so machst, würde (meines Wissens) jedes Frame der Schrank usw bewegt werden.
 
Also kein Timer? Denn ein Timer würde ja jede Sekunde ablaufen. Wie würde denn ein solcher Script aussehen?

Code:
scn SCRIPTNAME

short init

begin onActivate Player

if init == 0
set init to 1
elseif init == 1
set init to 2
elseif init == 2
set init to 0
endif

end



begin GameMode

if init == 1
   [B]SchrankRef[/B].SetPos X, 5
elseif init == 2
   [B]SchrankRef[/B].SetPos X, -5
elseif init == 0
   ;nothing!
endif

end

Oder kann ich bei "SetPos" nicht mit "5" als "+5" und "-5" eben als "-5" arbeiten? Gibt es denn Positions-Funktionen, bei denen man mit einem simplen "+" und "-" arbeiten kann?
 
Naja, so muss der Spieler den Activator ja jedes mal, wenn der Schrank vershcoben wird, anklicken. Du hast aber Recht, evtl braucht man wirklich keinen Timer. Ich hätte es dann so gemacht: (ich teste es gleich selber, ob das CS nen Fehler ausspuckt):

Code:
scn ActivatorzumSchrankverschieben

float position
short activated

Begin onActivate
if (activated == 0) || (activated == 2)
set activated to 1
elseif (activated == 1)
set activated to 2
endif
end

Begin GameMode
if (activated == 1)
if (position <= ??) ;Ziel des Schranks
set position to Schrankref.getpos X
schrankref.setpos x (position + 5)
endif
elseif (activated == 2)
if (position <= ??) ;Ursprungsort des Schranks
set position to Schrankref.getpos X
schrankref.setpos x (position - 5)
endif
endif
 
  • Like
Reaktionen: Fellan
Was würde denn bei obigem Script mit den Büchern passieren? Werden die mitgeschoben oder muss ich jedes Buch einzeln mit in den Scriptbefehl einbinden?
 
Die Bücher werden da nicht direkt mitgeschoben, glaube ich, zumindest nicht schon gleichmäßig, da sie ja eventuell kurzzeitig in die Collision des Schranks kommen. D.h. wohl oder übel mit einbinden...
 
  • Like
Reaktionen: Fellan
Also die Collision des Schrankes wird nicht die Bücher vor sich herschieben? Naja, muss ich mir was einfallen lassen. Weniger Bücher vielleicht. Und sonst...naja, wenn es am Ende wirklich gut aussieht ist es das vielleicht wert. ;)
 
Sie werden wenn ich richtig rate schon mitgeschoben, aber wenn sie kurz in die Collisions rein kommen hüpfen die vermutlich wild durch die Gegend (wie immer, wenn zwei Objekte "ineinander" sind), da es ja (wenn es funktioniert) nur wie eine flüssge Bewegung aussieht aber tatsächlich imer ein Stück in eine Richtung "gebeamt" wird^^