3D 投影到屏幕 PHP
3D projection to screen PHP
我正在尝试获取屏幕上的 3d 对象位置。
我研究了这个 wiki 文章 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),具体取决于符号。是我哪里错了还是漏了什么?
PHP 三角函数采用弧度而不是度数的角度,大多数语言也是如此。
$rot = array(90,0,0);
应该是:
$rot = array(M_PI/2,0,0);
我正在尝试获取屏幕上的 3d 对象位置。
我研究了这个 wiki 文章 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),具体取决于符号。是我哪里错了还是漏了什么?
PHP 三角函数采用弧度而不是度数的角度,大多数语言也是如此。
$rot = array(90,0,0);
应该是:
$rot = array(M_PI/2,0,0);