2012/10/25

To Build Outdoor Scenes Topology with TWaver 3D

It is quite common in general application system to present the inside of a machine room by means of 2D which is characteristic of being efficient, direct-viewing and exact. With the increase of the amount of information and the development of the technology, clients hope that there can be a more realistic 3D scene to make it more readable. TWaver Flex 3D has realized the representation of 3D scenes with the Element objects in TWaver, by expanding 3D Style of them.

Among all the requirements, the commonest one is to create an array of devices with regular shapes in a machine room and to automatically construct a cabinet with the specified rows and columns.
This standard scene can be constructed through the following codes easily:
public static function getRoomBox(id:Object):ElementBox {
            var size:Number=1600;
            var box:ElementBox=new ElementBox();
            var xgap:Number=size / 8;
            var ygap:Number=size / 8;
            var startX:Number=-xgap * 2.5;
            var starty:Number=-ygap * 2.5;
            for (var i:int=0; i < 6; i++)
            {
                for (var j:int=0; j < 6; j++)
                {
                    box.add(createRack(i + ":" + j, startX + i * xgap, starty + j * xgap));
                }
            }

            var floor:IElement=new Element();

            floor.setStyle(Style3D.MAPPINGTYPE, Consts3D.MAPPINGTYPE_COLOR);
            floor.setStyle(Style3D.THREED_SHAPE_TYPE, Consts3D.THREED_SHAPE_TYPE_CUBE);
            floor.setStyle(Style3D.MATERIAL_ALPHA, 0.6);
            floor.setStyle(Style3D.MATERIAL_COLOR, 0x999999);
            floor.setStyle(Style3D.ZORDERING_OFFSET, 2500);

            floor.setStyle(Style3D.BOTH_SIDES_VISIBLE, true);
            floor.setStyle(Style3D.PROPERTY_SPACE_LOCATION, new Vector3D(0, 0, 0));
            floor.setStyle(Style3D.PROPERTY_SIZE, new Vector3D(size + 10, 0, size + 10));
            box.add(floor);

            return box;
}
private static function createRack(id:String, x:Number, z:Number):IElement{
            var element:IElement=new Element(id);
            element.setStyle(Style3D.MAPPINGTYPE, Consts3D.MAPPINGTYPE_MAP6);
            element.setStyle(Style3D.MAPPING_COMMON_PATH, "rack3DImage");
            element.setStyle(Style3D.PROPERTY_SIZE, new Vector3D(80, 150, 80));
            element.setStyle(Style3D.PROPERTY_SPACE_LOCATION, new Vector3D(x, 150 / 2 + 10, z));
            return element;
}
After the indoor scene, clients have a new requirement that it will be better if the outside of the room can be seen, such as the representation of the connection between the room and another one. To satisfy it, we have to transfer the scene to the outside to present the storey and the connection between it and another. The following codes can help us realize that:
  public static function buildSpacialTopo(box:ElementBox):void{
                var o:Vector3D = new Vector3D(0,0,0);
                var cbp:Vector3D = new Vector3D(0,50,0);
                var lup:Vector3D = new Vector3D(100,10,-60);
                var rup:Vector3D = new Vector3D(-100,10,-60);
                var fp:Vector3D = new Vector3D(0,10,100);
                var l1:Node = createLine([o,new Vector3D(rup.x,3,0),new Vector3D(rup.x,3,rup.z)],5,0x000000);
                box.add(l1);
                l1.name = "black line";
                var l2:Node = createLine([o,new Vector3D(0,3,lup.z),new Vector3D(lup.x,3,lup.z)],5,0x00FF00);
                l2.name = "green line";
                box.add(l2);
                var l3:Node = createLine([o,new Vector3D(fp.x,2,fp.z)],3,0xFF0000);
                l3.name = "red line";
                box.add(l3);
                var cb:Node = createCube(cbp,"BI",new Vector3D(50,100,30));
                cb.name = "building";
                box.add(cb);
                var ds1:Node = createCube(lup,"NO",new Vector3D(25,40,10));
                ds1.name = "NO.1";
                box.add(ds1);
                var ds2:Node = createCube(rup,"NT",new Vector3D(35,20,10));
                ds2.name = "No.2";
                box.add(ds2);
                var f:Node = createCube(fp,"SM",new Vector3D(20,35,10));
                f.setStyle(Style3D.PROPERTY_ROT_ANGLE,new Vector3D(0,180,0));
                f.name = "SM";
                box.add(f);
}
public static function createLine(ps,width,color):Node{
                var line:Node = new Node();
                line.setStyle(Style3D.THREED_SHAPE_TYPE,Consts3D.THREED_SHAPE_TYPE_LINE);
                line.setStyle(Style3D.LINE_SHAPE_POINTS,ps);
                line.setStyle(Style3D.MAPPINGTYPE,Consts3D.MAPPINGTYPE_COLOR);
                line.setStyle(Style3D.MATERIAL_COLOR,color);
                line.setStyle(Style3D.LINE_SHAPE_WIDTH,width);
                return line;
}
public static function createCube(pos,mappingsource,size):Node {
                var node:Node = new Node();
                node.setClient("TYPE","building");
                node.setStyle(Style3D.PROPERTY_SPACE_LOCATION,pos);
                node.setStyle(Style3D.PROPERTY_SIZE,size);
                if(mappingsource!=null){
                    node.setStyle(Style3D.MAPPINGTYPE,Consts3D.MAPPINGTYPE_MAP6);
                    node.setStyle(Style3D.MAPPING_COMMON_PATH,mappingsource);
                }else{
                    node.setStyle(Style3D.MAPPINGTYPE,Consts3D.MAPPINGTYPE_COLOR);
                    node.setStyle(Style3D.MATERIAL_COLOR,0x33FF88);
                }

                return node;
}
We use the 3D model of Line to simulate the linking between these architectures. Let’s have a look:
When we are smooth in applications, clients again have a new idea: Now there have been the indoor and outdoor scenes, but in the outdoor one the architectures are alone and too simple, so the geographical relationship between the architectures is invisible. Can there be more functions like this? O-K. We have to serve clients, to meet the changeable requirements as long as we are coders.

