9 g9 E; M9 ?2 ]. J , O# D6 n3 j, C+ z' M6 \
前言 : o0 W5 |. ^. s: n4 y7 B4 Q
6 }( q L8 |1 X5 y
6 g! C8 q( @- |5 z( r 我国是一个海洋大国,拥有漫长的海岸线、辽阔的管辖海域和丰富的海洋资源。党的十九大报告明确提出:“坚持陆海统筹,加快建设海洋强国”。从海洋大国到海洋强国,符合我国发展规律、世界发展潮流,是实现中华民族伟大复兴“中国梦”的必然选择。
4 l# r& X, F/ ]
( C) C, h$ U7 j G! W
# i( E3 ~5 S% ` v$ } 风能,作为一种清洁无公害,取之不尽,用之不竭的可再生资源,非常适合用来发电。我国风能资源丰富,可开发利用的风能储量约为 10 亿千瓦,其中海上可开发和利用的风能储量达到了 7.5 亿千瓦。依托于丰富的海洋风能资源,加快海上风电项目的建设和发展,对加速沿海地区的能源转型,推动地方经济发展,提升沿海地区的生态环境,推动风电技术进展和产业升级,促进能源结构调整具有重要的意义。因此,海上风力发电场应运而生。 & W; [8 E. H8 w9 d o) |: }
. x& r1 G/ q( N
# a% h2 t( B8 F* A. z& |
介于 2D 组态和 3D 组态上, Hightopo (以下简称 HT) 的 HT for Web 产品拥有丰富的组态化可供选择。文章将介绍如何运用 HT 丰富的 2D/3D 组态搭建出一个海上风力发电场的解决方案,希望能够抛砖引玉,给大家带来更多海上风电场的思考和讨论。 / @% U2 S: H O3 V
% k; p1 d+ B7 g3 j! V
3 S. Y7 S; w" r Q3 u/ O
界面简介及效果总览 ' j3 l8 @! n& y; v3 K
" y1 N) _, }+ |. `
. i5 X* f8 Z4 {' f
0 Z4 T# t2 D; V2 w
4 \+ c% X$ E0 f* @% g; Q m( q4 C" R# ? g. U+ e. Z
Demo 主页面中展示了海上风电场的基本构成,包括一定规模数量的风电机组,输电系统和升压台。风电机组有序排放,叶片随风向和风速不停转动,将海洋上丰富的风的动能经过一系列转换,转化为宝贵的电能输出;每个风电机节点产生的电能经过输电系统源源流动,如同水流般汇聚于海上风电场的“心脏”——升压台。
# e8 D2 d' N& M5 T
: D: w1 }$ B* X+ d) d1 w) F/ w/ N" s
9 ?! t7 h4 a' Y1 j . J- A0 _, U# n
' a- J2 V' F9 N( E : Z9 R* U2 x, D
点击风机叶片,可以进入叶片的微观世界,以微观视角看风机的详细信息,包括风机参数,环境参数,发电信息和故障信息等。场景的搭建采用 HT 自主研发的基于 HTML5 的 2D/3D 渲染引擎完成,其中的动画和人机交互也是基于自主研发的组件,依托于 JavaScript 和 HTML5 完成。 , b, Y8 p- r, V; E
\* s$ Q8 }" u! e0 |# n3 F
& m$ O9 G3 h5 v
实现过程 1 j8 X9 z( I/ K3 o
' W8 V+ ^, S5 T( U- w; j, r3 t
1 D4 X* {' J% ` k% G
场景加载 $ A. v; l& B) j& h! g: @2 C
8 U& m+ i a! d+ {( I, h5 ~ 5 d. w; {8 J" [! x8 A, R2 \! z, u
在前面部分,文章提到本案例的场景都是通过自主研发的渲染引擎完成,那么搭建好的场景如何通过代码加载,呈现给用户呢?在 HT 中,我们通过 ht.graph.GraphView 和 ht.graph.Graph3DView 分别来呈现 2D 和 3D 场景,然后通过反序列化完成场景的加载。 ( H5 c& Z2 t6 c" w/ p
8 r0 I/ Y+ O% s+ O
+ G- l. G+ v& `6 E5 J. ~! ? L+ D+ { 开场动画 9 l- A5 G/ [: j
. W+ I% f; c0 j; W* O* Z + l! A$ _, v+ C9 E+ E3 x6 Q" [
2 Y( G4 {' i( G1 i+ }
# n, `7 s' P" T2 J. \! J( A h! V) F& f( L1 C$ H& ^; O( f
本案例的开场动画相对比较简单,动画的核心机制是使用了 HT 内部封装的动画函数 ht.Default.startAnim(),通过启动一个动画对象来使整个动画运行起来。
7 R& n& Q. H. f b; D$ q
' E0 S% J! ?- G8 @! b 4 ]4 w4 f$ S( x; w
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 参数进行。
* Q# L5 s9 }# o" [! _ : A' Z9 E- e$ P6 S
+ H8 J& e# G0 k8 [3 \' b/ R$ v finishFunc 参数代表动画结束后的动作。action 函数和 finishFunc 动画结束回调函数,通过一些效果的搭配使用,可以使用户达到平滑的动画效果。 / N* ~6 Q+ h: }& ^$ L+ X
$ S' Q9 r- T6 R; M- c" r& K - N1 y. T/ E$ B3 D+ F9 k
本案例的开场动画通过设置起始和终止视角的位置,在一定周期内, 使用 setEye(eye) 来完成视角的变化。
9 f6 d% j3 \- c0 i- C
8 u9 Q, O4 D* `
8 `& M. O4 c( F2 f6 l 实现价值
% Y& ?' I" K0 U' }7 i * R" g( i' m7 H
# C7 Z% b8 A2 P; p s 风电机组:
s$ J, x9 n5 k c9 C
1 V: P6 w# v( Y3 q2 E$ J1 f& i# ` & V1 Y, K3 I6 B% P" b+ ?6 u1 ]
随风而动,将海上风能转化为电能 " O: O+ J: {! w+ X# i( j/ g
8 N1 ]6 s4 j% `3 y# J
4 x+ Q: O1 n! ^* P% V
0 B7 p, Q0 |5 {. q
D9 a; ~/ c+ @5 w# U 4 R+ A \6 v0 S5 i1 t- l: n3 S$ {
在海上风电场项目中,风电机组的数量都是具有一定规模的,这些风电机组收集海上丰富的风能,转化为人类所需的电能。那对于这些一定规模数量的风电机组,如何保证其运行的流畅性呢?本案例使用了 HT 提供的批量 (batch)提高系统性能。
' U8 a6 _& ?) Q) n # \7 d4 M6 e0 \: ^3 u+ ]4 k
. Z3 ~- ?7 ]/ s" v0 b
批量的原理即如果图元一个个单独绘制模型时性能较差,但是当一批图元聚合成一个大模型进行一次性绘制时,则会极大提高 WebGL 的刷新性能。批量的使用方法是先通过 ht.Default.setBatchInfo 函数全局注册批量,再对 Data 使用 .s(batch, batchName) 设置对应的 batch 批量名。流程如图所示: 7 J4 Y$ b- C* m( K, r; t% V
0 Z% N- W" l) n+ a0 f2 f ) H& [5 `" i5 f4 m
" F, A# c8 H+ Z7 e& Q7 Q 4 p: _% I+ w0 c7 \: k
& V' t) V, i6 X! U , K0 ~+ h# V4 ~3 p" D7 K# K
x9 C) U/ }/ |9 A1 t7 X
, P, L, ?1 W/ a8 e
在本案例中,每个风机模型被分为三部分,标签部分1,叶片部分2 和 主体部分 3。在上面图示的 batch 流程中,可以发现只对标签部分 1 和 主体部分 3 应用了 batch 操作,但是没有对主体部分 2 运用 batch。这是因为叶片部分需要随风转动,其属性会发生频繁变化,在 batch 里面的图元尽可能避免频繁的变化,如果属性频繁变化,将可能起到反作用。 ! n' M& A; l; W# U
5 s% l0 }+ m6 n# ?+ a # m" D8 Q+ ]5 K6 E* l; E! P H
风电机的详细信息: 2 I3 X7 r# d/ |( W9 ^3 v
7 a. z& W4 `* T% N) b+ }( D) U ) ^* z* R" N. z: D
进入微观视角,将风电机的一切尽收眼底
2 R$ N- Q$ J* h2 s1 G4 ]/ i 3 ]- d( q a( q2 W2 W
# j; b8 W; ]& \; u, Y# X7 R
/ L. N9 I! c9 @
3 U& L& w7 [4 ~* @% o + M- T, M7 L2 ~8 t
点击每个风电机的叶片,都能打开风电机的详细页面。在此场景中,我们采用了科技线框风格来展示风电机的内部架构,相对于大部分的实景搭建,感官上更为震撼和炫酷。在展示风机内部结构的同时,两侧还展示了该风机周围的环境参数,海上风向风速信息,风机本身的数据监测,发电参数等。点击风电机的某个部位,可以看到以 billboard 样式展示的详细信息。 9 Z8 G+ l5 H# d1 ~
" Q. S3 j2 x2 k# [
& n6 F9 p6 i7 |4 P 输电系统:
4 z0 W4 c4 R2 P8 ~1 N2 z ( }% H d( ]( A3 k1 ~# H
8 I$ O3 h! v) j# M! M v2 [
不辞劳苦,将电能源源不断地输送给升压台
" i4 s( V5 ~5 P% |4 `+ \# U; W% x 0 C: O) R8 G* G+ d
) Q! D2 E* U6 X( D% b
经过风电机转换而来的电能,通过输电系统源源不断地输送给升压台,如同涓涓细流汇入大江大河。在本案例中,输电系统是使用空间管线 ht.polyline 实现的,ht.polyline 继承于 ht.shape, 支持{x: 10, y: 20, e: 30}格式的三维空间点描述。 ht.polyline 的走向由 points 和 segments 决定。案例中的流动效果是通过使用 setInterval 方法来不停地动态改变管线的 top.uv.offset 属性来实现。
% f9 x4 X0 {! Q6 a , A9 d5 _- B5 \$ k8 K
" _& M0 ?5 L+ n
在本案例中,输电系统的管道也是数量庞大的,因此也采用 batch 实现。其流程如图所示: + B# l! J* D$ a2 }+ P4 Q4 q! N
. a* D& _! t* `% Y `9 I m4 K# K2 ^9 g8 z0 V" P
% E; @$ }' u6 k9 E / ]- H. Z8 e9 J5 K' m% K# m. u
3 S- H1 q$ W) T 总结 7 E) q0 K3 a7 ^; p
: ?9 ^: {7 _% \5 s% Y- ? ) f( o2 t+ J% X P: m; k( G/ A; g
建设海洋强国,寄托着中华民族向海图强的愿望。人类对海洋的探索永无止境,全面、准确而深刻地了解海洋,掌握海洋的运动规律,才能为建设海洋强国提供坚实的基础。开发海洋,经略海洋,保护海洋,拓展蓝色经济空间,已经成为人类生存和社会发展的趋势。海洋经济,海洋科技将来是一个主攻方向,而海上风力发电场作为海洋强国的一部分,也将会涌现一批又一批精品工程,给中国经济的底色注入更多的蓝色。我们也会更加专注于自主产品研发,在力所能及的领域贡献一份力量。 1 g3 |7 K6 c0 X$ N
4 b8 l# F6 a& m- r5 }1 D5 B7 Q* |
6 W8 y/ p Y' w8 `$ | 举报/反馈
0 W7 n% g- m. p% H
; F$ N- F1 r8 k: Q: ]$ o* q$ q1 z2 J. c4 ]9 y$ ]
1 O: W6 z/ ?. F0 A
& d! ~. x9 f- t; l: X6 `7 i: t" i
* o7 A' g: ]% Y7 T |