Frame aus Frames

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
MC_MO
User
Beiträge: 25
Registriert: Sonntag 28. März 2010, 10:07

Hi,

ich hab schon wieder n Problem:

Ich hab in vPython in einer Klasse (nenne wir sie Kreis) einen Frame (sagen wir einfach aus 3 boxes). Jetzt erstelle ich in der nächsten Klasse (nennen wir sie Kreise) 3 Objekte der Klasse "Kreis". Wie kann ich jetzt diese 9 Objekte gruppieren, sodass sie sich drehen können wie 1 Objekt?

Vielen Danke, mfg Mo
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Code Beispiel und jmd fällt sicherlich eine Lösung ein ;-)
MC_MO
User
Beiträge: 25
Registriert: Sonntag 28. März 2010, 10:07

Am besten kein Beispiel, sondern einfach mein Code ;)

Ich versuche das "High Energy" nachzubauen. Der Rotor dreht sich, die 6-armige "Spinne" dreht sich um sich selbst, und die Sitzreihen drehen sich auch nochmal um die eigene Achse. Am besten einfach Video schaun:

http://www.youtube.com/watch?v=hWq0HxEA2QM

So sieht mein Code aktuell aus (zusammengeschnitten aufs Wesentliche^^):

Code: Alles auswählen

from visual import *

class Hauptarm:
    def __init__ (self):
        self.rahmen=frame()
        self.Rotor=ellipsoid(pos=(0,0,0),length=150,height=150,width=2000,axis=(0,1,0),color=(1,0,0),opacity=0.7,material=materials.emissive,frame=self.rahmen)
        self.Rotor.rotate(angle=pi/2,axis=(1,0,0))
        self.Endkugel1=sphere(pos=(0,910,0),radius=90,color=(1,0,0),frame=self.rahmen)
        self.Endkugel2=sphere(pos=(0,911,0),radius=90,color=(1,1,0),opacity=0.2,frame=self.rahmen)

class Arm:
    def __init__ (self):
        self.bank=frame()
        self.Sitzflaeche1=box(pos=(140,-945,30),length=30,width=30,height=5,color=(0.5,0.5,0.5),frame=self.bank)
        self.Lehne1=box(pos=(140,-925,15),length=30,width=5,height=40,color=(0.5,0.5,0.5),frame=self.bank)
        self.Sitzflaeche2=box(pos=(180,-945,30),length=30,width=30,height=5,color=(0.5,0.5,0.5),frame=self.bank)
        self.Lehne2=box(pos=(180,-925,15),length=30,width=5,height=40,color=(0.5,0.5,0.5),frame=self.bank)
        self.Sitzflaeche3=box(pos=(220,-945,30),length=30,width=30,height=5,color=(0.5,0.5,0.5),frame=self.bank)
        self.Lehne3=box(pos=(220,-925,15),length=30,width=5,height=40,color=(0.5,0.5,0.5),frame=self.bank)
        self.Sitzflaeche4=box(pos=(260,-945,30),length=30,width=30,height=5,color=(0.5,0.5,0.5),frame=self.bank)
        self.Lehne4=box(pos=(260,-925,15),length=30,width=5,height=40,color=(0.5,0.5,0.5),frame=self.bank)
        self.Sitzflaeche5=box(pos=(300,-945,30),length=30,width=30,height=5,color=(0.5,0.5,0.5),frame=self.bank)
        self.Lehne5=box(pos=(300,-925,15),length=30,width=5,height=40,color=(0.5,0.5,0.5),frame=self.bank)
        self.Aufhaengung=cylinder(pos=(0,-945,0),length=330,radius=15,color=(1,0.7,0),frame=self.bank)

        
class Spinne:
    def __init__ (self):
        self.sitzreihe=frame()
        self.spinne=frame()
        self.Arm1=Arm()
        self.Arm2=Arm()
        self.Arm2.bank.rotate(angle=1*pi/3,axis=(0,1,0))
        self.Arm3=Arm()
        self.Arm3.bank.rotate(angle=2*pi/3,axis=(0,1,0))
        self.Arm4=Arm()
        self.Arm4.bank.rotate(angle=3*pi/3,axis=(0,1,0))
        self.Arm5=Arm()
        self.Arm5.bank.rotate(angle=4*pi/3,axis=(0,1,0))
        self.Arm6=Arm()
        self.Arm6.bank.rotate(angle=5*pi/3,axis=(0,1,0))

            
a=Hauptarm()
c=Spinne()

def Fahrt():
   while True:
        rate(25)
        a.rahmen.rotate(angle=pi/60,axis=(1,0,0))
        c.Arm1.bank.rotate(angle=pi/60,axis=(1,0,0))
        c.Arm2.bank.rotate(angle=pi/60,axis=(1,0,0))
        c.Arm3.bank.rotate(angle=pi/60,axis=(1,0,0))
        c.Arm4.bank.rotate(angle=pi/60,axis=(1,0,0))
        c.Arm5.bank.rotate(angle=pi/60,axis=(1,0,0))
        c.Arm6.bank.rotate(angle=pi/60,axis=(1,0,0))
Wenn ihr es euch anseht, seht ihr dass die Spinne mit dem Rotor richtig mitdreht. Jetzt sollte sich aber noch die Spinne um sich selbst drehen, und die Arme ebenfalls um sich selbst (siehe Video). Ich versuche schon seit 2 Tagen das zu schaffen, geht aber nicht.

