2015-09-02 76 views
0

我有兩個對象描述的遊戲引擎中的對象: 位置矢量:(x,y,z);和 旋轉四元數:(W,A,B,C)Quaterion的模型視圖矩陣

現在我正在尋找我需要建立我的模型視圖矩陣的數學,我有數學,而不是編程背景所以教程我發現參考函數,我寧願更好地理解原始計算。

它被建在Java中,與OpenGL作爲渲染引擎

順便說一句,沒有人知道,在設定模型矩陣在Java中的方法嗎?即:

float [3] [3] matrix = new matrix; ModelMatrix.set(matrix)

回答

1

這是我所用,與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); 
+0

我的印象是它是一個4x4矩陣 – Peter

+1

在這種情況下,它並不重要。由於四元數只描述一個旋轉,所以除了[3] [3]元素之外,矩陣的其餘部分被設置爲0,即1. – BDL

+0

非常感謝 – Peter

2

下面是從jMonkeyEngine's Quaternion class 方法這是一種在浮法[16]構成的4×4矩陣。

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。 編輯:查找表明我錯了關於規模。

+2

這裏假設,結果之前是用一個單位矩陣初始化的。否則,所有未設置的值都是未定義的。 – BDL