soya3d + pygame (+ ode)

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Benutzeravatar
x2nop
User
Beiträge: 16
Registriert: Freitag 11. April 2008, 06:29
Wohnort: Spreeathen / Elbflorenz

olla zsamm!

folgendes quält mich: ich möchte ne kleine welt basteln, in der ich, physisch korrekt, mit nem fahrzeug rumdüsen kann. so weit, so gut..
es gibt da ein paar verschiedene ansätze:
visualisation und eventhandling mittels pygame, ode als physik-engine, was auch ganz gut klappt und sogar recht übersichtlich ist.. solange kein opengl vorkommt (is mir zZ. ein zu schwerer brocken, und überhaupt..).
also die visu mit nem andren tool, wie zB. soya. ist mir recht sympathisch (kein verrücktes gl..(geschalte)

und nun bekomme ichs einfach nicht zusammen, irgendwas is faul.. und mir brennen langsam die augen

hier mein versuch mit nem listing aus dem soya-tut:

Code: Alles auswählen

import os, os.path, sys
import traceback
try:
	import soya
	import pygame
except ImportError:
	traceback.print_exc()

res = (800, 600)

def main():
	pygame.display.init()
	screen = pygame.display.set_mode(res, pygame.OPENGL | pygame.DOUBLEBUF)
	pygame.display.set_caption("soyax")

	run = True
	events = pygame.event.get()

	dir_root = os.path.dirname(__file__)
	soya.path.append(os.path.join(dir_root, "data", "soya", "data"))

	soya.init(create_surface = 0)

	scene = soya.World()
	sword_model = soya.Model.get("sword")

	sword = soya.Body(scene, sword_model)
	sword.set_xyz(1.0, 0.0, 0.0)
	sword.rotate_y(90.0)

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

	camera = soya.Camera(scene)
	camera.z = 2.0

	soya.set_root_widget(camera)
	soya.MainLoop(scene).main_loop()

# irgendwo hier vermutlich ist das problem..
	while run:

		for e in events:
			if e.type == QUIT:
				run = False

		pygame.display.flip()

	soya.MAIN_LOOP.stop()
	pygame.quit()


if __name__ == "__main__": main()
der bildschirm bleibt schwarz und was mich noch mehr stutzig macht, ist, daß soya einfach nicht richtig beendet wird.. also auch bei anderen, von mir bisher unangetasteten beispielen.
und ich finde partou keinen hinweis, wie sich soya ordentl "killen" läßt..

Code: Alles auswählen

if __name__ == "__brain__": brain.zuHilf("!")
es gibt leute, die sind anders und andere, die sind genauso!
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Das Problem hatte ich auch.

Bei mir konnte ich Soya nur killen in dem ich in die Console geklickt habe und dort ein STRG+D gesendet oder ganz geschlossen habe.

Tipp: Binde eine Taste zum Beispiel Q mit einer Funktion die das Script beendet, so habe ich das dann später gemacht.

**edit**
Ach du hast den Code ja schon verändert?!
Wie BlackJack schon andeutet nach Zeile 38 passiert nichts mehr.

Guck dir mal im Soya Tutorial die Datein zu "Game Skeleton" an.
Zuletzt geändert von Sr4l am Freitag 11. April 2008, 08:50, insgesamt 1-mal geändert.
BlackJack

Zeile 38 sollte nicht zurückkehren, bzw. erst, wenn man die Hauptschleife von Soya irgendwie beendet.
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

Soya3D
ich brauche einen genauen link zum downloaden von soya3d für windows und für python 2.5.
habe nur dieses gefunden : Soya-0.13.win32-py2.4.exe

wer kann hier weiterhelfen..

danke.

mfg
Benutzeravatar
x2nop
User
Beiträge: 16
Registriert: Freitag 11. April 2008, 06:29
Wohnort: Spreeathen / Elbflorenz

okk. vielleicht noch was zur erläuterung hinterher:
ja, dieses script hab ich schon verwurstet. isn ganz einfaches exampel ausm soya-tut. nur konnte ich KEINES davon auf "benutzerfreundlem" wege beenden. nu hab ich eben auch schon in paar kleine pygame/ode schnipsel, die sich auch ganz anständig benehmen, bloß wollte ich mir den opengl-code aus der datei raushalten und auch überhaupt einen leichteren weg für die grafik suchen (um halt leichter mal ne textur oder eben auch mal ein terrain einfügen zu können, ohne 100 zeilen fürn paar einfache polygone aufzuwenden. dh bin grad ma bei soya gelandet und das es so rumzickt beim beenden, machte mich dann doch schon ein bissl fuchtig!
sgibt da nen niedlichen wipeout-clone auf py-soya basis aber für ein paar kleine experimente wars mir dann doch noch ein wenig zu undurchsicht (zwex herausschneiden einiger interessanter routinen..)

aber da muß doch was zu machen sein.. nünja, vleicht ist der ansatz in dieem beispiel auch nicht grade geglückt. es gibt da sicher ne viel einfachere lösung zu..

sprich: gleich alles in soya (events, ode) habs jetz auch noch ni sehr tief durchdrungen, nur wenns schon hier hapert..?!


alles wird gut, nichts wird besser!

aber besten dank schon ma für die resonanz ~$10
es gibt leute, die sind anders und andere, die sind genauso!
Benutzeravatar
x2nop
User
Beiträge: 16
Registriert: Freitag 11. April 2008, 06:29
Wohnort: Spreeathen / Elbflorenz

BlackJack hat geschrieben:Zeile 38 sollte nicht zurückkehren, bzw. erst, wenn man die Hauptschleife von Soya irgendwie beendet.
hmm.. ja, genau! nur wie? das ist es, was der hörer wissen will..

haste da ma n kleines textchen? mit welchem event zu welcher zeit an welchem ort.. sowas wirkt manchma wunder.. is am ende bestimmt ne ganz profane sache!

ich konnte nix anständiges in keiner doku finden, wie man soya sauber beendet. hab da auch in andren scripten rumspioniert.. ich steig da nich dahinter, wo der hund in der pfanne.. nee aus! ich geh ersma schlafen

bis in bälde ~ $10
es gibt leute, die sind anders und andere, die sind genauso!
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

wem es interessiert, hier ist alles drin für python 2.5 unter win :

http://clgdrouyn.fr/spip.php?page=impri ... rticle=593

soya3d und andere komplett-pakete.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

x2nop hat geschrieben:
BlackJack hat geschrieben:Zeile 38 sollte nicht zurückkehren, bzw. erst, wenn man die Hauptschleife von Soya irgendwie beendet.
hmm.. ja, genau! nur wie? das ist es, was der hörer wissen will..

haste da ma n kleines textchen? mit welchem event zu welcher zeit an welchem ort.. sowas wirkt manchma wunder.. is am ende bestimmt ne ganz profane sache!

ich konnte nix anständiges in keiner doku finden, wie man soya sauber beendet. hab da auch in andren scripten rumspioniert.. ich steig da nich dahinter, wo der hund in der pfanne.. nee aus! ich geh ersma schlafen

bis in bälde ~ $10
Ich habe mal mein Testlevel hochgeladen womit ich vor längerer Zeit mal gearbeitet habe.
Es ist in großen Teilen aus den Samples von Soya, aber strukturiert in Klassen und Funktionen und nur das nötigste (eine Kamera und eine Welt) und alles wird über ``main()`` zusammen gebracht.


Der Code:
http://paste.pocoo.org/show/39676/

Wenn jemand nicht alle Models, Welten usw. ersetzen will kann sich den data Ordner hier ( http://users.sr4l.de/sr4l//upload_fuer_ ... d_data.zip ) runterladen, müßten alle Daten drin sein.


PS: Habe hier leider kein Soya, hoffe es funktioniert alles, werde es morgen am Linux Laptop testen.

PPS: Wenn jmd Ingame die Truhe sieht, die gibt es wirklich steht bei mir unterm Haus :-)

PPPS: Ich sehe gerade der Code ist mit Tabs eingerückt, da hatte ich wohl keinen gescheiten Editor zur Hand ..... ;-)
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

es wird ein wx-fenster geöffnet und ein soya3d-fenster mit der 3d-grafik.
im wx-fenster ist ein "close-button" damit das programm geschlossen wird.

habe jetzt einen timer eingebaut in meinem wx-soya-programm.
läuft schon wunderbar.

alle 30ms wird das soya-fenster geupdatet über einen timer(einstellbar), bzw wird der ball in y-richtung um einen bestimmten betrag verschoben.

man kann jetzt alle möglichen bewegungsdaten der 3d-oberfläche von soya beeinflussen mit dem wx-fenster und zusätzlichen button die man dort unterbringt oder schieberegler und was es sonst noch gibt.

vielleicht kann das einer nochmal mit dem timer eleganter machen.
ich habe es nicht anders hinbekommen.

Code: Alles auswählen

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

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

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

scene = soya.World()

head = soya.Body(scene, soya.Model.get("caterpillar_head"))

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.root_widget.add(soya.widget.FPSLabel())

soya.MainLoop(scene)

head.y=-15.0

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

        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, 20)     
        panel.SetSizer(sizer)

    def OnTimeToClose(self, evt):
        self.Close()
  
    def OnTimer(self, evt):
        head.y += 0.1
        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()

