GLM - 四元数和旋转
GLM - Quaternions and Rotation
我正在尝试使用四元数来旋转程序中的对象。
但他们的问题是应用...轮换。
我正在尝试以这种方式旋转矩阵:
ModelMatrix = ModelMatrix * glm::toMat4(glm::quat(RotationW, RotationX, RotationY, RotationZ));
使用随机数,结果是一个巨大的缩放 (why) 和一点旋转。
另外假设我们有:
quat3 = quat2 * quat1
Model1 = Model * glm::toMat4(glm::quat( quat3.w , quat3.x, quat3.y, quat3.z);
Model2 = Model * glm::toMat4(glm::quat( quat1.w , quat1.x, quat1.y, quat1.z);
Model2 = Model2 * glm::toMat4(glm::quat( quat2.w , quat2.x, quat2.y, quat2.z);
Model2和Model1的旋转是否相同?
我知道 glm::rotate(Model,RotationAngle, RotationAxis) ,但我宁愿使用四元数
为了使四元数表示纯旋转,它必须是单位四元数。随机数一般没有这个属性。您可能希望在生成四元数之前对它们进行归一化:
l = sqrt(RotationW * RotationW + RotationX * RotationX
+ RotationY * RotationY + RotationZ * RotationZ);
RotationW /= l;
RotationX /= l;
...
当然,仅仅使用四元数将它们转换为矩阵是没有任何意义的。直接计算矩阵会更高效
对于四元数乘积,您的顺序有误:
q3 = q2 * q1
=> M * mat(q3) = M * mat(q2) * mat(q1)
我正在尝试使用四元数来旋转程序中的对象。
但他们的问题是应用...轮换。 我正在尝试以这种方式旋转矩阵:
ModelMatrix = ModelMatrix * glm::toMat4(glm::quat(RotationW, RotationX, RotationY, RotationZ));
使用随机数,结果是一个巨大的缩放 (why) 和一点旋转。
另外假设我们有:
quat3 = quat2 * quat1
Model1 = Model * glm::toMat4(glm::quat( quat3.w , quat3.x, quat3.y, quat3.z);
Model2 = Model * glm::toMat4(glm::quat( quat1.w , quat1.x, quat1.y, quat1.z);
Model2 = Model2 * glm::toMat4(glm::quat( quat2.w , quat2.x, quat2.y, quat2.z);
Model2和Model1的旋转是否相同?
我知道 glm::rotate(Model,RotationAngle, RotationAxis) ,但我宁愿使用四元数
为了使四元数表示纯旋转,它必须是单位四元数。随机数一般没有这个属性。您可能希望在生成四元数之前对它们进行归一化:
l = sqrt(RotationW * RotationW + RotationX * RotationX
+ RotationY * RotationY + RotationZ * RotationZ);
RotationW /= l;
RotationX /= l;
...
当然,仅仅使用四元数将它们转换为矩阵是没有任何意义的。直接计算矩阵会更高效
对于四元数乘积,您的顺序有误:
q3 = q2 * q1
=> M * mat(q3) = M * mat(q2) * mat(q1)