Dear Guys, thanks for Away3D and all your efforts bringing 3d to the browser.
I am very new to Away3D. i followed these tutorials: http://www.flashmagazine.com/Tutorials/detail/flash_3d_basics/ and i was wondering if i could learn doing 3d in these steps: 1. draw a point 2. draw a line 3. draw a triangle 4. draw a square 5. draw a cube ... draw your own custom 3d models. according to: http://en.wikipedia.org/wiki/Polygon_mesh i managed to draw a line and a triangle. but no point/vertex!? here is my code: (its a flex 4.1 app, hope this is okay) <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" creationComplete="Triangles()" > <!-- <mx:VBox borderStyle="solid" id="controls" x="0" y="0"> <mx:VBox borderStyle="solid" id="manipulate_scale"> <mx:HBox> <s:NumericStepper id="manipulator_axis_scaleX" change="{axis.scaleX = manipulator_axis_scaleX.value;}" value="1" maximum="1000" minimum="-1000" stepSize="0.1"/> <mx:Label text="{manipulator_axis_scaleX.id}" width="200"/> </mx:HBox> <mx:HBox> <s:NumericStepper id="manipulator_axis_scaleY" change="{axis.scaleY = manipulator_axis_scaleY.value;}" value="1" maximum="1000" minimum="-1000" stepSize="0.1"/> <mx:Label text="{manipulator_axis_scaleY.id}" width="200"/> </mx:HBox> <mx:HBox> <s:NumericStepper id="manipulator_axis_scaleZ" change="{axis.scaleZ = manipulator_axis_scaleZ.value;}" value="1" maximum="1000" minimum="-1000" stepSize="0.1"/> <mx:Label text="{manipulator_axis_scaleZ.id}" width="200"/> </mx:HBox> </mx:VBox> <mx:VBox borderStyle="solid" id="manipulate_view"> <mx:HBox> <s:NumericStepper id="manipulator_view_width" change="{View.width = manipulator_view_width.value;}" value="500" maximum="1000" minimum="-1000" stepSize="1"/> <mx:Label text="{manipulator_view_width.id}" width="200"/> </mx:HBox> <mx:HBox> <s:NumericStepper id="manipulator_view_height" change="{View.height = manipulator_view_height.value;}" value="500" maximum="1000" minimum="-1000" stepSize="1"/> <mx:Label text="{manipulator_view_height.id}" width="200"/> </mx:HBox> </mx:VBox> </mx:VBox> --> <fx:Script> <![CDATA[ import away3d.containers.*; import away3d.core.base.*; import away3d.core.math.*; import away3d.core.render.Renderer; import away3d.materials.*; import away3d.primitives.*; import away3d.test.Button; import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; import flash.events.MouseEvent; import flash.text.TextField; import flash.text.TextFormat; import flash.utils.getTimer; [SWF(width="500", height="400", frameRate="60", backgroundColor="#FFFFFF")] private var View:View3D; private var baseObject:ObjectContainer3D; private var triangles:Array; private var numTriangles:Number = 500; private var label1:TextField; private var label2:TextField; private var lastTime:Number; private var state:String = "Single sided"; public function Triangles() { triangles = new Array(); // prep for handling resizing events systemManager.stage.scaleMode = StageScaleMode.NO_SCALE; systemManager.stage.align = StageAlign.TOP; // create a 3D-viewport View = new View3D({x:250, y:200}); View.renderer = Renderer.BASIC; systemManager.stage.addChild(View); View.camera.position = new Vector3D(400, 500, 400); View.camera.lookAt( new Vector3D(0, 0, 0) ); // Make container object to attach other objects to // An array of 3d objects to be added as children of the container on instatiation. Can contain an initialisation object baseObject = new ObjectContainer3D(); View.scene.addChild(baseObject); // ============= DRAW A POINT var desiredColour:uint = 0xFF00FF5F; var desired_x:Number = 50; var desired_y:Number = 50; var desired_z:Number = 50; var pointGraphicData = new BitmapData(1,1,true,desiredColour) var pointGraphic:Bitmap = new Bitmap(pointGraphicData); pointGraphic.x = desired_x; pointGraphic.y = desired_y; pointGraphic.z = desired_z; systemManager.stage.addChild(pointGraphic); // ============= DRAW A LINE var mat:WireframeMaterial = new WireframeMaterial( 0x56BEEC, {width:1, height:1, thickness:2}); // * Creates a 3d line segment. var line_:LineSegment = new LineSegment( { material:mat } ); var xp:Number = (Math.random()*max)-(max/2); var yp:Number = (Math.random()*max)-(max/2); var zp:Number = (Math.random()*max)-(max/2); line_.start = new Vertex(xp, yp, zp); line_.end = new Vertex(xp+100, yp+100, zp+100); baseObject.addChild(line_); // ============= DRAW A TRIANGLE var newTri:Triangle = makeTriangle(); // Move to random position var max:Number = 120; newTri.x = (Math.random()*max)-(max/2); newTri.y = (Math.random()*max)-(max/2); newTri.z = (Math.random()*max)-(max/2); newTri.material = new ColorMaterial(); // array (needed for rotation) triangles.push(newTri); // array of 3d objects baseObject.addChild(newTri); addControls(); addEventListener(Event.ENTER_FRAME, onEnterFrame); } private function onEnterFrame(e:Event):void { var fps:Number = Math.floor( 1000/(getTimer()-lastTime) ); label1.text = ""+numTriangles+" "+state+" triangles"; label2.text = ""+fps+"fps"; lastTime = getTimer(); baseObject.rotationY += 1; baseObject.rotationZ += 0.1; baseObject.rotationX -= 0.05; View.render(); } private function makeTriangle():Triangle { // Create triangle and change face var tri:Triangle = new Triangle({bothsides:false}); /* package away3d.primitives { // Creates a 3d triangle. public class Triangle extends Mesh { private var _face:Face; private function buildTriangle(edge:Number, yUp:Boolean):void { var s3:Number = 1 / Math.sqrt(3); if (yUp) _face = new Face(new Vertex(0, 0, 2*s3*edge), new Vertex(edge, 0, - s3*edge), new Vertex(-edge, 0, - s3*edge), null, new UV(0, 0), new UV(1, 0), new UV(0, 1)); else _face = new Face(new Vertex(0, 2*s3*edge, 0), new Vertex(edge, - s3*edge, 0), new Vertex(-edge, - s3*edge, 0), null, new UV(0, 0), new UV(1, 0), new UV(0, 1)); addFace(_face); type = "Triangle"; url = "primitive"; } */ tri.a = getVertex(); tri.b = getVertex(); tri.c = getVertex(); return tri; } private function getVertex():Vertex { var maxSize:Number = 100; var newX:Number = (Math.random()*maxSize)-(maxSize/2); var newY:Number = (Math.random()*maxSize)-(maxSize/2); var newZ:Number = (Math.random()*maxSize)-(maxSize/2); return new Vertex(newX,newY,newZ); } private function addControls():void { var txtFormat:TextFormat = new TextFormat("_sans",12); var pad:Number = 10; label1 = new TextField(); label1.x = pad; label1.y = pad; label1.width = 140; label1.height = 30; label1.defaultTextFormat = txtFormat; var bothSidedButton:Button = new Button("Both sided", 140, 20); bothSidedButton.addEventListener(MouseEvent.CLICK, makeBothsided); bothSidedButton.x = pad; bothSidedButton.y = 30; var singleSidedButton:Button = new Button("Toggle single sided", 140, 20); singleSidedButton.addEventListener(MouseEvent.CLICK, makeSinglesided); singleSidedButton.x = pad; singleSidedButton.y = 55; label2 = new TextField(); label2.x = pad; label2.y = 75; label2.width = 140; label2.height = 20; label2.defaultTextFormat = txtFormat; systemManager.stage.addChild(label1); systemManager.stage.addChild(label2); systemManager.stage.addChild(bothSidedButton); systemManager.stage.addChild(singleSidedButton); } private function makeBothsided(e:MouseEvent):void { for(var i:Number = 0; i < triangles.length ; i++){ var tri:Triangle = triangles[i] as Triangle; tri.bothsides = true; state = "Both sided"; } } private function makeSinglesided(e:MouseEvent):void { for(var i:Number = 0; i < triangles.length ; i++){ var tri:Triangle = triangles[i] as Triangle; tri.bothsides = false; if(tri.scaleX == 1){ // This should have been tri.invertFaces() but that's been broken for so many releases now tri.scaleX = -1; } else { tri.scaleX = 1; } state = "Single sided"; } } ]]> </fx:Script> <fx:Declarations> <!-- Place non-visual elements (e.g., services, value objects) here --> </fx:Declarations> </s:Application> thanks for help in advance!
