E7 W1 @5 ]& j: E% A5 }# H. S8 P
2 Y4 T3 W9 B) e/ ]$ l 前言 6 x. i& X& Y4 k3 M3 g5 h
/ p2 j. q. `% t / M: i& o, X% e7 I6 k5 {+ Q
我国是一个海洋大国,拥有漫长的海岸线、辽阔的管辖海域和丰富的海洋资源。党的十九大报告明确提出:“坚持陆海统筹,加快建设海洋强国”。从海洋大国到海洋强国,符合我国发展规律、世界发展潮流,是实现中华民族伟大复兴“中国梦”的必然选择。 3 f' \0 K( u: I$ g! K. k2 G$ H
" T9 l. g; a7 D% }; S* A7 _0 S
9 I. D( U3 N# _: J
风能,作为一种清洁无公害,取之不尽,用之不竭的可再生资源,非常适合用来发电。我国风能资源丰富,可开发利用的风能储量约为 10 亿千瓦,其中海上可开发和利用的风能储量达到了 7.5 亿千瓦。依托于丰富的海洋风能资源,加快海上风电项目的建设和发展,对加速沿海地区的能源转型,推动地方经济发展,提升沿海地区的生态环境,推动风电技术进展和产业升级,促进能源结构调整具有重要的意义。因此,海上风力发电场应运而生。 5 ]' ]- L Q% M9 I$ k
) [. |' c, T' {1 P
. G u. D# N: B
介于 2D 组态和 3D 组态上, Hightopo (以下简称 HT) 的 HT for Web 产品拥有丰富的组态化可供选择。文章将介绍如何运用 HT 丰富的 2D/3D 组态搭建出一个海上风力发电场的解决方案,希望能够抛砖引玉,给大家带来更多海上风电场的思考和讨论。
7 j2 v$ {( D# s2 K( c! f
! m- s8 w1 _, @6 \: L) [3 D" z9 _ " M S- J4 l- q8 ?* T& F. f- l
界面简介及效果总览
1 u1 |. c0 t5 b: l% d & V5 ~4 b+ I2 y+ G1 c' R2 B( |# X* Z
% H# b# J. ]' ?# p5 W k* J; s ) z- z9 B. B/ u/ ?# H; b
. ?% I& a, ^& P2 B( T
4 W" f. j4 a. j
Demo 主页面中展示了海上风电场的基本构成,包括一定规模数量的风电机组,输电系统和升压台。风电机组有序排放,叶片随风向和风速不停转动,将海洋上丰富的风的动能经过一系列转换,转化为宝贵的电能输出;每个风电机节点产生的电能经过输电系统源源流动,如同水流般汇聚于海上风电场的“心脏”——升压台。
. n% k" x& T( H8 x; J & K+ k( f! v# I- y8 ?9 ^! v9 K
: B" m1 H, |) o, A. N: _
& p" u# L) [2 e/ m: i3 s. T! T* A ! d9 C7 j7 L8 g) A* M
/ p# ^9 i7 E, C. ~/ \' F( S- @
点击风机叶片,可以进入叶片的微观世界,以微观视角看风机的详细信息,包括风机参数,环境参数,发电信息和故障信息等。场景的搭建采用 HT 自主研发的基于 HTML5 的 2D/3D 渲染引擎完成,其中的动画和人机交互也是基于自主研发的组件,依托于 JavaScript 和 HTML5 完成。 " U% S3 _; b% \% |
; ~6 v( p( u; J! V& ]
- E1 d+ a( k9 E+ T( q# ^ 实现过程
{) W i& s; D+ ~; A) v* |, x
: J. V8 @$ F: N4 a, Y; y1 s( [- k. j / x! i# a" S) U# ]4 Y
场景加载 . h( p5 Q% j; O [
7 \0 M: @9 }) J3 j F7 f9 d& {
7 }! O8 l7 z4 F3 X 在前面部分,文章提到本案例的场景都是通过自主研发的渲染引擎完成,那么搭建好的场景如何通过代码加载,呈现给用户呢?在 HT 中,我们通过 ht.graph.GraphView 和 ht.graph.Graph3DView 分别来呈现 2D 和 3D 场景,然后通过反序列化完成场景的加载。 4 e0 I1 ~) W( k7 }
7 _# V& Y& o' r. H9 ^5 y8 } . K# z% i8 }! [- N8 S
开场动画 % j% m, l2 {- T [
+ ?: ^/ d+ e# `1 K" g
, u: z. |8 t/ I
* o: N: [1 b- `
( Z" i' f9 E+ C* \/ x6 _ 9 Y8 V7 S" s/ y N! | O4 d
本案例的开场动画相对比较简单,动画的核心机制是使用了 HT 内部封装的动画函数 ht.Default.startAnim(),通过启动一个动画对象来使整个动画运行起来。 ) [3 s9 m0 q- {) Z/ E$ ~! |
) P F( S) t* ?) `/ H- s
* Z. S# I( f0 o 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 参数进行。 $ T: l, y/ D: k" m+ k9 `
, h+ p# ~) v/ J ; E% _7 r Y* @0 L/ }
finishFunc 参数代表动画结束后的动作。action 函数和 finishFunc 动画结束回调函数,通过一些效果的搭配使用,可以使用户达到平滑的动画效果。
0 p |" I; ^2 L# z$ _+ w! B3 `6 h
( ?; i* h; i y" J( {% A$ u4 i- C
: s9 h1 r+ M3 f* v3 k6 l 本案例的开场动画通过设置起始和终止视角的位置,在一定周期内, 使用 setEye(eye) 来完成视角的变化。
4 e; w8 a4 G. ~2 I ( M( {1 J" {, I
k4 `* _6 V: V* n 实现价值 7 i% p# }( Z( V z$ S
# C, \/ l( S6 y7 g
! G: c$ z# y4 N3 ?: `8 f# I3 R8 D 风电机组: " P- `: o+ J3 ?( O2 P# G: c* t
* _# p M+ w/ U1 R: E % Y; K* ^: e, r- ]' J5 q B
随风而动,将海上风能转化为电能
8 c6 N& |: w) Q
$ S0 F( b: _. C1 b% I, N
4 g) a9 e1 y2 d; g j3 z% z , X9 J. u' V6 U3 i! W
& O; g9 g) F: r2 J- @+ s1 ^
- I+ v- j$ J# c2 b& a) O& t7 g
在海上风电场项目中,风电机组的数量都是具有一定规模的,这些风电机组收集海上丰富的风能,转化为人类所需的电能。那对于这些一定规模数量的风电机组,如何保证其运行的流畅性呢?本案例使用了 HT 提供的批量 (batch)提高系统性能。
5 ^% e+ \7 f0 z( |/ I/ T 0 K# Q# J a2 l7 x) d9 A# C$ j
; s5 p5 \) {/ I( b
批量的原理即如果图元一个个单独绘制模型时性能较差,但是当一批图元聚合成一个大模型进行一次性绘制时,则会极大提高 WebGL 的刷新性能。批量的使用方法是先通过 ht.Default.setBatchInfo 函数全局注册批量,再对 Data 使用 .s(batch, batchName) 设置对应的 batch 批量名。流程如图所示: 6 f3 ?% q4 e, d; H6 w: Z# }9 L6 F
; {% \ Q7 ?' {+ ]" o* ^3 {
( B3 _( z( ~3 o+ Z . o7 F) O+ _( I6 b6 l
/ D4 c; \- c% g" P+ o
( X* J5 L6 z. ]* O: Z. | 3 c( {8 V5 }. _' y& V0 W0 l4 z
2 k. t! Y8 J+ n" Y ) g5 X4 o9 k* h3 y6 d5 W' M w
在本案例中,每个风机模型被分为三部分,标签部分1,叶片部分2 和 主体部分 3。在上面图示的 batch 流程中,可以发现只对标签部分 1 和 主体部分 3 应用了 batch 操作,但是没有对主体部分 2 运用 batch。这是因为叶片部分需要随风转动,其属性会发生频繁变化,在 batch 里面的图元尽可能避免频繁的变化,如果属性频繁变化,将可能起到反作用。 # m1 s5 i! R4 U7 w- \8 D
) ?' t" T/ z( b
2 Y- z( P0 T3 a. l; A$ [; u: _ 风电机的详细信息:
( X, f; V% c" ?: |+ C # o5 R7 F; v& u1 X/ i
# ~* r a& N2 {8 i- P 进入微观视角,将风电机的一切尽收眼底
! E! P: j8 d y W% R
* B/ ^2 c7 r/ `3 k 8 K: y' E) O8 P2 ?# t$ H) B
U, x0 C4 I- F) J- U/ z7 S: _8 d( ]
v3 f7 l3 \* {) Q; r 8 | N5 U+ M4 w3 b% j
点击每个风电机的叶片,都能打开风电机的详细页面。在此场景中,我们采用了科技线框风格来展示风电机的内部架构,相对于大部分的实景搭建,感官上更为震撼和炫酷。在展示风机内部结构的同时,两侧还展示了该风机周围的环境参数,海上风向风速信息,风机本身的数据监测,发电参数等。点击风电机的某个部位,可以看到以 billboard 样式展示的详细信息。 2 }3 v1 G# _* }9 w" S* g
& e9 k3 _" y: y4 }. ?4 C5 [
8 G1 i M8 O: H/ z. B" ^ 输电系统:
, w9 E) Y3 \/ S
6 ]) |; X1 x( C. l" X. o! Q8 `' Y/ y & k2 H% z3 q6 ?- C ?. C: A7 Q
不辞劳苦,将电能源源不断地输送给升压台
$ \/ Q9 a; l9 H1 \- l8 x# e
) M; q7 X4 k c4 D: O 5 |: U/ R; y+ ?3 `1 g* T1 L
经过风电机转换而来的电能,通过输电系统源源不断地输送给升压台,如同涓涓细流汇入大江大河。在本案例中,输电系统是使用空间管线 ht.polyline 实现的,ht.polyline 继承于 ht.shape, 支持{x: 10, y: 20, e: 30}格式的三维空间点描述。 ht.polyline 的走向由 points 和 segments 决定。案例中的流动效果是通过使用 setInterval 方法来不停地动态改变管线的 top.uv.offset 属性来实现。
& ^6 c' ]3 o$ j0 ^+ L" @! z : m, L& c3 X9 @+ y
& F3 @+ A& V5 N4 C! u e8 U
在本案例中,输电系统的管道也是数量庞大的,因此也采用 batch 实现。其流程如图所示:
1 \7 R9 O2 W! |2 O* G! k8 Y4 A
& M- ]+ P. {% L1 ]. d* ?- O0 t; Y , D/ `1 \- e$ J# Z- _% K( d
$ i& X" ~; c3 E& } - M o+ V( \: S6 C
9 d. }+ F" y) U7 P 总结
$ Q- H0 N( L# g4 h . N$ C/ I7 `9 M) [
: I- W* t- h% j j- Z9 @
建设海洋强国,寄托着中华民族向海图强的愿望。人类对海洋的探索永无止境,全面、准确而深刻地了解海洋,掌握海洋的运动规律,才能为建设海洋强国提供坚实的基础。开发海洋,经略海洋,保护海洋,拓展蓝色经济空间,已经成为人类生存和社会发展的趋势。海洋经济,海洋科技将来是一个主攻方向,而海上风力发电场作为海洋强国的一部分,也将会涌现一批又一批精品工程,给中国经济的底色注入更多的蓝色。我们也会更加专注于自主产品研发,在力所能及的领域贡献一份力量。
) f' Q* x8 Y+ A
4 ~( R! d/ x0 v6 d 7 D; K1 a3 E- s
举报/反馈
: g7 u# }$ r' ?& e 9 d+ l3 f0 Q, h4 ~/ X
) h* x2 V- w& s& T8 ? U$ M
9 R( t% {8 p+ ?4 J# m' t) H
0 [% |6 G% H2 E4 k
% \8 ^7 r/ m, [6 I5 w
|