soya3d-welt im wx-fenster unterbringen klappt nicht

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

hallo, hier habe ich ein programm, wo sich die sonne um sich selber dreht. daran habe ich einen erde und einen mond gesetzt. die erde dreht sich mit der sonne und um diese erde dreht sich der mond .
also eine verbindung, womit man einmal die geamtheit steuern kann (die sonne ist der ausschlaggebende körper der die erde und den mond mitnimmt). so etwas will ich auch später benutzen um ein gelenkarm zu steuern mit mehreren gelenken.

Code: Alles auswählen

# -*- indent-tabs-mode: t -*-

import sys, os, os.path, soya, soya.sphere, soya.widget, wx, time

soya.init()
soya.path.append(os.path.join(os.path.dirname(sys.argv[0]), "data"))

scene = soya.World()

class CelestialObject(soya.World):
    def advance_time(self, proportion):		
        soya.World.advance_time(self, proportion)
        earth.rotate_y(proportion * 1.0)
        sun.rotate_y(proportion*0.1)
            
sun = CelestialObject(scene, soya.Model.get("sun"))

earth = CelestialObject(sun  , soya.Model.get("earth"))
earth.x = 1.5

earth1 = CelestialObject(earth  , soya.Model.get("moon"))
earth1.x = 0.5

light = soya.Light(scene)
light.set_xyz(0.0, 5.0, 0.0)

camera = soya.Camera(scene)
camera.y = 4.0
camera.look_at(soya.Vector(scene, 0.0, -1.0, 0.0))
soya.set_root_widget(camera)

soya.MainLoop(scene).main_loop()

diese obere scene möchte ich jetzt in meinem wx-fenster darstellen :

Code: Alles auswählen

# -*- indent-tabs-mode: t -*-

import sys, os, os.path, soya, soya.widget, wx, time

soya.init("test",640,480)

soya.path.append(os.path.join(os.path.dirname(sys.argv[0]), "data"))

scene = soya.World()
modell=soya.Model.get("earth")

head = soya.Body(scene,modell )

light = soya.Light(scene)
light.set_xyz(2.0, 5.0, 0.0)

camera = soya.Camera(scene)
camera.set_xyz(0.0, 15.0, 15.0)
camera.look_at(head)

soya.set_root_widget(soya.widget.Group())
soya.root_widget.add(camera)

soya.MainLoop(scene)

class MyFrame(wx.Frame):
  
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, -1, title,pos=(15, 15), size=(150,300))

        self.timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)
        self.timer.Start(30)
        panel = wx.Panel(self)

        text = wx.StaticText(panel, -1,)
        text.SetFont(wx.Font(14, wx.SWISS, wx.NORMAL, wx.BOLD))
        btn = wx.Button(panel, -1, "Close")
        
        self.Bind(wx.EVT_BUTTON, self.OnTimeToClose, btn)
        
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(btn, 0, wx.ALL, 5)  
        panel.SetSizer(sizer)

    def OnTimeToClose(self, evt):
        self.Close()
  
    def OnTimer(self, evt):      
        head.rotate_x (2)
        soya.MAIN_LOOP.update() 
        
class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(None, "wx-soya")
        self.SetTopWindow(frame)
        frame.Show(True)
        return True
        
app = MyApp(redirect=True)
app.MainLoop()
die drehung soll dann in dieser schleife stattfinden:
def OnTimer(self, evt):
head.rotate_x (2)
soya.MAIN_LOOP.update()

es soll nur der timer vom wx-fenster bestimmend sein.

ich kann diese routinen nicht zum laufen bringen:

sun = CelestialObject(scene, soya.Model.get("sun"))
earth = CelestialObject(sun , soya.Model.get("earth"))
earth.x = 1.5
earth1 = CelestialObject(earth , soya.Model.get("moon"))
earth1.x = 0.5

bzw weiss nicht wie die jetzt in der def vom wx-fenster reingesetzt werden.

diese hilfe brauche ich.

mfg
Zuletzt geändert von sechsrad am Freitag 18. April 2008, 13:09, insgesamt 1-mal geändert.
fred.reichbier
User
Beiträge: 155
Registriert: Freitag 29. Dezember 2006, 18:27

Hallo,

dafür musst du Soya in einem eigenen Thread starten. So etwas habe ich schon mal gemacht: klicken.
Besonders interessant sind dabei wohl die Zeilen 29f., 166f. und 518-520. Der Code ist wirklich nicht schön, aber er funktioniert ganz gut.

Gruß Fred
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

hallo, vielen für deine info.

mir fehlen jetzt noch einpaar imports :
xmlmap,bisect,mapsys usw . wo hast du die runtergeladen?

mfg
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

es geht jetzt, mit dem körper dranhängen.

mfg
Zuletzt geändert von sechsrad am Freitag 18. April 2008, 16:56, insgesamt 1-mal geändert.
fred.reichbier
User
Beiträge: 155
Registriert: Freitag 29. Dezember 2006, 18:27

Hallo

bisect ist bei Python dabei, xmlmap und mapsys findest du im gleichen SVN-Repository. Die restlichen Imports sollten von eynhorn sein. Wenn du dir alles mal herunterladen willst, installiere Subversion und tippe svn co https://eynhorn.svn.sourceforge.net/svn ... horn/trunk eynhorn. In eynhorn/ema solltest du dann die Eynhorn Map Assembly finden. Ansonsten guck mal das Repository online durch.

Deine Frage müsste im Soya Manual beantwortet sein, ich bin leider zu sehr aus Soya3d raus, um sie dir zu beantworten ;)

Gruß Fred
Antworten