Why not load the simulated the altitude data?
public static function buildTerrain(box:ElementBox):void{
                var node:Node = new Node();
                node.setStyle(Style3D.THREED_SHAPE_TYPE,Consts3D.THREED_SHAPE_TYPE_TERRAIN);
                node.setStyle(Style3D.MAPPINGTYPE,Consts3D.MAPPINGTYPE_COMMON);
                node.setStyle(Style3D.MAPPING_COMMON_PATH,"TT");
                node.setStyle(Style3D.MAPPING_HEIGHTMAP,"HM");
                node.setStyle(Style3D.EXTRUSION_SAMPLES,70);
                node.setStyle(Style3D.EXTRUSION_XSCALE,1);
                node.setStyle(Style3D.EXTRUSION_YSCALE,1);
                node.setStyle(Style3D.EXTRUSION_RECENTER,true);
                node.setStyle(Style3D.PROPERTY_ROT_ANGLE,new Vector3D(90,0,0));
                node.setStyle(Style3D.EXTRUSION_HSCALE,0.1);
                node.setStyle(Style3D.PROPERTY_SPACE_LOCATION,new Vector3D(-100,-100,0));
                node.setClient("TYPE","terrain");
                box.add(node);
}
Now we are able to simulate their geographical relations.


Life is colorful with a series of unexpectedness. A new requirement comes again: How do I operate? How do I interact with it? How do I lead my users to enter the computer room, operate the cabinet, and check the devices and the panes in the room?

Yeah, we have to combine these elements together. Then we add the interactional system. When a user clicks a storey, there will pop out the indoor scene of the machine room in which he can select the cabinet; when double-clicking that cabinet, there appears the 3D model of the devices in it; when double-clicking a device I can again see its panes.

network.selectionFunction = function(element:Element){
        if("terrain" == element.getClient("TYPE")){
            return false;
        }
        return true;
}
network.addEventListener(MouseEvent.MOUSE_MOVE,onClick);
                               .............
private function onSelectionChanged(evt:SelectionChangeEvent):void{
                hideShapedWindow();
                level = 0;
                b1 = null;
                b2 = null;
                var data:Element = box.selectionModel.lastData as Element;
                if(box.selectionModel.selection.contains(data)){
                    showRoomInfo(data,this.mousePos);
                }
}
private function onClick(evt:MouseEvent):void{
                var pos:Point = new Point(evt.stageX,evt.stageY);
                this.mousePos = network.globalToContent(pos);
            }
private function showRoomInfo(element:Element,pos:Point):void{
                if("building" == element.getClient("TYPE")){
                    var box:ElementBox =DataUtils.getRoomBox("fd");
                    room = createRoom();
                    showShapedWindow(room,pos);
                }
}

 

No comments:

Post a Comment