' T! E9 [+ o1 W R 5 |3 |2 j* o9 j- `8 |" t7 \/ O
前言 6 b7 |4 i1 Y9 o$ N
. s+ g6 {2 V2 M# |( P; I3 u- y
0 V( ~- T" R# `/ k7 g7 r
我国是一个海洋大国,拥有漫长的海岸线、辽阔的管辖海域和丰富的海洋资源。党的十九大报告明确提出:“坚持陆海统筹,加快建设海洋强国”。从海洋大国到海洋强国,符合我国发展规律、世界发展潮流,是实现中华民族伟大复兴“中国梦”的必然选择。
e: r) `- ?! r6 d! w 4 `4 p6 h6 g8 J; P3 h/ U
2 A6 }8 @6 o4 e" X1 g7 a! l
风能,作为一种清洁无公害,取之不尽,用之不竭的可再生资源,非常适合用来发电。我国风能资源丰富,可开发利用的风能储量约为 10 亿千瓦,其中海上可开发和利用的风能储量达到了 7.5 亿千瓦。依托于丰富的海洋风能资源,加快海上风电项目的建设和发展,对加速沿海地区的能源转型,推动地方经济发展,提升沿海地区的生态环境,推动风电技术进展和产业升级,促进能源结构调整具有重要的意义。因此,海上风力发电场应运而生。
# j' N& @8 y' O+ {% c
8 @: r! z- K3 }2 Y7 O
8 o8 D4 P2 m4 S ?+ S0 y3 w- k 介于 2D 组态和 3D 组态上, Hightopo (以下简称 HT) 的 HT for Web 产品拥有丰富的组态化可供选择。文章将介绍如何运用 HT 丰富的 2D/3D 组态搭建出一个海上风力发电场的解决方案,希望能够抛砖引玉,给大家带来更多海上风电场的思考和讨论。
6 c- ~5 l. i4 }, K1 S4 M! [ - E5 X6 g7 u; F5 k: V9 r
3 i7 f( Z3 Q2 U3 e" d% o 界面简介及效果总览 & m' c5 @! T o& g" ?, E( q' P+ s
8 p5 B* D/ j, Q! R
. g8 [3 [6 e5 \8 X . Y3 W0 h8 d) n$ ~
6 b9 g& W/ n# A7 A! F
, Z+ E4 r# f) k6 |
Demo 主页面中展示了海上风电场的基本构成,包括一定规模数量的风电机组,输电系统和升压台。风电机组有序排放,叶片随风向和风速不停转动,将海洋上丰富的风的动能经过一系列转换,转化为宝贵的电能输出;每个风电机节点产生的电能经过输电系统源源流动,如同水流般汇聚于海上风电场的“心脏”——升压台。
/ d }4 V& `) K2 G( g; u: C
$ Z) ^0 A+ B9 i; n 2 G' g, R9 d7 b! v
, O2 ?9 X- m) m+ i5 N 5 I& H- y0 @# b; k8 i0 U7 @
( B- u H4 L. m8 n
点击风机叶片,可以进入叶片的微观世界,以微观视角看风机的详细信息,包括风机参数,环境参数,发电信息和故障信息等。场景的搭建采用 HT 自主研发的基于 HTML5 的 2D/3D 渲染引擎完成,其中的动画和人机交互也是基于自主研发的组件,依托于 JavaScript 和 HTML5 完成。 " J ~' ], X8 r) d& Y% F6 U
; p$ F* E- {) C 0 u7 w1 K9 @4 i0 A' w2 j y# ~
实现过程
5 x" f5 n. t* E" z0 H 9 B! W% f! @5 e4 s+ p
, `" p, l/ Y+ E 场景加载
2 Q* B% T# V _ v: h1 M) Z : Y+ F F, w! w5 y/ o( R4 {
9 V& \% g. y9 q4 D
在前面部分,文章提到本案例的场景都是通过自主研发的渲染引擎完成,那么搭建好的场景如何通过代码加载,呈现给用户呢?在 HT 中,我们通过 ht.graph.GraphView 和 ht.graph.Graph3DView 分别来呈现 2D 和 3D 场景,然后通过反序列化完成场景的加载。
4 r6 M' Y0 R$ i
J+ o8 J& Z2 P" g% n 0 [* I/ x1 P Z8 B( G
开场动画
" P$ ]3 c; s0 T( {& L+ _: D3 N
" \& z' b+ I0 `1 t n% g# L ( p( e4 Z/ d5 F; D& o5 J- F
: z1 C, t2 p2 a4 u* _9 ? 7 `. ?9 F4 W$ I/ A+ e! M+ x: J) q
/ k/ c. S& t+ w- R# \/ ^; v 本案例的开场动画相对比较简单,动画的核心机制是使用了 HT 内部封装的动画函数 ht.Default.startAnim(),通过启动一个动画对象来使整个动画运行起来。 : g4 H. t k9 V( [% X) A% w: c
* n& b- e: c- d# a) e7 g
* M5 J7 \& f4 |9 L0 j) U9 }
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 参数进行。 % ]! w- u" ]: g3 y; `3 q O0 t
& h0 h9 P+ N- q: H8 D% v
; L4 x# T2 n5 Z finishFunc 参数代表动画结束后的动作。action 函数和 finishFunc 动画结束回调函数,通过一些效果的搭配使用,可以使用户达到平滑的动画效果。
- z; p- ?& |8 ]% z
4 Z, z* K( _- V- K, S* {, ? , ]4 w: R5 N8 w4 ~/ t: P" s5 P
本案例的开场动画通过设置起始和终止视角的位置,在一定周期内, 使用 setEye(eye) 来完成视角的变化。
2 ]! F6 z6 w7 X) z 4 j) I: w/ N+ @
+ k# w, T* S, P$ }' ]" ~ 实现价值
) z; d: A. n4 R# O+ v
( b& x( Q* P8 l0 g 8 W; I0 E9 e% s2 Q7 _" ^- h
风电机组: - Z0 e/ N6 t+ A3 X# N
9 X3 ^0 }0 m& N# x3 L( q! ]7 C! i8 d- ]0 U
" l" V" }$ @2 J/ f, B4 F! I9 \
随风而动,将海上风能转化为电能 ; R& R; D0 v6 M# I E* X7 x C/ \
% n" p6 N& c" C1 C % W! U8 c0 _* o6 ~ h Z
5 o+ \ I/ P: ?; \4 u: a' J1 v! f
/ w2 q7 o( W3 I$ p$ T: {2 n2 ]) l : ?6 |0 {: j( P* R) F* a h- Z
在海上风电场项目中,风电机组的数量都是具有一定规模的,这些风电机组收集海上丰富的风能,转化为人类所需的电能。那对于这些一定规模数量的风电机组,如何保证其运行的流畅性呢?本案例使用了 HT 提供的批量 (batch)提高系统性能。 8 F+ D/ A9 H" R$ n' C/ H' D$ o+ ?
* j7 t/ X4 w* J 5 p8 G9 w6 K( Y. _+ ?
批量的原理即如果图元一个个单独绘制模型时性能较差,但是当一批图元聚合成一个大模型进行一次性绘制时,则会极大提高 WebGL 的刷新性能。批量的使用方法是先通过 ht.Default.setBatchInfo 函数全局注册批量,再对 Data 使用 .s(batch, batchName) 设置对应的 batch 批量名。流程如图所示: # T2 |' o v" a6 |
. g$ O& Y4 c% F$ g) ]! V
4 S- T5 n( K+ o$ z9 s9 n- P
, @( U8 I$ Y% d9 G. L9 g9 D# b 7 j" O( \! U" n8 R2 U2 L
$ J; K" K* D2 I0 [
5 R7 w4 y- y6 k$ k7 w5 U9 x
" O/ [$ E" X) ^ {1 p: ~9 W# i
+ R* _; b A0 W* m 在本案例中,每个风机模型被分为三部分,标签部分1,叶片部分2 和 主体部分 3。在上面图示的 batch 流程中,可以发现只对标签部分 1 和 主体部分 3 应用了 batch 操作,但是没有对主体部分 2 运用 batch。这是因为叶片部分需要随风转动,其属性会发生频繁变化,在 batch 里面的图元尽可能避免频繁的变化,如果属性频繁变化,将可能起到反作用。
: o# A; p" L5 [* Q/ q- Z * T, B2 q1 U( X7 k! v1 N
3 l) v% _2 ~. r1 {" ^ 风电机的详细信息: , ^2 w6 N3 Z5 o6 H
, m& x! z# r2 j2 @: Y5 ~$ \% N, b
; W! a) [, U& f& Y+ z+ J' n 进入微观视角,将风电机的一切尽收眼底
: X0 [8 j( N" j- @2 o1 R
$ x9 \+ C! H+ u/ b4 ~$ q ) E3 Z: ?3 s$ A# H; S- D# K
+ v3 X& V) `. Q/ r( @6 N; z ( r [* y; ~0 G* N# f- [
' u7 o) K+ F% V. J) S3 b 点击每个风电机的叶片,都能打开风电机的详细页面。在此场景中,我们采用了科技线框风格来展示风电机的内部架构,相对于大部分的实景搭建,感官上更为震撼和炫酷。在展示风机内部结构的同时,两侧还展示了该风机周围的环境参数,海上风向风速信息,风机本身的数据监测,发电参数等。点击风电机的某个部位,可以看到以 billboard 样式展示的详细信息。 , Y- C Y9 l% ~5 v0 N) O
4 `0 H9 Y; o' G; B5 G" z8 R
3 v- s5 \9 H T9 c( D 输电系统:
5 U- H% |/ D( y w) m$ t 5 ~% c- }) X t/ a4 i' g# ]
8 u/ R! C" C; }# i 不辞劳苦,将电能源源不断地输送给升压台 - {6 Y3 a& Q9 [3 C/ M8 \4 x( Q) }
1 N- x+ z9 @; M
% D" a& g$ d9 t
经过风电机转换而来的电能,通过输电系统源源不断地输送给升压台,如同涓涓细流汇入大江大河。在本案例中,输电系统是使用空间管线 ht.polyline 实现的,ht.polyline 继承于 ht.shape, 支持{x: 10, y: 20, e: 30}格式的三维空间点描述。 ht.polyline 的走向由 points 和 segments 决定。案例中的流动效果是通过使用 setInterval 方法来不停地动态改变管线的 top.uv.offset 属性来实现。
+ B1 |2 G T4 z6 A3 i* @+ d% ]
, t& M0 m, i* o2 i+ B, f4 f/ M , i# P3 g! z5 r+ f/ c3 o2 o
在本案例中,输电系统的管道也是数量庞大的,因此也采用 batch 实现。其流程如图所示: P. I$ A7 A/ M; ?) H2 m1 C
) @5 C* p7 M) X# h& l8 M" A
5 T2 m7 l5 P+ R, V* l' l% |4 l 8 A9 ?: Q0 K1 s7 L. P/ \5 m
B( Z) ^( I; _. ?. f' d
3 F6 H3 |% j' f% x
总结
; z- A; S! b. ]3 T4 Q! l
; ]$ |4 i8 _% x4 P8 r% o 8 l( r9 S8 t2 t# D4 R; K
建设海洋强国,寄托着中华民族向海图强的愿望。人类对海洋的探索永无止境,全面、准确而深刻地了解海洋,掌握海洋的运动规律,才能为建设海洋强国提供坚实的基础。开发海洋,经略海洋,保护海洋,拓展蓝色经济空间,已经成为人类生存和社会发展的趋势。海洋经济,海洋科技将来是一个主攻方向,而海上风力发电场作为海洋强国的一部分,也将会涌现一批又一批精品工程,给中国经济的底色注入更多的蓝色。我们也会更加专注于自主产品研发,在力所能及的领域贡献一份力量。
; r* D7 y7 h* I0 c5 l
P' P K, ~9 e0 r& m - \4 c/ q! \5 P& A, p6 f
举报/反馈
2 J$ T6 C- i1 ]3 X R( ]
- X, W/ x! Q& I6 v
$ K- [0 p' V- P. o) Y, v9 V; R; [8 m. Z* [! Q; a- h& N' A3 I
/ `/ \) a( d& \6 s9 r8 }) J
( `. ]' v' t# b# P) t9 H. Q |