Seite 1 von 1

soya3d-welt im wx-fenster unterbringen klappt nicht

Verfasst: Freitag 18. April 2008, 11:02
von sechsrad
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

Verfasst: Freitag 18. April 2008, 12:22
von fred.reichbier
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

Verfasst: Freitag 18. April 2008, 12:46
von sechsrad
hallo, vielen für deine info.

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

mfg

Verfasst: Freitag 18. April 2008, 13:12
von sechsrad
es geht jetzt, mit dem körper dranhängen.

mfg

Verfasst: Freitag 18. April 2008, 16:04
von fred.reichbier
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