вращение — 3D проекция на экран Переполнение стека

Я пытаюсь получить положение 3D объекта на экране.

Я изучил эту статью в вики 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 Я подключился к сети и проверил ее, чтобы получить правильный ответ при умножении матриц (ответы были правильными), и я получаю:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]