2015-10-27 3 views
0

Я пытаюсь получить позицию 3D-объекта на экране.3D-проекция на экран PHP

Я изучил этот wiki atricle https://en.wikipedia.org/wiki/3D_projection (и многие другие) , но похоже, что я получаю неправильные ответы.

$center =array(0,0,0); 
$point = array(0, 30, 30); 
$rot = array(90,0,0); 
$A=array(
    array(   1,    0,    0), 
    array(   0, cos($rot[0]), sin($rot[0])), 
    array(   0, -sin($rot[0]), cos($rot[0])) 
); 
$B=array(
    array( cos($rot[1]),    0, -sin($rot[1])), 
    array(   0,    1,    0), 
    array( sin($rot[1]),    0, cos($rot[1])) 
); 
$C=array(
    array( cos($rot[2]), sin($rot[2]),    0), 
    array(-sin($rot[2]), cos($rot[2]),    0), 
    array(   0,    0,    1) 
); 
$a=array(
    array($point[0]), 
    array($point[1]), 
    array($point[2]) 
); 
$help = matrixmult(matrixmult($A,$B),$C); 
$c = matrixmult($help, $a); 
var_dump($c); 

function matrixmult($m1,$m2){ 
    $r=count($m1); 
    $c=count($m2[0]); 
    $p=count($m2); 
    if(count($m1[0])!=$p){throw new Exception('Incompatible matrixes');} 
    $m3=array(); 
    for ($i=0;$i< $r;$i++){ 
     for($j=0;$j<$c;$j++){ 
      $m3[$i][$j]=0; 
      for($k=0;$k<$p;$k++){ 
       $m3[$i][$j]+=$m1[$i][$k]*$m2[$k][$j]; 
      } 
     } 
    } 
    return($m3); 
} 
функция

matrixmulti Я получил в Интернете и протестировал его, чтобы получить правильный ответ, когда multipling матрицы (ответы были правильными), и я получаю:

array(3) { 
    [0]=> 
    array(1) { 
    [0]=> 
    float(0) 
    } 
    [1]=> 
    array(1) { 
    [0]=> 
    float(13.377691424142) 
    } 
    [2]=> 
    array(1) { 
    [0]=> 
    float(-40.262108391892) 
    } 
} 

, но это, кажется, неправильный ответ, так как точка на плоскости y, z и поворачивая x на 90 градусов, должен дать мне ответ (0,30, -30) или (0, -30,30) в зависимости от знака. Я где-то ошибаюсь или чего-то не хватает?

ответ

0

PHP тригонометрические функции принимают ракурсы в радианах не в градусах, это также имеет место на большинстве языков.

$rot = array(90,0,0); 

должно быть:

$rot = array(M_PI/2,0,0); 
+0

Спасибо за ответ понял это вчера. Все еще проблема с правильным ответом. Я начал использовать jquery с момента его создания в WebGL, столкнулся с другими проблемами – Riiwo