我仍在学习使用线性代数和矩阵。所以请尽量避免使用技术术语:D
我创建了这个“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,cross和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,......)? 或者我认为错了什么?
任何答案都会让我开心=)
答案 0 :(得分:0)
您正在使用homogeneous coordinates。点通常为(X, Y, Z, 1)
形式(尽管W
坐标还有其他用途)。由于cameraPosition引起的转换应位于以下列中:[0][3], [1][3], [2][3]
,仅通过设置W = 1
来应用。