2013-03-04 99 views
0

我寫了一個小程序來測試投影的工作方式。帶陰影矩陣的投影,簡單測試失敗

我想特別檢查一下,投影點(可能是三角形的頂點)不在光源和平面之間,而是位於光源本身之後,即光源位於點和飛機。

問題是我的小程序甚至沒有在光線和平面之間的點處工作。我查了計算的數十倍,所以我想誤差應的邏輯,但我不能找到它..

下面的代碼

public class test { 

    int x = 0; 
    int y = 1; 
    int z = 2; 
    int w = 3; 
    float floor[][] = { 
     {-100.0f, -100.0f, 0.0f}, 
     {100.0f, -100.0f, 0.0f}, 
     {100.0f, 100.0f, 0.0f}, 
     {-100.0f, 100.0f, 0.0f}}; 
    private float shadow_floor[] = new float[16]; 
    float light_position[] = {0.0f, 0.0f, 10.0f, 1.0f}; 

    public test() { 
     //Find floorplane based on thre known points 
     float plane_floor[] = calculatePlane(floor[1], floor[2], floor[3]); 

     //store shadowMatrix for floor 
     shadow_floor = shadowMatrix(plane_floor, light_position); 

     float[] point = new float[]{1.0f, 0.0f, 5.0f, 1.0f}; 

     float[] projectedPoint = pointFmatrixF(point, shadow_floor); 

     System.out.println("point: (" + point[x] + ", " + point[y] + ", " + point[z] + ", " 
       + point[w] + ")"); 
     System.out.println("projectedPoint: (" + projectedPoint[x] + ", " + projectedPoint[y] 
       + ", " + projectedPoint[z] + ", " + projectedPoint[w] + ")"); 
    } 

    public static void main(String args[]) { 
     test test = new test(); 
    } 

    // make shadow matrix 
    public float[] shadowMatrix(float plane[], float light_pos[]) { 
     float shadow_mat[] = new float[16]; 
     float dot; 


     dot = plane[x] * light_pos[x] + plane[y] * light_pos[y] 
       + plane[z] * light_pos[z] + plane[w] * light_pos[w]; 

     shadow_mat[0] = dot - light_pos[x] * plane[x]; 
     shadow_mat[4] = -light_pos[x] * plane[y]; 
     shadow_mat[8] = -light_pos[x] * plane[z]; 
     shadow_mat[12] = -light_pos[x] * plane[3]; 

     shadow_mat[1] = -light_pos[y] * plane[x]; 
     shadow_mat[5] = dot - light_pos[y] * plane[y]; 
     shadow_mat[9] = -light_pos[y] * plane[z]; 
     shadow_mat[13] = -light_pos[y] * plane[w]; 

     shadow_mat[2] = -light_pos[z] * plane[x]; 
     shadow_mat[6] = -light_pos[z] * plane[y]; 
     shadow_mat[10] = dot - light_pos[z] * plane[z]; 
     shadow_mat[14] = -light_pos[z] * plane[w]; 

     shadow_mat[3] = -light_pos[w] * plane[x]; 
     shadow_mat[7] = -light_pos[w] * plane[y]; 
     shadow_mat[11] = -light_pos[w] * plane[z]; 
     shadow_mat[15] = dot - light_pos[w] * plane[w]; 

     return shadow_mat; 
    } 

    public float[] calculatePlane(float p1[], float p2[], float p3[]) { 
     //Array for planlikningen 
     float plane[] = new float[4]; 

     //Gitt to vektorer (tre punkter) i planet kan normalen regnes ut 
     //Vi vil ha aboluttverdier 
     plane[x] = Math.abs(((p2[y] - p1[y]) * (p3[z] - p1[z])) - ((p2[z] - p1[z]) 
       * (p3[y] - p1[y]))); 
     plane[y] = Math.abs(((p2[z] - p1[z]) * (p3[x] - p1[x])) - ((p2[x] - p1[x]) 
       * (p3[z] - p1[z]))); 
     plane[z] = Math.abs(((p2[x] - p1[x]) * (p3[y] - p1[y])) - ((p2[y] - p1[y]) 
       * (p3[x] - p1[x]))); 
     plane[w] = -(plane[x] * p1[x] + plane[y] * p1[y] + plane[z] * p1[z]); 


     return plane; 
    } 

    public float[] pointFmatrixF(float[] point, float[] matrix) { 
     int x = 0; 
     int y = 1; 
     int z = 2; 
     float[] transformedPoint = new float[4]; 

     transformedPoint[x] = 
       matrix[0] * point[x] 
       + matrix[4] * point[y] 
       + matrix[8] * point[z] 
       + matrix[12]; 
     transformedPoint[y] = 
       matrix[1] * point[x] 
       + matrix[5] * point[y] 
       + matrix[9] * point[z] 
       + matrix[13]; 
     transformedPoint[z] = 
       matrix[2] * point[x] 
       + matrix[6] * point[y] 
       + matrix[10] * point[z] 
       + matrix[14]; 
     transformedPoint[w] = 1; 

     return transformedPoint; 
    } 
} 

如果飛機是xy平面,燈亮(0,0,10)和點(1,0,5)上,那麼平面上的投影點應該是(2,0,0),但程序正在返回(400000.0,0.0,0.0,1.0)

+0

我通過例如工作在紙面上,使用相同的步驟你的程序需要,然後檢查程序對你不得不做的就是數學的工作是什麼。 ......它甚至可以幫助只是將程序仔細複製到紙上。我發現在手寫時比在打印輸出上更容易擦除和改變。 – 2013-03-04 10:26:35

+0

我試過,但它沒有工作,我總是得到相同的錯誤,錯誤是邏輯 – elect 2013-03-06 08:08:26

回答