带有 GD 的 PHP 等距立方体

Posted

技术标签:

【中文标题】带有 GD 的 PHP 等距立方体【英文标题】:PHP Isometric cube with GD 【发布时间】:2014-09-17 10:32:10 【问题描述】:

我需要用 php 和 GD 创建类似的东西:

三个可见的面孔将是同一图像的三个部分,我知道其中的坐标。

我想这可以通过图像转换和一些数学来完成。

立方体的旋转总是一样的。

我不需要像那张照片那样“描边”边缘和面部照明,我只需要一个“无阴影”立方体。

最后,结果应该是一个 alpha 透明的 PNG。

附:我的主机上只有 GD,无法访问 ImageMagick。

【问题讨论】:

从您的问题来看,您不清楚您在寻找什么。是数学、构建图像的 php 代码还是您遇到问题的 alpha 透明度?您的问题并未表明您已经努力研究解决方案。请更新。 基本上,我有三张图像,我想要一个像图片中的那样的立方体,但脸上有三张图像。我需要 PHP 代码来呈现它,但我不知道该怎么做。 如果你愿意,我可以花 100 美元做。通过 ninsuo@gmail.com 与我联系 看看这里。 github.com/BrainStone/Icon-Craft 您感兴趣的代码位于libraries/renderers/block_renderer.phplibraries/renderers/common_renderer.php 正是我想要的!谢谢,我会尽量适应我的代码 【参考方案1】:

您正在寻找类似的东西?

<?php
$size=100;

$first_poligon = array(
            0,  $size/4,  // Point 1 (x, y) ---->  0,20
            $size/2,  $size/2, // Point 2 (x, y) ---->  50,50
            $size/2,  $size,    // Point 3 (x, y) ---->  50,100
            0, ($size/4)*3,  // Point 4 (x, y) ---->  0,60
            );
$second_poligon = array(
            0,  $size/4,  // Point 1 (x, y) ---->  0,33
            $size/2,  0, // Point 2 (x, y) ---->  50,0
            $size,  $size/4,    // Point 3 (x, y) ---->  100,20
            $size/2,  $size/2,  // Point 4 (x, y) ---->  50,50
            );          
$third_poligon = array(
            $size,  $size/4,  // Point 1 (x, y) ---->  100,20
            $size/2,  $size/2, // Point 2 (x, y) ---->  50,50
            $size/2,  $size,    // Point 3 (x, y) ---->  50,100
            $size, ($size/4)*3,  // Point 4 (x, y) ---->  100,60
            );          

$im = imagecreatetruecolor($size, $size);

$fondo   = imagecolorallocate($im, 51, 0, 0);
imagefilledrectangle($im, 0, 0, $size, $size, $fondo);

$blue = imagecolorallocate($im, 0, 0, 255);
$white = imagecolorallocate($im, 255, 255, 255);
$red = imagecolorallocate($im, 255, 0, 0);

imagefilledpolygon($im, $first_poligon, 4, $blue);
imagefilledpolygon($im, $second_poligon, 4, $white);
imagefilledpolygon($im, $third_poligon, 4, $red);

imagepng($im, './image.png');

imagedestroy($im);
?>
 <img src="image.png" > 

图像结果:

【讨论】:

是的,但是脸上有图像,而不是纯色。【参考方案2】:

kraysak 的回答开始,执行以下操作:

为了使用图像而不是颜色,请替换这些行:

$blue = imagecolorallocate($im, 0, 0, 255);
$white = imagecolorallocate($im, 255, 255, 255);
$red = imagecolorallocate($im, 255, 0, 0);

imagefilledpolygon($im, $first_poligon, 4, $blue);
imagefilledpolygon($im, $second_poligon, 4, $white);
imagefilledpolygon($im, $third_poligon, 4, $red);

