createLookAtLH-Transformation



我还在学习线性代数和矩阵。因此,请尽量避免使用专业术语: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);

则结果不变。它不应该是(1,- 1,100,…)吗?还是我想错了?

任何答案都会让我开心=)

您正在处理齐次坐标。一个点的典型形式是(X, Y, Z, 1)(尽管W坐标还有其他用途)。cameraPosition引起的平移应该在[0][3], [1][3], [2][3]列中,只能通过设置W = 1来实现。

相关内容

  • 没有找到相关文章

最新更新