TWaver - 專注UI技術

          http://twaver.servasoft.com/
          posts - 171, comments - 191, trackbacks - 0, articles - 2
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          TWaver 3D應用“諜報”

          Posted on 2011-03-10 12:20 TWaver 閱讀(2003) 評論(1)  編輯  收藏

          “hi,用你們TWaver能不能開發個3D的機房圖?。?#8221;
          現在這句話幾乎成了客戶見我后的第二句話了,機房管理的呈現方式已經走了n久了,做資源管理的兄弟們奮發拼搏,為了最終客戶的口味一次次的去加班,做模板,挖空心思去想創意,從經典的表格式(很慶幸,我沒有經歷那個年代)走到平面圖管理(圖一),


          從純平面圖走向仿3D的正視效果(圖二),


          本想已經做到極致了,可是沒料到,萬惡的摩爾定律,萬惡的GPU,萬惡的3D游戲把最終客戶的口味充分調動了起來,現在居然有了機房3D實景構建的需求。 

          在各個廠家都在關注于業務做強做精的時候,讓他們分心出來做這種效果,無論是哪一家廠商,都是一個不菲的成本項。滴水匯成海,各個廠家開始把這種需求越來越詳盡的反饋到了TWaver這邊,客戶的需求就是TWaver的責任,TWaver中國這邊迅速將需求整理匯集,發往了美國核心開發組,抓緊立項開發。經過緊張的工作,core team已經給我發過來了試用包,兄弟得以第一時間嘗鮮,我這里就趕緊的把這個包的特點提前披露,跟各位兄弟分享一下。
          TWaver的3D開發包命名為TWaver 3D,立足于Java、Flex、.Net、HTML5多個語言開發平臺(當然目前兄弟我還是只拿到了Java版,畢竟這個是TWaver的魂魄所屬)。這個開發包設計目標是透明化3D開發,降低2D界面到3D界面的門檻,平滑轉移原來TWaver客戶項目的3D化需求;它的功能主要羅列如下:
          (1)呈現3D場景
          (2)內建(built-in)常見對象的3D模型,例如Room,Node,Equipment等等
          (3)提供場景渲染接口
          (4)提供默認交互接口及實現,例如鼠標導航,視圖縮放,實體對象的操作等等.這個功能,可以參考下面的例子
          TWaver3D 初體驗


          (5)已有模型文件的導入,例如3ds。(據我所知,此部分還在緊張進行中)
          (6)簡化用戶3D開發的代碼復雜度,支持TWaver原有平面模型的轉換。這個功能大家可以看一個我們的一個小例子視頻:
          設備平面圖映射為設備的3D模型

          對于TWaver的用戶來說,渲染效果是一方面,另一方面還得把二次開發的復雜度大大降低才行,否則他們自己成本的控制就無從談起。我第一時間收到老外的郵件的時候,他在郵件里提的最多的就是可以大大降低用戶開發的代碼量。究竟有多省,我們自己來看看


           1public static void main(String[] args) {
           2    JFrame frame = new JFrame();
           3    final TDataBox box = new TDataBox();
           4    final TNetwork3D network = new TNetwork3D(box);
           5    network.setSelectedMode(Consts3D.SELECTED_MODE_SKELEON);
           6    JPanel panel = new JPanel(new BorderLayout());
           7    panel.add(network, BorderLayout.CENTER);
           8    JPanel controlPanel = new JPanel(new FlowLayout(FlowLayout.LEADING));
           9    ActionListener listener = new ActionListener() {
          10        public void actionPerformed(ActionEvent e) {
          11            String command = e.getActionCommand();
          12            AbstractButton ab = (AbstractButton) e.getSource();
          13            if (ab instanceof JCheckBox) {
          14                JCheckBox s = (JCheckBox) ab;
          15                if ("show axes".equals(command)) {
          16                    network.setAxexVisible(s.isSelected());
          17                }
           else if ("show background".equals(command)) {
          18                    Color bc = ab.isSelected() ? Color.CYAN : null;
          19                    network.setBackground(bc);
          20                }
           else if ("highlight".equals(command)) {
          21                    int mode = ab.isSelected() ? Consts3D.SELECTED_MODE_HIGHLIGHT : Consts3D.SELECTED_MODE_SKELEON;
          22                    network.setSelectedMode(mode);
          23                }

          24            }
           else {
          25            }

          26        }

          27    }
          ;
          28    controlPanel.add(createButton(0"show axes", listener));
          29    controlPanel.add(createButton(0"show background", listener));
          30    controlPanel.add(createButton(0"highlight", listener));
          31    panel.add(controlPanel, BorderLayout.SOUTH);
          32    frame.setContentPane(panel);
          33    frame.setSize(1024700);
          34    frame.setVisible(true);
          35    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          36    frame.setLocationRelativeTo(null);
          37    javax.swing.SwingUtilities.invokeLater(new Runnable() {
          38        public void run() {
          39                               //build the 3D scene
          40            Room room = new Room();
          41            Utils3D.setLocation(room, 000);
          42            Utils3D.setSize(room, 15212);
          43            box.addElement(room);
          44            double startx = -6.2;
          45            double starty = -5;
          46            double colStep = 1.3;
          47            double rowStep = 2;
          48            double length = 0.8;
          49            double height = 1.8;
          50            double depth = length;
          51            for (int col = 0; col < 10; col++{
          52                for (int row = 0; row < 6; row++{
          53                    Rack chassis = new Rack();
          54                    Utils3D.setLocation(chassis, startx + col * colStep,
          55                                                                          starty + row * rowStep, 0);
          56                    Utils3D.setSize(chassis, length, height, depth);
          57                    box.addElement(chassis);
          58                }

          59            }

          60        }

          61    }
          );
          62}

          63public static AbstractButton createButton(int type, String command, ActionListener listener) {
          64    AbstractButton button = null;
          65    if (type == 0{
          66        button = new JCheckBox(command);
          67    }
           else {
          68        button = new JButton(command);
          69    }

          70    button.addActionListener(listener);
          71    return button;
          72}


          這段代碼除了界面布局、ActionListener處理、以及Swing對象的構建之外,就只剩下12行做機房模型的代碼了。大家想知道這點代碼能做到什么效果嗎,請看
          快速搭建3D機房實景


          評論

          # re: TWaver 3D應用“諜報”  回復  更多評論   

          2011-03-10 13:35 by 日月雨林@gmail.com
          這個很強悍啊!

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 新化县| 宁蒗| 清涧县| 四川省| 大姚县| 巢湖市| 曲周县| 思茅市| 新疆| 华亭县| 林州市| 隆回县| 合川市| 东乡族自治县| 西畴县| 马尔康县| 罗平县| 中卫市| 平原县| 丹寨县| 普格县| 淮北市| 辛集市| 南部县| 普宁市| 丰镇市| 德令哈市| 进贤县| 永济市| 理塘县| 行唐县| 卢湾区| 北流市| 英吉沙县| 九江县| 衡南县| 贵阳市| 临泽县| 西乌| 嘉义市| 广宗县|