用这样的东西(这个例子只适用于三个面孔之一):

    对于 PNG:

    function LoadPNG($imgname)
    
    /* Attempt to open */
    $im = @imagecreatefrompng($imgname);
    
    /* See if it failed */
    if(!$im)
    
        /* Create a blank image */
        $im  = imagecreatetruecolor(150, 30);
        $bgc = imagecolorallocate($im, 255, 255, 255);
        $tc  = imagecolorallocate($im, 0, 0, 0);
    
        imagefilledrectangle($im, 0, 0, 150, 30, $bgc);
    
        /* Output an error message */
        imagestring($im, 1, 5, 5, 'Error loading ' . $imgname, $tc);
    
    
    return $im;
    
    
    header('Content-Type: image/png');
    
    $img = LoadPNG('bogus.image');
    

    代替:

     $blue = imagecolorallocate($im, 0, 0, 255)
    

    您将使用:

     $cube_face_1 = imagepng($img);
    

    而不是:

    imagefilledpolygon($im, $first_poligon, 4, $blue);
    

    您将使用:

    imagefilledpolygon($im, $first_poligon, 4, $cube_face_1);
    

来源:http://php.net/manual/en/book.image.php

在上面的链接中,您可以找到有关 gif/jpeg 图像的详细信息。我的演示是针对 png 图像的。

【讨论】:

我已经用imagecreatefrompng 加载了我的图像,但是当我使用$cube_face_1 = imagepng($img); 时,原始图像被发送到浏览器,而不是3D 立方体。根据php.net/manual/en/function.imagepng.php,imagepng 返回布尔值。直接将图像对象与imagefilledpolygon 一起使用会导致类型不匹配错误。 代替:$img = LoadPNG('bogus.image'); , 直接使用 $cube_face_1 = LoadPNG('bogus.image'); .它应该可以工作。 已经试过了,不行(预期类型int,找到资源) 我找到了使用图像而不是颜色的解决方案。请参阅此页面:tuxradar.com/practicalphp/11/2/5。希望我能帮上忙。 参见:***.com/questions/9748968/…【参考方案3】:

我不能让这个问题打败我......(我也想帮助你,但不是那么多:P) 所以,我做了这个小代码,几乎可以解决你 70% 的问题:

  <?php
  $size=200;

    $im= imagecreatetruecolor($size,$size);
    $orige = imagecreatefrompng("test2.png");
    $orige2 = imagecreatefrompng("tesst3.png");

    $limit=0;
    $newlimit=0;
        for($y=$size/4;$y<=$size;$y++)
            for($x=0;$x<=$size/2;$x++)

                    if($y>($size/4)*3)
                            if( $x>=$newlimit)
                            copy_pixel($im,$orige,$x,$y,NULL);  //copy left image
                            copy_pixel($im,$orige2,$x,$y,$size-$x); //copy rightimage
                            
                    
                    else
                            copy_pixel($im,$orige,$x,$y,NULL);  //copy left image
                            copy_pixel($im,$orige2,$x,$y,$size-$x); //copy rightimage           
                    

            if($x==$limit and $limit<= $size/2) $limit=$limit+2; break;                           
            
            if($y>=($size/4)*3)$newlimit=$newlimit+2;
                                       
    imagepng($im, "n.png");

    function copy_pixel($im,&$orige,$x,$y,$newx)
                if($newx==NULL) $newx=$x;
                    $rgb = imagecolorat($orige, $x, $y);
                    $color = imagecolorsforindex($orige, $rgb);

                    $red=preg_replace("/[^0-9]/","",$color["red"]);
                    $green=preg_replace("/[^0-9]/","",$color["green"]);
                    $blue=preg_replace("/[^0-9]/","",$color["blue"]);

                    $color_to_paste = imagecolorallocate($im, $red, $green, $blue); 
                    imagesetpixel($im,$newx, $y, $color_to_paste);  
    
    ?>
    <img src="n.png" > 

结果: 右边是以前的代码制作的图像。

【讨论】:

以上是关于带有 GD 的 PHP 等距立方体的主要内容,如果未能解决你的问题,请参考以下文章

带有立方体贴图的 OpenGL 点光阴影映射

是否可以使用带有立方体贴图颜色附件的深度渲染缓冲区?

小程序 - 带有 for 循环的简单正方形和立方体

如何在 OpenGL 中使用立方体贴图数组来渲染带有阴影贴图的多个点光源?

如何禁止在Qt中使用带有按钮的键盘上的箭头键

OpenGL:渲染天空盒立方体贴图问题