Isometric Voxels

Actionscript:
1. // isometric conversion
2. var centerX:Number=stage.stageWidth/2;
3. var centerY:Number=stage.stageHeight/2;
4. var theta:Number=Math.PI/4;// 45 degrees;
5. var cosX:Number=Math.cos(theta);
6. var sinX:Number=Math.sin(theta);
7. var pnt:Point = new Point();
8. function iso3D(x:Number, y:Number, z:Number):Point {
9.     pnt.x = centerX + (x-z) *  cosX
10.     pnt.y = centerY -  (x+z) * 0.5 * sinX - y;
11.     return pnt;
12. }
13. // example:
14. var canvas:BitmapData=new BitmapData(stage.stageWidth,stage.stageHeight,true,0xFF000000);
16. var size:int=100;
17. var hs:int=size / 2;
18. var pen:Point = new Point();
19. var vect:Vector3D = new Vector3D();
20. // draw a few shapes with offset:
21. for (var dist:int = 10; dist <= 80; dist *= 2) {
22.     // voxel space:
23.     for (var i:int = 0; i<size; i++) {
24.         for (var j:int = 0; j<size; j++) {
25.             for (var k:int = 0; k<size; k++) {
26.                 vect.x=j-hs;
27.                 vect.y=i-hs;
28.                 vect.z=k-hs;
29.                 pen = iso3D(vect.x,vect.y,vect.z);
30.                 if (Math.sqrt((vect.x * vect.x) + (vect.y * vect.y) + (vect.z * vect.z)) <dist) {
31.                     // using Vector3D.distance() is very slow compared to above
32.                     // a few types of coloring:
33.                     var xp:Number = pen.x + (dist <<2) - 200;
34.                     canvas.setPixel(xp, pen.y-100, (i <<16 | j <<8 | k) <<1);
35.                     canvas.setPixel(xp, pen.y+100, (k <<16 | k <<8 | k+j)  );
36.                 }
37.             }
38.         }
39.     }
40. }

The above will draw this: This isn't the speediest way to do voxels (especially if you want to animate). This was just the first thing that came to mind.

1. Pablo Reda
Posted February 25, 2011 at 6:51 am | Permalink

Hi Zevan,

I found your code and traslate to :r4 only for fun, the result is in

I hope you not angry Bye
Pablo

2. Zevan
Posted February 25, 2011 at 8:25 am | Permalink

Hey Pablo. Why would I be angry…. that’s awesome nice work.

3. Milan
Posted April 29, 2011 at 11:06 pm | Permalink

Hey will u please explain why you write this line i cant understand that
var xp:Number = pen.x + (dist <<2) - 200;