
well, looks like this was all just a gimbal lock issue after all... after talking with Sylvain and adapting:
http://www.truevision3d.com/forums/tv3d_sdk_63/replacement_meshsetrotation_function-t9869.0.html;msg69070#msg69070i was able to come up with a method using quaternions and actor.SetBoneRotationMatrix.
Public Function Rotatotronic(ByVal Rot As MTV3D65.TV_3DVECTOR) As MTV3D65.TV_3DQUATERNION
Dim QX, QY, QZ As MTV3D65.TV_3DQUATERNION
Dim QRot As MTV3D65.TV_3DQUATERNION
Dim V As MTV3D65.TV_3DVECTOR
V = globals.Vector3(1, 0, 0)
tvMath.TVQuaternionRotationAxis(QX, V, Rot.x)
V = globals.Vector3(0, 1, 0)
tvMath.TVQuaternionRotationAxis(QY, V, Rot.y)
V = globals.Vector3(0, 0, 1)
tvMath.TVQuaternionRotationAxis(QZ, V, Rot.z)
tvMath.TVQuaternionMultiply(QRot, QX, QY)
tvMath.TVQuaternionMultiply(QRot, QRot, QZ)
Return QRot
End Function
the code i use to rotate a bone
Dim q As MTV3D65.TV_3DQUATERNION
q = Rotatotronic(globals.Vector3(x, y, z))
tvMath.TVQuaternionMultiply(q, q, thing.bonequat(selbone))
thing.bonequat(selbone) = q
inside the thing class that contains my actor:
Public Property bonequat(ByVal bone As Integer) As MTV3D65.TV_3DQUATERNION
Get
Return boneq(bone)
End Get
Set(ByVal value As MTV3D65.TV_3DQUATERNION)
Dim out As MTV3D65.TV_3DMATRIX
tvMath.TVMatrixRotationQuaternion(out, value)
boneq(bone) = value
actor.SetBoneRotationMatrix(bone, out, True)
actor.ComputeNormals()
End Set
End Property
hopefully this will help anyone else who runs into this issue.