pouët.net

worlds first: '3d-engine' in php

<?php
/*
	worlds first "3d-engine" written entirely in php
	copyright (c) 2002
	rasmus christian kaae kaae@daimi.au.dk
	
	note: this piece of simple code does not demonstrate 
	      anything else than the capabilities to render
	      images through serverside scripting (i.e. php).
	      it uses easy formulas and standard php-functions.
	      
	run:  to run this you need to have access to a php-server
	      with gd-lib installed. my web-account at uni has this
	      but since i figure that it would more or less kill
	      the webserver if i put it online for public-display
	      you'll need to install it yourself (or ask a friend).
*/

function getmicrotime()
{ 
    list($usec, $sec) = explode(" ",microtime()); 
    return ((float)$usec + (float)$sec); 
} 


$scale = 2.0;

$point[0][0] = -$scale; $point[0][1] = -$scale; $point[0][2] =  $scale;
$point[1][0] = -$scale; $point[1][1] =  $scale; $point[1][2] =  $scale;
$point[2][0] =  $scale; $point[2][1] =  $scale; $point[2][2] =  $scale;
$point[3][0] =  $scale; $point[3][1] = -$scale; $point[3][2] =  $scale;

$point[4][0] = -$scale; $point[4][1] = -$scale; $point[4][2] = -$scale;
$point[5][0] = -$scale; $point[5][1] =  $scale; $point[5][2] = -$scale;
$point[6][0] =  $scale; $point[6][1] =  $scale; $point[6][2] = -$scale;
$point[7][0] =  $scale; $point[7][1] = -$scale; $point[7][2] = -$scale;



$counter = getmicrotime();

$xpos = 5.0*sin($counter*0.25);
$ypos = 5.0*cos($counter*0.75);
$zpos = 10.0*sin($counter*0.5)-20.0;

$xrot = $counter;
$yrot = $counter*0.25;
$zrot = $counter*0.125;

$s1 = sin($xrot);
$s2 = sin($yrot);
$s3 = sin($zrot);
$c1 = cos($xrot);
$c2 = cos($yrot);
$c3 = cos($zrot);

for ($i=0; $i<8; $i++)
{

	$x = $point[$i][0];
	$y = $point[$i][1];
	$z = $point[$i][2];

	$point[$i][0] = $x*($s1*$s2*$s3 + $c1*$c3) + $y*($c2*$s3) + $z*($c1*$s2*$s3 - $c3*$s1);
	$point[$i][1] = $x*($c3*$s1*$s2 - $c1*$s3) + $y*($c2*$c3) + $z*($c1*$c3*$s2 + $s1*$s3);
	$point[$i][2] = $x*($c1*$s2*$s3 - $c3*$s1) + $y*(-$s2)  + $z*($c1*$c2);

	$point[$i][0] += $xpos;	
	$point[$i][1] += $ypos;
	$point[$i][2] += $zpos;
	
	if ($point[$i][2]==0) $point[$i][2]=0.000001;
	
	
	
	$point[$i][0] = 128+((256.0*$point[$i][0])/(float)$point[$i][2]);
	$point[$i][1] = 128+((256.0*$point[$i][1])/(float)$point[$i][2]);
}

header ("Content-type: image/png");
$im = @imagecreate (256, 256) or die ("Cannot Initialize new GD image stream");
$background_color = imagecolorallocate ($im, 255, 255, 255);
$wire_color = imagecolorallocate ($im, 0, 0, 0);

imageline($im, $point[0][0], $point[0][1], $point[1][0], $point[1][1], $wire_color);
imageline($im, $point[1][0], $point[1][1], $point[2][0], $point[2][1], $wire_color);
imageline($im, $point[2][0], $point[2][1], $point[3][0], $point[3][1], $wire_color);
imageline($im, $point[3][0], $point[3][1], $point[0][0], $point[0][1], $wire_color);

imageline($im, $point[4][0], $point[4][1], $point[5][0], $point[5][1], $wire_color);
imageline($im, $point[5][0], $point[5][1], $point[6][0], $point[6][1], $wire_color);
imageline($im, $point[6][0], $point[6][1], $point[7][0], $point[7][1], $wire_color);
imageline($im, $point[7][0], $point[7][1], $point[4][0], $point[4][1], $wire_color);

imageline($im, $point[4][0], $point[4][1], $point[0][0], $point[0][1], $wire_color);
imageline($im, $point[5][0], $point[5][1], $point[1][0], $point[1][1], $wire_color);
imageline($im, $point[6][0], $point[6][1], $point[2][0], $point[2][1], $wire_color);
imageline($im, $point[7][0], $point[7][1], $point[3][0], $point[3][1], $wire_color);



imagepng ($im);

?>