i hope i dont misunderstand but in walkthrough demo use an orientation matrix and u go where u look if u in fly mode. for me works only in sumo physics.
I believe [a]drien is looking for a way to get the euler angles from the orientation matrix. I remember reading about a way to do this before, but I don’t remember where I read it or how it was done. If I come across it, I will let you know.
You can find it in this thread, but you better have a good backing in basic matrix math and trigonometry. The document is very usefull for it’s python examples/methods, but it assumes quite a bit of knowledge on the readers end.
Yeah, he has a python function in there for getting euler angles but you’ll have to retype it because it’s in the 2 column pdf format. I would definately download it. It has about 3 blend files with rotation examples plus some functions in the pdf that are very valuable. The explanations are a little technical, but just take your time and you’ll be fine, or you can just use the python code and remain blissfully ignorant.
i have a similar problem… i must rotate an object on only 1 axis… X or Y or Z but i dont have understand how to do to use setOrientation… if i use
setOrientation(Quaternion([0,0,1],Angle_Degree))
all work right BUT only in BLENDER, out, in stand alone dont work…
i see this code in example:
#---------------------------------------------
# Flips the conected object so that it's
# z-axes point up and the y-axis point in
# the same direction (viewed from the top).
#---------------------------------------------
from GameLogic import *
from math import *
controller = getCurrentController()
owner = controller.getOwner()
R = owner.getOrientation()
#Take the second column (we do not need R[2][1])
R01 = R[0][1]
R11 = R[1][1]
S = sqrt(R11*R11 + R01*R01)
#Construct the new matrix
R1 = [[R11/S, R01/S, 0], [-R01/S, R11/S, 0], [0, 0, 1]]
owner.setOrientation(R1)
but where i must Edit this code for insert the value in Degree of 1 Axis for rotate this object in that axis??? the other axis is equal zero…
def degrees(alpha,beta,gamma):
alpha = -alpha * math.pi/180
beta = beta * math.pi/180
gamma = -gamma * math.pi/180
a = math.cos(alpha)
b = math.sin(alpha)
c = math.cos(beta)
d = math.sin(beta)
e = math.cos(gamma)
f = math.sin(gamma)
ad = a*d
bd = b*d
mat = [[c*e, -a*f+b*d*e, b*f+a*d*e],
[c*f, a*e+b*d*f, -b*e+a*d*f],[-d, b*c, a*c]]
return mat
That’s on an absolute type rotation. If you want a local rotation you have to multiply it by the objects orientation. alpha is the x plane, beta is the y plane, gamma is the z plane, it changes the degree values to radians and builds the matrix. I have it set so the rotations are clockwise in the blender 1,3,7 views. That was typed from Herman’s tutorial and edited a little bit. So if you object.setOrientation(degrees(0,0,90)). It will rotate it on the z plane 90 degrees absolute.
You can try this one. I haven’t used it so I can’t say anything about it.
def matToEuler():
ori = GCC().getOwner().getOrientation()
J = -asin(ori[0][2])
cJ = cos(J)
if cJ!=0.0:
cJ = 1.0/cJ
I = atan2(ori[1][2] * cJ , ori[2][2] * cJ)
K = atan2(ori[0][1] * cJ , ori[0][0] * cJ)
return (degrees(I) , degrees(J) , degrees(K))
You’d have to change that orientation variable to fit your aplication. I don’t have the degree function, but it’s just a conversion from radian to degree. See the other def. Basicly, multiply by pi and divide by 180. No that’s degree to radian, I think it’s mult by 180 and divide by pi, you’ll have to look it up. I’d be more inclined to use the one in Herman’s tutorial, though, but you’ll have to type it out from his pdf.
Hello, I know it has been a while since someone posted this thread, but I was looking for the same answer and after suffering a bit I got it.
To get just one axis angle I converted my rotation matrix that I got from KX_GameObject.getOrientation() to euler.
How to do this? simple (not to discover how :))
if you look at blenders documentation on KX_GameObject.getOrientation() it says: “Note: When using this matrix with Blender.Mathutils.Matrix() types, it will need to be transposed.” here is the trick!
First you have to create a matrix, otherwise you won’t be able to simply convert it to euler.
So do this:
# creates matrix from KX_GameObject obj
tempMatrix = Matrix(obj.getOrientation()[0],obj.getOrientation()[1],obj.getOrientation()[2])
# transpose matrix and convert it to euler
euler = tempMatrix.transpose().toEuler()
# get the angle in Y axis (you can choose your prefered axis
print euler.x