Zuletzt geändert von sechsrad am Samstag 12. April 2008, 15:09, insgesamt 2-mal geändert.
Benutzeravatar
x2nop
User
Beiträge: 16
Registriert: Freitag 11. April 2008, 06:29
Wohnort: Spreeathen / Elbflorenz

okk! besten dank für die anteilnahme! frickel grad euphorisch an der landschaft rum..
im grunde hat sichs auch erledigt mit pygame, vielmahr sollte es jetz heißen:

soya + ode (+ pygame?), resp: landschaft + physik


keine weitern fragen.. vorerst!

werd bei gelegenheit das resultat ma posten
es gibt leute, die sind anders und andere, die sind genauso!
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

landschaft + physik
da ist in soya ein schönes geländebeispiel mit kugeln, die einen abhang runterkullern.

statt der kugeln nimmst du einen steuerbaren anderen körper(auto zb, kannste sogar mit blender erstellen und die blend-datei einlesen).

mfg
Benutzeravatar
x2nop
User
Beiträge: 16
Registriert: Freitag 11. April 2008, 06:29
Wohnort: Spreeathen / Elbflorenz

so! hier und jetzt ein abschließender bericht:
ich denke mal, ich heb nen weg gefunden! erstmal nix mit soya, pudding, tofu oder andrem veganem..!
letztendlich versuch ich mich doch an openGL. ist zwar sehr 'maschinennah' aber eben auch nicht so sehr abstrahiert.
will sagen: ich brauchs irgendwie, von wegen jeden schalter einzeln und von hand zu bedienen. ich finds spannend. die physik bleibt da erstma ein wenig auf der strecke, aber das kann ja noch.. später..
und pygame bleibt auch erstmal der rahmen meiner wahl.
macht seine arbeit zuverlässig und ist auch so recht schmal (sprich: der funktionumfang ist recht übersichtlich; 'nur so viel, wie nötig..'; fenster auf, opengl-context und nochn bißchen eventabfrage..)

