& W) k2 E9 D( a4 U( v& D5 L
6 N; \/ B+ k; r9 l
前言
2 w0 o/ C* q1 j' g d- ?8 [2 T4 ?
1 ~7 s+ |/ f2 \' U, i4 ?& L& R% R( B
$ w6 F& R% k( |4 S 我国是一个海洋大国,拥有漫长的海岸线、辽阔的管辖海域和丰富的海洋资源。党的十九大报告明确提出:“坚持陆海统筹,加快建设海洋强国”。从海洋大国到海洋强国,符合我国发展规律、世界发展潮流,是实现中华民族伟大复兴“中国梦”的必然选择。
7 J: G3 d; h0 ^' `8 n
8 j; l0 q! v6 R& l" i- z
+ P/ |; A b8 f 风能,作为一种清洁无公害,取之不尽,用之不竭的可再生资源,非常适合用来发电。我国风能资源丰富,可开发利用的风能储量约为 10 亿千瓦,其中海上可开发和利用的风能储量达到了 7.5 亿千瓦。依托于丰富的海洋风能资源,加快海上风电项目的建设和发展,对加速沿海地区的能源转型,推动地方经济发展,提升沿海地区的生态环境,推动风电技术进展和产业升级,促进能源结构调整具有重要的意义。因此,海上风力发电场应运而生。
, I$ q: L7 f6 g/ K, t0 W$ Y9 v+ n 4 W- T( x- B& ?+ M3 U( \. j
" t) M& P' K" g5 F: C" W! \ 介于 2D 组态和 3D 组态上, Hightopo (以下简称 HT) 的 HT for Web 产品拥有丰富的组态化可供选择。文章将介绍如何运用 HT 丰富的 2D/3D 组态搭建出一个海上风力发电场的解决方案,希望能够抛砖引玉,给大家带来更多海上风电场的思考和讨论。
0 Z& Y$ Z/ J6 x+ ^: N" q
( O! I: I3 d e0 C, C " H' F& q4 d. p/ L( T; _4 v# @
界面简介及效果总览 ( t9 Z# A! [4 Q! B6 q( B, d {# K
) Z$ U1 M3 d" b( S l
! u. ]; H) r0 M4 j' x4 O
6 s8 z7 f& l/ m1 ]
# O2 d2 Q* e4 d
' o" R2 ]" }; F! z4 c Demo 主页面中展示了海上风电场的基本构成,包括一定规模数量的风电机组,输电系统和升压台。风电机组有序排放,叶片随风向和风速不停转动,将海洋上丰富的风的动能经过一系列转换,转化为宝贵的电能输出;每个风电机节点产生的电能经过输电系统源源流动,如同水流般汇聚于海上风电场的“心脏”——升压台。 1 H' Z' G* F6 e2 Z% P& h0 b
3 d, a+ k6 N; j: ]6 \) X
6 A4 o! H; i. L
; d- l! v! i2 g& h, F& Z4 J
0 K1 l. J! u/ F5 v# E G$ M
. f. q: @1 |$ K% O 点击风机叶片,可以进入叶片的微观世界,以微观视角看风机的详细信息,包括风机参数,环境参数,发电信息和故障信息等。场景的搭建采用 HT 自主研发的基于 HTML5 的 2D/3D 渲染引擎完成,其中的动画和人机交互也是基于自主研发的组件,依托于 JavaScript 和 HTML5 完成。
' p. j" N& w9 C/ M0 v
) d; h' A2 U. Z
! P3 ]0 B+ ]" T 实现过程
* Q& l" ^' P n! X' C. j* F2 A
& }. L, D7 z2 o
/ j5 v1 C( y) c4 v' T+ \ 场景加载
E; G8 Z0 `6 w0 b9 N
( v( f, E; `& \9 ]) C/ ^2 w( S 2 @. {( _) o3 s* \& q& T# H* n
在前面部分,文章提到本案例的场景都是通过自主研发的渲染引擎完成,那么搭建好的场景如何通过代码加载,呈现给用户呢?在 HT 中,我们通过 ht.graph.GraphView 和 ht.graph.Graph3DView 分别来呈现 2D 和 3D 场景,然后通过反序列化完成场景的加载。
7 Y( g. G! Z. d' i8 A / L3 a2 Q5 w L4 j5 l
7 F2 c& `8 V+ B+ N
开场动画
3 A+ o9 M1 k3 F% D
( P# B$ v; p) N o4 F* Z
2 i7 E1 j, P/ j
! }, S4 P. {) Y! @" Z0 M/ W ! v$ k; u" @6 `- x: ]
) a: \. p- Y8 q! |& D, i 本案例的开场动画相对比较简单,动画的核心机制是使用了 HT 内部封装的动画函数 ht.Default.startAnim(),通过启动一个动画对象来使整个动画运行起来。 2 r) c x3 U* |. a
: p1 I4 v# L. K, S& P
4 y% N4 W% z9 B6 L$ G 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 参数进行。
( ?' @. m0 a5 T# c
6 ~" `: ?% a- p( Y 6 t! `3 Y3 e$ @. |/ L" M9 b r6 N
finishFunc 参数代表动画结束后的动作。action 函数和 finishFunc 动画结束回调函数,通过一些效果的搭配使用,可以使用户达到平滑的动画效果。 , x9 w# J2 U; C1 ~1 R
& J: _3 s, g8 K( q( ?
3 H. e7 D: B1 M7 c 本案例的开场动画通过设置起始和终止视角的位置,在一定周期内, 使用 setEye(eye) 来完成视角的变化。 6 Z: X4 w& ?: |$ q! d ^
5 V% E( {) O" R4 _0 A
2 ~& I9 w% f% h 实现价值 3 ]+ A' _3 p4 q' g$ Q5 Y
* a- r7 P! L+ K/ X6 `: C
5 V! v+ U5 B. R 风电机组:
. P! \4 m! H7 j% U8 Z! S5 X 0 V" W( ~/ L: a
0 g! r( i$ }% {2 b- y 随风而动,将海上风能转化为电能
, c. v+ t* d- M2 n5 k- N m$ a9 w+ S8 s 9 z3 Z7 D7 O6 ?4 J
& h: {+ {8 r* H( M: K
. g! }. K- O0 P9 C4 `# a4 g) x7 w" K 7 M6 ~( I# v+ X' U6 a0 J
% H/ \0 }7 m2 [7 m2 `0 v1 d
在海上风电场项目中,风电机组的数量都是具有一定规模的,这些风电机组收集海上丰富的风能,转化为人类所需的电能。那对于这些一定规模数量的风电机组,如何保证其运行的流畅性呢?本案例使用了 HT 提供的批量 (batch)提高系统性能。 7 b& j2 j; X1 B- S0 v/ S$ ?
9 _. k Y% [3 N, Z 2 u$ H0 p2 o: x0 m' g3 T: }
批量的原理即如果图元一个个单独绘制模型时性能较差,但是当一批图元聚合成一个大模型进行一次性绘制时,则会极大提高 WebGL 的刷新性能。批量的使用方法是先通过 ht.Default.setBatchInfo 函数全局注册批量,再对 Data 使用 .s(batch, batchName) 设置对应的 batch 批量名。流程如图所示: 6 P& k4 y0 A2 P. P$ V5 g
. K: a$ f2 @, _' \& W
2 o& h9 H z* R) @
+ g0 g; Y! i- j$ z 3 m6 B( O/ i7 H: W% }/ u9 c
" T1 K! W& \; B4 P
0 D& |9 k) F4 C5 b- A' q0 M5 X9 C
8 v# o3 I/ z ]. @' {; s6 z1 G, L
1 D% @# _# A! ^1 z 在本案例中,每个风机模型被分为三部分,标签部分1,叶片部分2 和 主体部分 3。在上面图示的 batch 流程中,可以发现只对标签部分 1 和 主体部分 3 应用了 batch 操作,但是没有对主体部分 2 运用 batch。这是因为叶片部分需要随风转动,其属性会发生频繁变化,在 batch 里面的图元尽可能避免频繁的变化,如果属性频繁变化,将可能起到反作用。
' w' I! K2 O; f. e0 }
3 G9 R$ g3 l& G+ D4 i4 i
* D9 w) V: x8 @ 风电机的详细信息:
) o1 `# C3 ]: r& X h9 ~
" w. X. N. ]# B/ |$ K; [
$ F# J1 P5 T, @3 W 进入微观视角,将风电机的一切尽收眼底 @! q$ M7 M( G$ s( e$ H- _* Y& i& }% {$ G
0 K+ r' Q; _; O' K
; ~$ q2 A/ F5 l0 A9 A' Z
. g' b! y6 v8 S* d' M/ k) M5 n $ e3 E5 M7 ^/ V& o* N/ P2 y
9 n& k* R; s* M. a5 X& ]/ `
点击每个风电机的叶片,都能打开风电机的详细页面。在此场景中,我们采用了科技线框风格来展示风电机的内部架构,相对于大部分的实景搭建,感官上更为震撼和炫酷。在展示风机内部结构的同时,两侧还展示了该风机周围的环境参数,海上风向风速信息,风机本身的数据监测,发电参数等。点击风电机的某个部位,可以看到以 billboard 样式展示的详细信息。 1 N, f; j: W1 i: Y# B
$ f5 l& i6 k4 C1 \; y, o
4 Y( w' B' m- E; R7 ]
输电系统: , ^3 G% ~9 r" z8 x; K# k+ N
+ U( {; ^: ]6 b+ G9 K
$ b/ O' R$ a8 b 不辞劳苦,将电能源源不断地输送给升压台 / U' X* ~! ~6 p
9 b8 |+ H" O1 ~
9 B) }8 B/ t" r* D8 N! _7 v! F
经过风电机转换而来的电能,通过输电系统源源不断地输送给升压台,如同涓涓细流汇入大江大河。在本案例中,输电系统是使用空间管线 ht.polyline 实现的,ht.polyline 继承于 ht.shape, 支持{x: 10, y: 20, e: 30}格式的三维空间点描述。 ht.polyline 的走向由 points 和 segments 决定。案例中的流动效果是通过使用 setInterval 方法来不停地动态改变管线的 top.uv.offset 属性来实现。
5 a+ a! V7 y* s0 d
) c# L+ E$ M8 A" y% N $ z$ N: P1 X' F
在本案例中,输电系统的管道也是数量庞大的,因此也采用 batch 实现。其流程如图所示: 7 l/ S. ^' j8 L6 r
- j# R* N. B* E# d a/ u# p
) t) [) h" K4 I) A F x9 L7 j( ~1 q6 w5 ?/ p+ h
- N$ l/ I% F8 D) t I* p& r- D- M
1 g0 M! Y; A/ X# k 总结 & J1 k, E6 K1 S- x& Q# k
5 X- W" V! P+ k; e
# e, y v8 t* {% i9 ~ 建设海洋强国,寄托着中华民族向海图强的愿望。人类对海洋的探索永无止境,全面、准确而深刻地了解海洋,掌握海洋的运动规律,才能为建设海洋强国提供坚实的基础。开发海洋,经略海洋,保护海洋,拓展蓝色经济空间,已经成为人类生存和社会发展的趋势。海洋经济,海洋科技将来是一个主攻方向,而海上风力发电场作为海洋强国的一部分,也将会涌现一批又一批精品工程,给中国经济的底色注入更多的蓝色。我们也会更加专注于自主产品研发,在力所能及的领域贡献一份力量。 ' j6 X; K) r! L& n9 s
& }& j1 I! i, @* N + V8 E/ G, z q4 m
举报/反馈
( I4 X9 \6 x" J, |8 u
; z5 L$ C; X I0 q& s
/ k$ y H; ]! X2 i9 y4 I3 b& Y* _- T
( B4 @% R0 u" r0 Y' W0 U% z8 c& Y q; L5 K& }- T: Y/ |+ L
|