Kann mir hier wer helfen?

mfg
MC MO
Royal_Flush
User
Beiträge: 1
Registriert: Dienstag 30. März 2010, 20:02

Ich habe prinzipiell das selbe Problem wie MC_MO, nur mit anderen "Körpern"

Bei mir sind es Arme: Unterarm+Hand sind sinnvollerweise in einem Frame (um Ellbogen drehbar), Oberarm+Ellbogengelenk+Unterarm+Hand aber auch (um Schulter drehbar). Ich muss also Frame1 als Teil von Frame2 definieren. Mein bisheriger Versuch:

Code: Alles auswählen

#Die zwei Frames erstellen
self.gruppehand1=frame()
 self.gruppehand2=frame()

#Die einzelnen Körperteile erstellen und zuordnen
self.oberarm1 = cylinder(pos=(0,-0.25,1), axis=(0,-1.5,0), radius=0.5, color=color.red, frame=self.gruppearm1)
self.armgelenk1 = sphere (pos=(0,-1.75,1), radius=0.5, color=color.red, frame=self.gruppehand1)
self.unterarm1 = cylinder(pos=(0,-1.75,1), axis=(0,-1.5,0), radius=0.5, color=color.red, frame=self.gruppehand1)
self.hand1 = sphere(radius=0.5, pos=(0,-3.4,1), color=(1,0.8,0.6), frame=self.gruppehand1)

#Unterarmframe zu Oberarmframe hinzufügen (?)
self.gruppearm1.add_renderable(self.gruppehand1)
Ich gebe zu: Die Memberfunktion add_renderable() habe ich eher zufällig gefunden, als ich mir die Funktionen, die ich an eiem Frame machen kann, durchgesehen habe. Die VPython-Dokumentation gibt darüber nämlich wenig Auskunft...

Soweit alles gut, der Unterarm bewegt sich schön mit und kann sich gleichzeitig drehen. Nur: An der Ausgangsposition des Unterarms, ist eine Kopie (oder mehr ein Abbild) des Unterarms die die Drehungen des anderen Unterarms mitmacht. Ich kann diese Kopie (oder ist es das Original?) nur leider nicht verschieber oder ausblenden, denn alles was ich damit anstelle, geschieht auch mit dem Exemplar, dass sich zusätzlich im Frame "gruppearm1" befinden.

Ich hoffe, mir (uns) kann geholfen werden
MC_MO
User
Beiträge: 25
Registriert: Sonntag 28. März 2010, 10:07

Ok unser Betreuer hat das Problem zuhause doch noch gelöst...folgendermaßen funktioniert es:

Code: Alles auswählen

#frames, verschachtelt, aber ohne OO
# SH 20103030

from visual import *

nullpunkt=sphere(radius=0.1, opacity=0.3)
label(pos=nullpunkt.pos, text="Nullpunkt", xoffset=8, yoffset=4, height=8, border=2, \
      box=False, line=True, linecolor=color.magenta,opacity=0.33)

rahmen_i=frame()
arm1 = cylinder(frame=rahmen_i, pos=(-1,0,0), axis=(2,0,0), radius=0.2, color=color.yellow)
sitz   =    box(frame=rahmen_i, pos=(-1,0,0), color=color.cyan)


rahmen_a=frame()
arm2 = cylinder(frame=rahmen_a, pos=(0,0,-1), axis=(0,0,2), radius=0.2, color=color.red   )

rahmen_i.frame=rahmen_a

rahmen_s=frame()
stange=cylinder(frame=rahmen_s, pos=(0,0,0), axis=(0,5,0), radius=0.1, color=color.green)

rahmen_a.frame=rahmen_s

label(pos=(0,2.5,0), text="Drehachse", xoffset=32, yoffset=0, height=8, border=2, \
      box=False, line=True, linecolor=color.magenta,opacity=0.33)


z=0
while True:
    rate(25)
    rahmen_i.rotate(angle=radians(10),  axis=(1,0,0),   origin=(-1,0,0))
    rahmen_a.rotate(angle=radians(5),   axis=(0,1,0),  origin=(0,0,0))
    rahmen_s.rotate(angle=radians(-1), axis=(-1,0,0), origin=(0,2.5,0))
    if not z%100:
        print "sc.forward %4.2f:  <%4.2f,%4.2f,%4.2f>  sc.m.camera %4.2f: <%4.2f,%4.2f,%4.2f>"%(mag(scene.forward), scene.forward[0],scene.forward[1],scene.forward[2], \
        
        mag(scene.mouse.camera),scene.mouse.camera[0],scene.mouse.camera[1],scene.mouse.camera[2],)
    z+=1
Und so funktionierte dann auch unser Fahrgeschäft, wer es sich ansehn will (zu lang ums hier reinzukopieren) sollte mal im "Showcase" vorbeischaun ;)

mfg
MC MO
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

In besagten Thread reingucken hat keinen Sinn, da Du so viel Code ins Board gepostet hast, dass man nicht mehr darauf antworten kann. Bitte verschiebe den doch in ein paste-bin, wie etwa paste.pocoo.org! Dann kann man auch was dazu sagen. (Und da gäbe es einiges auf den ersten Blick ;-) )
Antworten