来自四元数的模型视图矩阵
Model View Matrix from Quaterion
我在游戏引擎中有我的对象,由两个对象描述:
位置向量:(x, y, z);和
旋转四元数:(w, a, b, c)
我现在正在寻找构建我的模型视图矩阵所需的数学知识,我有数学而不是编程背景,所以我找到了参考函数的教程,我宁愿更好地理解原始计算。
正在 Java 中构建,使用 opengl 作为渲染引擎
顺便说一句,有谁知道 java 中设置模型矩阵的方法吗?即:
Float [3][3]矩阵=新矩阵;
ModelMatrix.set(矩阵)
?
这是我用的,q
是四元数:
matrix = new float[3][3];
float x2 = q.x*q.x, y2 = q.y*q.y, z2 = q.z*q.z;
matrix[0][0] = (1-2*z2-2*y2);
matrix[0][1] = (2*q.x*q.y+2*q.w*q.z);
matrix[0][2] = (2*q.x*q.z-2*q.w*q.y);
matrix[1][0] = (2*q.x*q.y-2*q.w*q.z);
matrix[1][1] = (1-2*z2-2*x2);
matrix[1][2] = (2*q.y*q.z+2*q.w*q.x);
matrix[2][0] = (2*q.x*q.z+2*q.w*q.y);
matrix[2][1] = (2*q.y*q.z-2*q.w*q.x);
matrix[2][2] = (1-2*y2-2*x2);
这是来自jMonkeyEngine's Quaternion class的方法
它适用于以 float[16].
结构的 4x4 矩阵
public float[] toRotationMatrix(float[] result) {
float norm = norm();
// we explicitly test norm against one here, saving a division
// at the cost of a test and branch. Is it worth it?
float s = (norm == 1f) ? 2f : (norm > 0f) ? 2f / norm : 0;
// compute xs/ys/zs first to save 6 multiplications, since xs/ys/zs
// will be used 2-4 times each.
float xs = x * s;
float ys = y * s;
float zs = z * s;
float xx = x * xs;
float xy = x * ys;
float xz = x * zs;
float xw = w * xs;
float yy = y * ys;
float yz = y * zs;
float yw = w * ys;
float zz = z * zs;
float zw = w * zs;
// using s=2/norm (instead of 1/norm) saves 9 multiplications by 2 here
result[0] = 1 - (yy + zz);
result[1] = (xy - zw);
result[2] = (xz + yw);
result[4] = (xy + zw);
result[5] = 1 - (xx + zz);
result[6] = (yz - xw);
result[8] = (xz - yw);
result[9] = (yz + xw);
result[10] = 1 - (xx + yy);
return result;
}
由于您要求的是整个模型矩阵:
平移在同一个矩阵中占据位置 3、7、11。
编辑:查找显示我对比例有误。
我在游戏引擎中有我的对象,由两个对象描述: 位置向量:(x, y, z);和 旋转四元数:(w, a, b, c)
我现在正在寻找构建我的模型视图矩阵所需的数学知识,我有数学而不是编程背景,所以我找到了参考函数的教程,我宁愿更好地理解原始计算。
正在 Java 中构建,使用 opengl 作为渲染引擎
顺便说一句,有谁知道 java 中设置模型矩阵的方法吗?即:
Float [3][3]矩阵=新矩阵; ModelMatrix.set(矩阵)
?
这是我用的,q
是四元数:
matrix = new float[3][3];
float x2 = q.x*q.x, y2 = q.y*q.y, z2 = q.z*q.z;
matrix[0][0] = (1-2*z2-2*y2);
matrix[0][1] = (2*q.x*q.y+2*q.w*q.z);
matrix[0][2] = (2*q.x*q.z-2*q.w*q.y);
matrix[1][0] = (2*q.x*q.y-2*q.w*q.z);
matrix[1][1] = (1-2*z2-2*x2);
matrix[1][2] = (2*q.y*q.z+2*q.w*q.x);
matrix[2][0] = (2*q.x*q.z+2*q.w*q.y);
matrix[2][1] = (2*q.y*q.z-2*q.w*q.x);
matrix[2][2] = (1-2*y2-2*x2);
这是来自jMonkeyEngine's Quaternion class的方法 它适用于以 float[16].
结构的 4x4 矩阵public float[] toRotationMatrix(float[] result) {
float norm = norm();
// we explicitly test norm against one here, saving a division
// at the cost of a test and branch. Is it worth it?
float s = (norm == 1f) ? 2f : (norm > 0f) ? 2f / norm : 0;
// compute xs/ys/zs first to save 6 multiplications, since xs/ys/zs
// will be used 2-4 times each.
float xs = x * s;
float ys = y * s;
float zs = z * s;
float xx = x * xs;
float xy = x * ys;
float xz = x * zs;
float xw = w * xs;
float yy = y * ys;
float yz = y * zs;
float yw = w * ys;
float zz = z * zs;
float zw = w * zs;
// using s=2/norm (instead of 1/norm) saves 9 multiplications by 2 here
result[0] = 1 - (yy + zz);
result[1] = (xy - zw);
result[2] = (xz + yw);
result[4] = (xy + zw);
result[5] = 1 - (xx + zz);
result[6] = (yz - xw);
result[8] = (xz - yw);
result[9] = (yz + xw);
result[10] = 1 - (xx + yy);
return result;
}
由于您要求的是整个模型矩阵: 平移在同一个矩阵中占据位置 3、7、11。 编辑:查找显示我对比例有误。