我正在嘗試查找將(x,y,z)轉換爲(x,y)所需的數學運算,以便可以使用php創建框。所有點將在網格上,並且沒有旋轉。將3D對象轉換爲2D空間
我已經嘗試了這種解決方案https://stackoverflow.com/a/25955134/379249這讓我的存在方式的一部分,但我需要弄清楚的多邊形
。例如點,我在下面紅色顯示一個大箱子。
我需要能夠給它要麼寬度,長度,高度的尺寸和起點或我可以給它的所有四個點構成每個面上。
我需要翻譯那些使它看起來3D,這是我絆倒了。
一旦紅色框被創建,我也需要能夠使用相同的功能,如綠色,藍色或橙色創建其他框。
我可以創建代碼,但我堅持數學來做翻譯。
任何想法?
謝謝!
編輯 **
感謝@ user2464424我能得到它非常接近。以下是我的代碼。
和我生成的圖像。
<?php
function RotatePoint($sin,$cos,$x,$y) {
return array($x*$cos - $y*$sin, $y*$cos + $x*$sin);
}
$im = imagecreatetruecolor(200, 200);
$white = imagecolorallocate($im, 255, 255, 255);
imagefilledrectangle($im, 0, 0, 200, 200, $white);
$brown = imagecolorallocate($im, 120, 53, 31);
$green = imagecolorallocate($im, 23, 255, 65);
$blue = imagecolorallocate($im, 31, 23, 255);
$orange = imagecolorallocate($im, 255, 185, 23);
function draw_box(&$image, $color, $start, $width, $length, $height)
{
$camx = 80;
$camy = 240;
$camz = 40;
$yaw = 10;
$pitch = 20;
$sy = sin(-$yaw); $cy = cos(-$yaw); $sp = sin(-$pitch); $cp = cos(-$pitch);
$start_x = $start[0];
$start_y = $start[1];
$start_z = $start[2];
// Draw 6 faces
for ($i = 0; $i < 6; $i++)
{
switch ($i)
{
case 0:
$face = array(
array($start_x, $start_y, $start_z),
array($start_x+$width, $start_y, $start_z),
array($start_x+$width, $start_y, $start_z+$height),
array($start_x, $start_y, $start_z+$height)
);
break;
case 1:
$face = array(
array($start_x, $start_y+$length, $start_z),
array($start_x+$width, $start_y+$length, $start_z),
array($start_x+$width, $start_y+$length, $start_z+$height),
array($start_x, $start_y+$length, $start_z+$height)
);
break;
case 2:
$face = array(
array($start_x, $start_y, $start_z),
array($start_x, $start_y+$length, $start_z),
array($start_x, $start_y+$length, $start_z+$height),
array($start_x, $start_y, $start_z+$height)
);
break;
case 3:
$face = array(
array($start_x+$width, $start_y, $start_z),
array($start_x+$width, $start_y+$length, $start_z),
array($start_x+$width, $start_y+$length, $start_z+$height),
array($start_x+$width, $start_y, $start_z+$height)
);
break;
case 4:
$face = array(
array($start_x, $start_y, $start_z+$height),
array($start_x+$width, $start_y, $start_z+$height),
array($start_x+$width, $start_y+$length, $start_z+$height),
array($start_x, $start_y+$length, $start_z+$height)
);
break;
case 5:
$face = array(
array($start_x, $start_y, $start_z),
array($start_x+$width, $start_y, $start_z),
array($start_x+$width, $start_y+$length, $start_z),
array($start_x, $start_y+$length, $start_z)
);
break;
}
$polygon = array();
foreach ($face as $point)
{
$x = $point[0] - $camx;
$y = $point[1] - $camy;
$z = $point[2] - $camz;
$rot = RotatePoint($sy,$cy,$x,$y);
$x = $rot[0];
$y = $rot[1];
$rot = RotatePoint($sp,$cp,$z,$y);
$z = $rot[0];
$y = $rot[1];
$polygon[] = $x;
$polygon[] = $z;
}
imagepolygon($image, $polygon, 4, $color);
}
}
draw_box($im, $brown, array(0, 0, 0), 80, 80, 80);
draw_box($im, $green, array(0, 0, 0), 40, 40, 40);
draw_box($im, $blue, array(0, 0, 40), 30, 20, 10);
draw_box($im, $orange, array(60, 0, 0), 15, 40, 80);
imagepng($im, './image.png');
imagedestroy($im);
?>
<img src="image.png">
一對夫婦的問題。
1:我如何從底部獲取軸的原點,現在它在右側倒過來。
2:說我總是想在400x400的圖像上生成它,我如何確保它不會脫落或能夠放大?
3:如果容器是40x40x40或10x100x100,我如何調整原點,使其始終位於圖像的底部,並且盒子的比例尺適合?
編輯 **
下面是最終代碼的鏈接: https://gist.github.com/rzfarrell/3a9e5046dcfd6bd2d2f4bfa1a34b21ef
我認爲你想要實現的是正射投影,這是正確的嗎? – user2464424
有* bazillions *的方式投影3D到2D。如果您還沒有,請查看:https://en.wikipedia.org/wiki/Graphical_projection。此外,翻譯很容易(只需做x'= x + delta等)。輪換更難:https://en.wikipedia.org/wiki/Rotation_(mathematics) –
@ user2464424是正射投影是我正在尋找。 – bones