@sechsrad: vielen dank für deine empfehlungen (grade dein letztes beispiel mit wx war schon sehr kompakt) aber mit den guitoolkits (wx, gtk, *soya*) werd ich nich so recht warm..


a dopo ~$10

:!::?::!:
es gibt leute, die sind anders und andere, die sind genauso!
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

hallo zeig mal ein angefangenes pygame mit opengl, interessiert mich.
ich habe opengl mal in gfabasic reingebracht und funktioniert ganz gut.
musste die ganzen dll-befehle von opengl für gfa-basic aufrufbar machen.
ein kollege hat das dann in die spezifischen fensterbefehle reingebracht.

mfg
Benutzeravatar
x2nop
User
Beiträge: 16
Registriert: Freitag 11. April 2008, 06:29
Wohnort: Spreeathen / Elbflorenz

so! kommen wir nun mal zu etwas gaaanz anderem..

nach div. sommerlöchern (sehr dunklen und zuweilen sehr lauten und schmutzigen) und so manchen konzentrationssollbruchstellen hier ein geistiger erguss:
http://paste.pocoo.org/show/82521/
das ist mittlerweile schon ziemlich offtopic. mit soya hats garnix mehr zu tun; mit ode noch nicht und mit pygame eher nur am rande.
dafür aber jede menge mit opengl.
und sehr elegant ists auch noch nicht. hat noch so seine ecken und kannten.. aber die idee.. . .
nach einigen surftouren durch die verschiedensten tutorials ist nun jenes progrämmchen dabei herausgekommen. war sehr aufschlußreich und mittlerweile ist mir auch klarer geworden, was dinger wie soya überhaupt machen (*eher theoretisch).
also, für ein spiel taugts so sicher noch nicht. ABER:
da es mir ein wenig an der entsprechenden kreativität mangelt, ein kleines spiel in meiner kragenweite zu basteln, hab ich eher folgendes technische vorhaben..
inspiriert von diesem tutorial: http://monsterden.net/software/ragdoll-pyode-tutorial möchte ich (irgendwie immernoch) ne physik-grafik-schnittschtelle basteln. in groben zügen: einfache definition eines körpers mit all seinen physikalischen eigenschaften und seiner grafischen repräsentation.
eine implementation könnte dann so aussehen:

import engine
gib_mir_die_kugel()
laß_sie_fallen()

.. und schwupps, fällt ne kugel übern schirm. solange es allerdings nur um kugeln, würfel und teekannen geht, mag der aufwand sicher etwas übertrieben scheinen; das ließe sich ja noch mit GL.glut bewerkstelligen.
paßt mir aber nicht! und da ich auch nicht so recht weiß, was ich wieso überhaupt übern schirm fliegen lassen sollte, will ich wenigstens wissen, WIE man das macht.

*wenn das dann klappt, bau ich mir nen viehischen flugi(wenn ich nich grade iljuschin spiele(sehr geiles teil übrigens..);-))*

werd jetz nochn bissl weiter basteln. bin mal gespannt, wohins noch geht..
ach, und noch was offtopisches: unter http://www.pygame.org/wiki/CookBook gibts zwei beiträge zur vektorberechnung (2d, 3d), was beim umrechnen von physik (ode) nach grafik (opengl) recht hilfreich sein dürfte. siehe auch der vorspann im RagDoll beispiel.

so long ::: :: : und : ~$10
es gibt leute, die sind anders und andere, die sind genauso!
Antworten