Posted on 2011-03-10 12:20
TWaver 閱讀(2003)
評論(1) 編輯 收藏
“hi,用你們TWaver能不能開發(fā)個(gè)3D的機(jī)房圖啊?”
現(xiàn)在這句話幾乎成了客戶見我后的第二句話了,機(jī)房管理的呈現(xiàn)方式已經(jīng)走了n久了,做資源管理的兄弟們奮發(fā)拼搏,為了最終客戶的口味一次次的去加班,做模板,挖空心思去想創(chuàng)意,從經(jīng)典的表格式(很慶幸,我沒有經(jīng)歷那個(gè)年代)走到平面圖管理(圖一),

從純平面圖走向仿3D的正視效果(圖二),
本想已經(jīng)做到極致了,可是沒料到,萬惡的摩爾定律,萬惡的GPU,萬惡的3D游戲把最終客戶的口味充分調(diào)動(dòng)了起來,現(xiàn)在居然有了機(jī)房3D實(shí)景構(gòu)建的需求。
在各個(gè)廠家都在關(guān)注于業(yè)務(wù)做強(qiáng)做精的時(shí)候,讓他們分心出來做這種效果,無論是哪一家廠商,都是一個(gè)不菲的成本項(xiàng)。滴水匯成海,各個(gè)廠家開始把這種需求越來越詳盡的反饋到了TWaver這邊,客戶的需求就是TWaver的責(zé)任,TWaver中國這邊迅速將需求整理匯集,發(fā)往了美國核心開發(fā)組,抓緊立項(xiàng)開發(fā)。經(jīng)過緊張的工作,core team已經(jīng)給我發(fā)過來了試用包,兄弟得以第一時(shí)間嘗鮮,我這里就趕緊的把這個(gè)包的特點(diǎn)提前披露,跟各位兄弟分享一下。
TWaver的3D開發(fā)包命名為TWaver 3D,立足于Java、Flex、.Net、HTML5多個(gè)語言開發(fā)平臺(當(dāng)然目前兄弟我還是只拿到了Java版,畢竟這個(gè)是TWaver的魂魄所屬)。這個(gè)開發(fā)包設(shè)計(jì)目標(biāo)是透明化3D開發(fā),降低2D界面到3D界面的門檻,平滑轉(zhuǎn)移原來TWaver客戶項(xiàng)目的3D化需求;它的功能主要羅列如下:
(1)呈現(xiàn)3D場景
(2)內(nèi)建(built-in)常見對象的3D模型,例如Room,Node,Equipment等等
(3)提供場景渲染接口
(4)提供默認(rèn)交互接口及實(shí)現(xiàn),例如鼠標(biāo)導(dǎo)航,視圖縮放,實(shí)體對象的操作等等.這個(gè)功能,可以參考下面的例子
TWaver3D 初體驗(yàn)
(5)已有模型文件的導(dǎo)入,例如3ds。(據(jù)我所知,此部分還在緊張進(jìn)行中)
(6)簡化用戶3D開發(fā)的代碼復(fù)雜度,支持TWaver原有平面模型的轉(zhuǎn)換。這個(gè)功能大家可以看一個(gè)我們的一個(gè)小例子視頻:
設(shè)備平面圖映射為設(shè)備的3D模型
對于TWaver的用戶來說,渲染效果是一方面,另一方面還得把二次開發(fā)的復(fù)雜度大大降低才行,否則他們自己成本的控制就無從談起。我第一時(shí)間收到老外的郵件的時(shí)候,他在郵件里提的最多的就是可以大大降低用戶開發(fā)的代碼量。究竟有多省,我們自己來看看
1
public 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(1024, 700);
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, 0, 0, 0);
42
Utils3D.setSize(room, 15, 2, 12);
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
}
63
public 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對象的構(gòu)建之外,就只剩下12行做機(jī)房模型的代碼了。大家想知道這點(diǎn)代碼能做到什么效果嗎,請看
快速搭建3D機(jī)房實(shí)景