将 3D 旋转转换为 2D 旋转
Converting 3D rotation to 2D rotation
我一直在尝试计算从 Maya 中具有 XYZ 旋转值的 3D 对象的正交“顶部”视图看到的 2D 旋转值。也许另一种问这个问题的方式是:我想弄清楚 3D obj 方向的 2D 旋转。
这是一张简单的图片来说明我的问题:
我已经尝试过使用四元数(脚本粘贴在下面)等方法获取对象的扭曲值,为此 post 我发现:Component of a quaternion rotation around an axis.
如果我将四元数的 X 和 Z 值设置为零,则此方法会半途而废。即使 obj 在 X 轴和 Y 轴上旋转,我也可以获得正确的 2D 旋转,但是当在所有 3 轴上旋转时,结果是错误的。
我对所有四元数和矢量计算都很陌生,所以我一直难以理解它。
;)
def quaternionTwist(q, axisVec):
axisVec.normalize()
# Get the plane the axisVec is a normal of
orthonormal1, orthonormal2 = findOrthonormals(axisVec)
transformed = rotateByQuaternion(orthonormal1, q)
# Project transformed vector onto plane
flattened = transformed - ((transformed * axisVec) * axisVec)
flattened.normalize()
# Get angle between original vector and projected transform to get angle around normal
angle = math.acos(orthonormal1 * flattened)
return math.degrees(angle)
q = getMQuaternion(obj)
# Zero out X and Y since we are only interested in Y axis.
q.x = 0
q.z = 0
up = om2.MVector.kYaxisVector
angle = quaternionTwist(q, up)
我不熟悉您正在使用的框架,但如果它看起来像那样,我想您就差不多了。在调用 quaternionTwist()
.
之前不要将四元数的 X 和 Z 分量归零
四元数 q1 = (x,y,z,w)
和 q2 = (0, y, 0, w)
不代表绕 y 轴的相同旋转,特别是因为 q2
以这种方式编写变得不规范,所以你真正比较是 (x,y,z,w)
与 (0, y/|q2|, 0, w/|q2|)
其中 |q2| = sqrt(y^2 + w^2)
.
你能得到旋转矢量的(x,y,z)坐标吗?一旦你有了它们,就可以使用 (x,y) 值找到 atan2(y,x)
.
的角度
这是使用 的 Maya 工作代码:
matrix = dagPath.inclusiveMatrix() #OpenMaya dagPath for an object
axis = om2.MVector.kZaxisVector
v = (axis * matrix).normal()
angle = math.atan2(v.x, v.z) #2D angle on XZ plane
我一直在尝试计算从 Maya 中具有 XYZ 旋转值的 3D 对象的正交“顶部”视图看到的 2D 旋转值。也许另一种问这个问题的方式是:我想弄清楚 3D obj 方向的 2D 旋转。
这是一张简单的图片来说明我的问题:
我已经尝试过使用四元数(脚本粘贴在下面)等方法获取对象的扭曲值,为此 post 我发现:Component of a quaternion rotation around an axis.
如果我将四元数的 X 和 Z 值设置为零,则此方法会半途而废。即使 obj 在 X 轴和 Y 轴上旋转,我也可以获得正确的 2D 旋转,但是当在所有 3 轴上旋转时,结果是错误的。
我对所有四元数和矢量计算都很陌生,所以我一直难以理解它。
;)
def quaternionTwist(q, axisVec):
axisVec.normalize()
# Get the plane the axisVec is a normal of
orthonormal1, orthonormal2 = findOrthonormals(axisVec)
transformed = rotateByQuaternion(orthonormal1, q)
# Project transformed vector onto plane
flattened = transformed - ((transformed * axisVec) * axisVec)
flattened.normalize()
# Get angle between original vector and projected transform to get angle around normal
angle = math.acos(orthonormal1 * flattened)
return math.degrees(angle)
q = getMQuaternion(obj)
# Zero out X and Y since we are only interested in Y axis.
q.x = 0
q.z = 0
up = om2.MVector.kYaxisVector
angle = quaternionTwist(q, up)
我不熟悉您正在使用的框架,但如果它看起来像那样,我想您就差不多了。在调用 quaternionTwist()
.
四元数 q1 = (x,y,z,w)
和 q2 = (0, y, 0, w)
不代表绕 y 轴的相同旋转,特别是因为 q2
以这种方式编写变得不规范,所以你真正比较是 (x,y,z,w)
与 (0, y/|q2|, 0, w/|q2|)
其中 |q2| = sqrt(y^2 + w^2)
.
你能得到旋转矢量的(x,y,z)坐标吗?一旦你有了它们,就可以使用 (x,y) 值找到 atan2(y,x)
.
这是使用
matrix = dagPath.inclusiveMatrix() #OpenMaya dagPath for an object
axis = om2.MVector.kZaxisVector
v = (axis * matrix).normal()
angle = math.atan2(v.x, v.z) #2D angle on XZ plane