$ Z: s# Y- h9 _% R y2 U, D5 ^ ; w/ t, m6 ^) v4 {! Z7 E9 V# D. N
前言 # Q/ `; ^+ |1 x3 h9 ?5 {8 F, S
! @% D v, o/ y- y
; o" K9 `9 A$ n. Q: ^
我国是一个海洋大国,拥有漫长的海岸线、辽阔的管辖海域和丰富的海洋资源。党的十九大报告明确提出:“坚持陆海统筹,加快建设海洋强国”。从海洋大国到海洋强国,符合我国发展规律、世界发展潮流,是实现中华民族伟大复兴“中国梦”的必然选择。 - _( ^: T( }$ I, V; e; B
" [7 e+ r0 ^. S: X- v* O: `3 B. X4 s
/ `3 }! ?* z d 风能,作为一种清洁无公害,取之不尽,用之不竭的可再生资源,非常适合用来发电。我国风能资源丰富,可开发利用的风能储量约为 10 亿千瓦,其中海上可开发和利用的风能储量达到了 7.5 亿千瓦。依托于丰富的海洋风能资源,加快海上风电项目的建设和发展,对加速沿海地区的能源转型,推动地方经济发展,提升沿海地区的生态环境,推动风电技术进展和产业升级,促进能源结构调整具有重要的意义。因此,海上风力发电场应运而生。 f& ^8 z+ Z4 h
' m% |/ G9 F! Y u* m) y1 A& \3 N
/ t: ]0 Y! e _& P8 S- ]5 R, U; s
介于 2D 组态和 3D 组态上, Hightopo (以下简称 HT) 的 HT for Web 产品拥有丰富的组态化可供选择。文章将介绍如何运用 HT 丰富的 2D/3D 组态搭建出一个海上风力发电场的解决方案,希望能够抛砖引玉,给大家带来更多海上风电场的思考和讨论。 1 C5 B/ `/ `0 ?# `# y
7 \1 |/ C- O* f) ^5 k; g% q; H8 B + N8 G: a2 Z% ^' o h8 \* K
界面简介及效果总览 $ u7 e6 g( X6 O/ z9 N9 o
$ P3 Q% c% O. A5 o/ r, M7 L7 G
2 d* t4 N4 k; u& X( p
' ~5 A" S' a$ b, E2 j7 {4 C
( c7 \1 u2 _& U1 P& j, G0 Q
- [+ F& F, [# g' T Demo 主页面中展示了海上风电场的基本构成,包括一定规模数量的风电机组,输电系统和升压台。风电机组有序排放,叶片随风向和风速不停转动,将海洋上丰富的风的动能经过一系列转换,转化为宝贵的电能输出;每个风电机节点产生的电能经过输电系统源源流动,如同水流般汇聚于海上风电场的“心脏”——升压台。
4 f8 n6 q9 J+ B- }2 w
; @7 i. ~2 x+ I0 E0 k+ b; n) ]2 ]
- T9 @4 I* @& t8 d4 x! ~ / r/ H6 b9 o: Y, V4 T% y; C
' A! P* m( u3 O9 }' P1 t% L% T
: n: q/ h8 W1 S# x/ } s% y 点击风机叶片,可以进入叶片的微观世界,以微观视角看风机的详细信息,包括风机参数,环境参数,发电信息和故障信息等。场景的搭建采用 HT 自主研发的基于 HTML5 的 2D/3D 渲染引擎完成,其中的动画和人机交互也是基于自主研发的组件,依托于 JavaScript 和 HTML5 完成。 % U: C$ R* t" y
& _0 v' Q/ V- B, @# y% V- `) I
, ?) A6 ]8 O9 V0 _5 ]. ^: e* ]; w 实现过程 6 [% _+ N7 _( Y0 q+ e; D# ~$ x
9 o7 L, I! g* Z4 h* r: d
: x( R# X1 [# g 场景加载
9 X* W* |( U0 }7 K5 \
% S% a0 c9 Y+ e |: i2 g 2 m0 x5 Y7 Z* S4 d3 O
在前面部分,文章提到本案例的场景都是通过自主研发的渲染引擎完成,那么搭建好的场景如何通过代码加载,呈现给用户呢?在 HT 中,我们通过 ht.graph.GraphView 和 ht.graph.Graph3DView 分别来呈现 2D 和 3D 场景,然后通过反序列化完成场景的加载。 & n; P: P! V: l; @: v
6 D" S* |8 |1 ~ c6 z8 K: V
; J5 P& Z7 m: w+ u. z 开场动画 " J( V: J9 [7 z+ j/ u
3 A7 E0 z# G* E, l& k) r/ t) K
: O# w/ \4 k/ e" T* q( b: T6 @
& v1 N7 y: G( i1 s5 q, V* {& g
2 O5 n) D; J3 v+ P & | J# F$ p/ T/ S0 Q5 v% U: x) c
本案例的开场动画相对比较简单,动画的核心机制是使用了 HT 内部封装的动画函数 ht.Default.startAnim(),通过启动一个动画对象来使整个动画运行起来。
$ d7 }, w7 U. y5 Q
6 R. \1 X0 w, o! L3 ^7 G
# j) K1 [$ R6 x0 r ht.Default.starAnim() 支持 Frame-Based 和 Time-Based 两种方式的动画,Frame-Based 的方式是用户通过指定 frames 动画帧数,以及 interval 动画帧间隔参数来控制动画效果,而 Time-Based 的方式是用户只需要指定 duration 的动画周期的毫秒数即可,HT 将在指定的时间周期内完成动画;还设定了 delay 动画延迟执行的时间来搭配动画实现的效果;easing 参数则是用于让用户自定义函数,通过数学公式控制动画,如匀速变化、先慢后快等效果;action 函数的第一个参数 v 代表通过 easing(t) 函数运算后的值, t 代表当前动画进行的进度 [0, 1],一般属性变化根据 v 参数进行。 1 ~3 f1 h6 G5 S; k& Z
8 [0 c7 v; H) b
4 z) `1 u9 p6 p+ X8 T% y finishFunc 参数代表动画结束后的动作。action 函数和 finishFunc 动画结束回调函数,通过一些效果的搭配使用,可以使用户达到平滑的动画效果。 * a( j2 a' \1 O. c
; M1 T1 l M- q2 f" [ # p1 M( E& a3 p( B4 s2 v1 [3 l
本案例的开场动画通过设置起始和终止视角的位置,在一定周期内, 使用 setEye(eye) 来完成视角的变化。 1 x8 h# N9 E4 Y1 Y- W" C# o
9 }; A3 j, M I9 F3 j+ z( A6 U) S
6 X2 d& c6 I$ T! p, H
实现价值 # z& {: q# |3 f3 |. ?
/ t3 q4 |& ~; W 6 X5 r3 X3 y) {5 K# f
风电机组: 2 l: y" q" ^8 I' e
8 Y1 C! b+ o6 i* V
9 E1 r. r$ u3 F0 S 随风而动,将海上风能转化为电能
$ j- _8 o8 j$ g& e. b6 W ' P y: F) P+ N- ^4 e2 I7 n
1 J$ x; z6 ]1 e8 D9 g5 v
2 P- L& _ w# ]* b. u, C6 c
0 V2 Z8 t4 N M9 m( m& s& T
6 U6 E7 p6 ~ D' v5 a8 Y 在海上风电场项目中,风电机组的数量都是具有一定规模的,这些风电机组收集海上丰富的风能,转化为人类所需的电能。那对于这些一定规模数量的风电机组,如何保证其运行的流畅性呢?本案例使用了 HT 提供的批量 (batch)提高系统性能。
* w8 ]# |" g# E+ l. h7 Q6 U/ T 1 n2 A: U5 ?) O0 z+ L4 [0 G
/ O6 F! V8 {5 F2 P+ H; B
批量的原理即如果图元一个个单独绘制模型时性能较差,但是当一批图元聚合成一个大模型进行一次性绘制时,则会极大提高 WebGL 的刷新性能。批量的使用方法是先通过 ht.Default.setBatchInfo 函数全局注册批量,再对 Data 使用 .s(batch, batchName) 设置对应的 batch 批量名。流程如图所示:
$ ~/ x7 i# R3 e9 ^& r4 C& u
) N) g* b& ~! H2 A+ N
+ K1 A& v2 |) {4 @ Z- z ! \3 }- J8 B! N: p$ j& F- }
# ~; D* u( G# {1 O2 C * U' R3 A9 X1 g, k- }. d; Z
8 n/ F4 \+ ~' e& z4 w* `
9 J$ e1 e/ H' ` R7 k: I r! {
5 Q. X7 r8 C. O9 E3 R
在本案例中,每个风机模型被分为三部分,标签部分1,叶片部分2 和 主体部分 3。在上面图示的 batch 流程中,可以发现只对标签部分 1 和 主体部分 3 应用了 batch 操作,但是没有对主体部分 2 运用 batch。这是因为叶片部分需要随风转动,其属性会发生频繁变化,在 batch 里面的图元尽可能避免频繁的变化,如果属性频繁变化,将可能起到反作用。 : R+ S4 Q, x$ F, T) N* i
5 R/ @* I% e, ] b% _3 m) @/ ]
3 s& k7 i0 r6 {, j( s& j* P 风电机的详细信息: ; A+ O) k7 R# S* u! g7 x0 A
6 M* v" k/ d5 n # ?% }8 B/ t5 T# G
进入微观视角,将风电机的一切尽收眼底 * `9 y: |' u& c( V2 J: n1 H/ C" c
" F6 v: o2 B5 q- ]# S- m& M% A
7 e2 }3 o8 J* {, x
( J9 G& O. g8 M9 _ ) P9 U8 p: H7 _3 \0 Y2 w
- k2 t4 m& _5 {3 ~0 c3 i5 g. Z1 V- }
点击每个风电机的叶片,都能打开风电机的详细页面。在此场景中,我们采用了科技线框风格来展示风电机的内部架构,相对于大部分的实景搭建,感官上更为震撼和炫酷。在展示风机内部结构的同时,两侧还展示了该风机周围的环境参数,海上风向风速信息,风机本身的数据监测,发电参数等。点击风电机的某个部位,可以看到以 billboard 样式展示的详细信息。 ) ]& r. |' K: [% e
: R& _6 {0 l7 [ ! N8 ^" E6 V; N2 @. v) g
输电系统:
" b7 Z3 f n" I- s3 U. `5 x $ O5 ?2 U8 [) c; A2 V+ z5 o
' @+ P: u! G/ s' Y8 E* B, n3 W
不辞劳苦,将电能源源不断地输送给升压台
6 Q" a' k( A( P
* W; ^8 @5 e) X ( K5 U' C* j# T0 M
经过风电机转换而来的电能,通过输电系统源源不断地输送给升压台,如同涓涓细流汇入大江大河。在本案例中,输电系统是使用空间管线 ht.polyline 实现的,ht.polyline 继承于 ht.shape, 支持{x: 10, y: 20, e: 30}格式的三维空间点描述。 ht.polyline 的走向由 points 和 segments 决定。案例中的流动效果是通过使用 setInterval 方法来不停地动态改变管线的 top.uv.offset 属性来实现。 5 _2 u0 C. t+ h, R, B7 g
1 } E9 y6 u. S& K& H) q3 m+ W ! M" ?% P# z4 ?0 u
在本案例中,输电系统的管道也是数量庞大的,因此也采用 batch 实现。其流程如图所示:
) D/ W1 E0 _+ l# g5 _( ^( v ( x' v d. {8 M2 l3 J2 M
. m9 A, h7 x& S! d! K
6 z9 g' C8 ]0 n* [$ [" D- b/ [ 0 A* O% p5 [) v6 |, _: ~( W3 H) Z6 b
1 I& U2 a. M v" `# p r8 l
总结
3 J) ~2 F5 v" y0 o 5 P' T v7 o' Q6 V, f
0 ]. Y: L: @# ` 建设海洋强国,寄托着中华民族向海图强的愿望。人类对海洋的探索永无止境,全面、准确而深刻地了解海洋,掌握海洋的运动规律,才能为建设海洋强国提供坚实的基础。开发海洋,经略海洋,保护海洋,拓展蓝色经济空间,已经成为人类生存和社会发展的趋势。海洋经济,海洋科技将来是一个主攻方向,而海上风力发电场作为海洋强国的一部分,也将会涌现一批又一批精品工程,给中国经济的底色注入更多的蓝色。我们也会更加专注于自主产品研发,在力所能及的领域贡献一份力量。
G3 c1 n$ p9 i* ^. v/ v $ W C3 Z3 z( h' p
- E* T$ V" A# u" a6 s; N
举报/反馈 : J1 L$ z/ @; b' S/ T3 r7 G
. U" a6 B( p2 p4 z7 R0 [. f9 H' ?* I& u8 I- }: e. L+ r
e* G: }/ I$ B. i1 g2 L8 G9 l
. x2 r% k" Q/ a: z: o( j: S. b2 L: B8 L
|