@Mad Nightmare: They don't actually go out of whack, it's just a problem that naturally occurs with Euler rotation and transformation order. DBPro rotates objects around the X axis first, followed by the Y, and then finally Z. What this means is that since Z is the last transformation to be applied, Z rotation will always happen around the
world's Z axis. Here, you can play around with this:
sync on
sync rate 60
hide mouse
autocam off
make object box 1,10,10,30
position camera 0,0,0,-45
do
set cursor 0,0
print "Press Enter to reset the object"
print "Use Up and Down to rotate the object around its X axis"
print "Use Left and Right to rotate the object around its Z axis"
print "Object Angle X: ";object angle x(1)
print "Object Angle Z: ";object angle z(1)
text screen width()/2,screen height()/2-100,"Y"
text screen width()/2,screen height()/2,"Z"
text screen width()/2+100,screen height()/2,"X"
line screen width()/2+3,screen height()/2-85,screen width()/2+3,screen height()/2-1
line screen width()/2+10,screen height()/2+7,screen width()/2+99,screen height()/2+7
if returnkey() then rotate object 1,0,0,0
if upkey() then xrotate object 1,wrapvalue(object angle x(1)+1)
if downkey() then xrotate object 1,wrapvalue(object angle x(1)-1)
if leftkey() then zrotate object 1,wrapvalue(object angle z(1)-1)
if rightkey() then zrotate object 1,wrapvalue(object angle z(1)+1)
sync
loop
Edit: Whereas using the pitch, turn, and roll commands will rotate the object around the object's local axes before the command was called.