Seite 1 von 1

Matrizenberechnung in Python

Verfasst: Donnerstag 17. Januar 2008, 09:31
von Chill-man
Hallo,

ich wollte mal anfragen, ob es möglich ist die Orientierung eines mit python erzeugten 3dimensionalen Objektes in einem 3dimensionalen raum zu verändern.
Wenn ja, wie mach ich das? (Das Object habe ich bereits erstellt)
Kann ich die für die Drehung benötigte matrize in python ausrechnen lassen?

Verfasst: Donnerstag 17. Januar 2008, 09:44
von CM
Hoi,

ja, das ist möglich. Kennst Du die scipy-Seite?

Um aber spezifischer zu werden, mußt Du schon sagen, um was für eine Art Objekt es sich handelt (Ist es ein array aus Koordinaten (x, y, z). ein "Vektorsammelsurium" oder etwas Anderes?

Gruß,
Christian

Verfasst: Donnerstag 17. Januar 2008, 10:11
von Chill-man
Also das objekt wurde mit blender erstellt (hoffe das hilft weiter)
die aktuelle matrix für die Orientierung ist:

[1.0,0.0,0.0],[0.0,1.0,0.0],[0.0,0.0,1.0]

müssten also vektoren sein

Verfasst: Donnerstag 17. Januar 2008, 10:50
von CM
Mit Blender kenn ich mich nicht aus, aber ich würde vermuten, daß man da besser direkt auf Blender zurückgreift, als selber zu programmieren. Rebecca oder sonst wer, wißt ihr mehr?

Verfasst: Donnerstag 17. Januar 2008, 11:00
von Chill-man
also das problem ist, dass ich nicht immer per hand die objekte verändern will um sie dann später die matrizen in mein script einbauen zu können.
Ich will einfach meinem script sagen rotiere das object um 10° oder so ähnlich. Ist das irgendwie möglich?

Verfasst: Donnerstag 17. Januar 2008, 11:09
von CM
Auf der Blenderseite gibt es eingie Pythonscripts, u. a. dieses hier:
http://saltshaker.sourceforge.net/ ;-)
Das sieht ziemlich einfach aus. Allerdings ist die Einheit wohl Radian und nicht Grad, oder? Und es wird in diesem Beispiel auch nicht mit Rotationsmatrixes gearbeitet (jedenfalls nicht im Vordergrund).

Also, ich steige wegen Ahnungslosigkeit (bei Blender) an dieser Stelle aus dem Thread aus. Viel Erfolg noch!

Gruß,
Christian

Verfasst: Donnerstag 17. Januar 2008, 11:19
von Rebecca
Dem aktuell selektierten Objekt eine Rotation um 45 Grad um die x-Achse verpassen:

Code: Alles auswählen

import Blender
from math import radians

obj = Blender.Object.GetSelected()[-1]
obj.RotX = radians(45)

Blender.Redraw()

EDIT:
Blender.mathutils ist auch noch ganz interessant, z.B. erstellt RotationMatrix(angle, matSize, axisFlag, axis) eine Rotationsmatrix. Aber der oben gezeigte Weg ist der einfachste.

Verfasst: Donnerstag 17. Januar 2008, 14:10
von Chill-man
danke, aber gibt es das gleiche auch für die blender gameengine?

Verfasst: Donnerstag 17. Januar 2008, 14:15
von Rebecca
OK, bevor ich jetzt weiterrate und wieder daneben liege: Was genau willst du machen? Was fuer Zeilen von Python-Code hast du schon?

Verfasst: Donnerstag 17. Januar 2008, 14:29
von Chill-man

Code: Alles auswählen


from GameLogic import*

cont = GameLogic.getCurrentController()
mouseOver = cont.getSensor("mouseOver")
mouseDown = cont.getSensor("mouseDown")
obj = cont.getOwner()
obj_target = mouseOver.getHitObject()
scene = getCurrentScene()

#Definition der Objektnamen
Cone = scene.getObjectList()["OBCone"]
Cube = scene.getObjectList()["OBCube"]
Circle = scene.getObjectList()["OBCircle"]
Torus = scene.getObjectList()["OBTorus"]
Checkboard = scene.getObjectList()["OBCheckboard"]


#Neue Orientierungen
oriCone1   = [0.79484083803575145, -0.48135309646484581, 0.36949592516606883], [0.58819376646204524, 0.76084813349148772, -0.2741134999552417], [-0.14918490300904194, 0.43521180393714526, 0.88788205885013727]
oriCube1   = [0.8987499323613598, 0.41711800035975705, -0.13513375912897868], [-0.36439003665576242, 0.88197387191389609, 0.29890130552947186], [0.2438615596326392, -0.21939613268489547, 0.94466760116797088]
oriCircle1 = [0.93587802375991447, -0.29844166639029129, 0.18725623195350016], [0.33183444880266938, 0.92525368869643387, -0.18382467228713142], [-0.11839857782535036, 0.23417553953354897, 0.96495781952016213]
oriTorus1  = [0.66783931754252024, -0.55903550549107239, 0.49139591934068982], [0.73201471240079519, 0.61280379382843486, -0.29770114393172559], [-0.13470377416064364, 0.55852557136609071, 0.81847668223172987]

#Bedingung 1 (Cone)
def Bed_1():
	Cone.setOrientation(oriCone1)
	obj.Cone = obj.Cone+1

#Bedingung 2 (Cube)
def Bed_2():
	Cube.setOrientation(oriCube1)
	obj.Cone = obj.Cube+1

#Bedingung 3 (Circle)
def Bed_3():
	Circle.setOrientation(oriCircle1)
	obj.Cone = obj.Circle+1

#Bedingung 4 (Torus)
def Bed_4():
	Torus.setOrientation(oriTorus1)
	obj.Cone = obj.Torus+1


if obj.Trial < 21:
			i = obj.Trial-1
			if l[i] in (1, 5, 9, 13, 17):
				Bed_1()
				obj.Cone = obj.Cone+1
				obj.changed = 1
			if l[i] in (2, 6, 10, 14, 18):
				Bed_2()
				obj.Cube = obj.Cube+1
				obj.changed = 2
			if l[i] in (3, 7, 11, 15, 19):
				Bed_3()
				obj.Circle = obj.Circle+1
				obj.changed = 3
			if l[i] in (4, 8, 12, 16, 20):
				Bed_4()
				obj.Torus = obj.Torus+1
				obj.changed = 4

kleiner auszug aus meinem script.

Intention:

ich habe 4 Objekte die ich drehen will.
zur Zeit habe ich die neue orientierung noch per hand eingegeben.
ich will es aber so verändern, dass eine zufallszahl erzeugt wird und dann das object um den wert der zufallszahl gedreht wird (um die x achse).