-2

私はまだ線形代数と行列を扱うことを学んでいます。ですから、できるだけ専門用語の使用を避けるようにしてください :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])
    );
  }

これは私が得ている期待される結果です: Array ( [0] => 1 [1] => -1 [2] => 0 [3] => 10 )

しかし、今私が使用しようとすると

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

その後、結果は変わりません。(1, -1, 100, ...) ではないでしょうか? それとも私は何かについて間違っていると思いますか?

どんな答えでも私を幸せにするでしょう=)

4

1 に答える 1

0

同次座標で作業しています。ポイントは通常、 の形式です (ただし、座標(X, Y, Z, 1)には他の用途があります)。WcameraPosition による移動は、列:[0][3], [1][3], [2][3]にある必要があります。これは、設定によってのみ適用されますW = 1

于 2012-12-22T19:35:08.757 に答える