2012-12-21 54 views
-2

我仍然在學習使用線性代數和矩陣。所以請儘量避免使用專業術語儘可能:dcreateLookAtLH-Transformation

香港專業教育學院創建了這個「createLookAtLH」功能:

function createLookAtLH($cameraPosition, $cameraTarget, $cameraUpVector) 
    { 
    $zAxis = normalized3(array(
     $cameraPosition[0] - $cameraTarget[0], 
     $cameraPosition[1] - $cameraTarget[1], 
     $cameraPosition[2] - $cameraTarget[2] 
    )); 
    $xAxis = cross(normalized3($cameraUpVector), $zAxis); 
    $yAxis = cross($zAxis, $xAxis); 
    return inverseMatrix(array(
     $xAxis[0], $yAxis[0], $zAxis[0], 0, 
     $xAxis[1], $yAxis[1], $zAxis[1], 0, 
     $xAxis[2], $yAxis[2], $zAxis[2], 0, 
     $cameraPosition[0], $cameraPosition[1], $cameraPosition[2], 1 
    )); 
    } 

normalized3,交叉和inverseMatrix是沒有問題的工作(有幾個試驗檢查)

現在我創建的矩陣和一個小例子

$view = createLookAtLH(array(-10,0,0), array(0,0,0), array(0,0,-1)); 
    $v = array(0, 1, 1, 0); 
    $v = doSomething($view, $v); 
    print_r($v); 

的「DoSomething的」功能測試(不知道該怎麼稱呼這個戲和灰)的以下內容:

function doSomething($matrix, $vector) 
    { 
    return array(
     ($matrix[00] * $vector[0]) + ($matrix[01] * $vector[1]) + ($matrix[02] * $vector[2]) + ($matrix[03] * $vector[3]), 
     ($matrix[04] * $vector[0]) + ($matrix[05] * $vector[1]) + ($matrix[06] * $vector[2]) + ($matrix[07] * $vector[3]), 
     ($matrix[08] * $vector[0]) + ($matrix[09] * $vector[1]) + ($matrix[10] * $vector[2]) + ($matrix[11] * $vector[3]), 
     ($matrix[12] * $vector[0]) + ($matrix[13] * $vector[1]) + ($matrix[14] * $vector[2]) + ($matrix[15] * $vector[3]) 
    ); 
    } 

這是預期的結果我得到: 陣列([0] => 1 [1] => -1 [2] => 0 [3] => 10)

但現在當我嘗試使用

$v = array(100, 1, 1, 0); 

那麼結果dosnt變化。不應該是(1,-1,100,...)? 還是我覺得錯誤的東西?

任何答案會讓我快樂=)

+1

添加一些jQuery? –

+0

sry,現在翻譯=) –

回答

0

您與homogeneous coordinates工作。一個點通常是(X, Y, Z, 1)的形式(儘管W座標還有其他用途)。由cameraPosition引起的轉換應在列:[0][3], [1][3], [2][3],該列僅適用於設置W = 1