- \5 q5 X6 I' F. P, R
B7 h2 V5 g3 k/ B. T! I
前言
1 G' A7 I5 Z( m7 x- n c6 \4 c 0 Z5 ^ _9 r6 c' q- m# j
6 U# r& T8 E6 o
我国是一个海洋大国,拥有漫长的海岸线、辽阔的管辖海域和丰富的海洋资源。党的十九大报告明确提出:“坚持陆海统筹,加快建设海洋强国”。从海洋大国到海洋强国,符合我国发展规律、世界发展潮流,是实现中华民族伟大复兴“中国梦”的必然选择。 6 x4 b& ?% c8 O' M- f( J N
/ ^% V8 x. G s# H% @* H" f [3 }" K" O( A- U) J) B U
风能,作为一种清洁无公害,取之不尽,用之不竭的可再生资源,非常适合用来发电。我国风能资源丰富,可开发利用的风能储量约为 10 亿千瓦,其中海上可开发和利用的风能储量达到了 7.5 亿千瓦。依托于丰富的海洋风能资源,加快海上风电项目的建设和发展,对加速沿海地区的能源转型,推动地方经济发展,提升沿海地区的生态环境,推动风电技术进展和产业升级,促进能源结构调整具有重要的意义。因此,海上风力发电场应运而生。
6 Y7 ]* ` D0 ]: q: }
2 g0 E: n- N* I& Z9 x
4 @$ n5 f( e* A" D& C 介于 2D 组态和 3D 组态上, Hightopo (以下简称 HT) 的 HT for Web 产品拥有丰富的组态化可供选择。文章将介绍如何运用 HT 丰富的 2D/3D 组态搭建出一个海上风力发电场的解决方案,希望能够抛砖引玉,给大家带来更多海上风电场的思考和讨论。 ' ^5 N; F A5 ^2 B8 W
I- w+ [: I! l/ F0 h
$ |4 S0 Z: O0 |) g+ Y$ h# r 界面简介及效果总览 , h3 {0 W) g0 {/ w: R( |( L
0 H: F. T( o8 n2 l, w
) W7 i, {6 u* p! W+ F" E ( C* W c9 o0 P* M/ x# S: _" i, I7 @" v
: G7 I+ V" s" x2 g5 R
o7 p4 E, S" S4 u7 l* _1 ?
Demo 主页面中展示了海上风电场的基本构成,包括一定规模数量的风电机组,输电系统和升压台。风电机组有序排放,叶片随风向和风速不停转动,将海洋上丰富的风的动能经过一系列转换,转化为宝贵的电能输出;每个风电机节点产生的电能经过输电系统源源流动,如同水流般汇聚于海上风电场的“心脏”——升压台。 2 [8 [) m1 n% M/ f B! h, d
! j/ q" Y$ j8 x! o* P/ M! M
) |* v" N0 ~& ^$ {, Z3 {+ ` 8 ?7 Z# z! H l1 _% f( @- O
" j% h1 c+ x+ u. {) n) m1 O @ 1 ^$ j. G S7 h6 L
点击风机叶片,可以进入叶片的微观世界,以微观视角看风机的详细信息,包括风机参数,环境参数,发电信息和故障信息等。场景的搭建采用 HT 自主研发的基于 HTML5 的 2D/3D 渲染引擎完成,其中的动画和人机交互也是基于自主研发的组件,依托于 JavaScript 和 HTML5 完成。 & P0 R* k2 l$ E
, o( O- v, q% C* z# I
K4 \, L( V Z0 _+ D5 q7 v8 p 实现过程
6 j$ O( v8 _" F! D% ? h7 y; Q4 s 1 l' G3 Q+ d% U4 Q' b+ l, f6 A! q8 o
! N* q# H9 P& ` 场景加载
; n/ ]- q/ u% |8 J9 D ! H3 @# B, O8 u @6 }$ P# p' f
! F2 x+ ]- x# ]5 c/ |5 { y 在前面部分,文章提到本案例的场景都是通过自主研发的渲染引擎完成,那么搭建好的场景如何通过代码加载,呈现给用户呢?在 HT 中,我们通过 ht.graph.GraphView 和 ht.graph.Graph3DView 分别来呈现 2D 和 3D 场景,然后通过反序列化完成场景的加载。 2 I) A5 X. Y8 W" o
2 K0 p" w) X- U3 D
. z( j0 s; f% k- ^/ z% a
开场动画
1 h# K2 Q1 c. E% m7 v5 P* J+ W
* l2 i% F% G v4 R* t
% V+ Z8 B" n& M3 p8 k ! ?- l* l8 B: o) {1 K z
% C! F5 W# r* K- p8 X& B
1 d9 }; P* E7 t _ H8 Q( }4 M
本案例的开场动画相对比较简单,动画的核心机制是使用了 HT 内部封装的动画函数 ht.Default.startAnim(),通过启动一个动画对象来使整个动画运行起来。 ! C! T# }) o1 K; r* Y
g" }) e" i9 X2 H" u* x+ Y* M$ n9 z
3 i% c* S! c) ?2 q y( { 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 参数进行。
+ s, O/ B# C, G8 i7 ?5 y / p I" z0 z& c# h7 M# w: o
F8 i0 k) S5 {9 E/ {1 R finishFunc 参数代表动画结束后的动作。action 函数和 finishFunc 动画结束回调函数,通过一些效果的搭配使用,可以使用户达到平滑的动画效果。 # d2 U+ Y/ U# U V; J
" t: q& U* V; i1 s# O, \! e
9 v6 s6 u1 u" O0 T* L: A) X" u- u 本案例的开场动画通过设置起始和终止视角的位置,在一定周期内, 使用 setEye(eye) 来完成视角的变化。 $ m0 w9 ]6 [! x
! M9 w+ M7 }; S4 c) |- C
/ T+ b, O$ |8 L7 D0 S 实现价值 / u: q$ w4 L1 M8 u
! @+ G* I6 _# B0 l- M% M ; J+ c- ]' D( P: b1 ~
风电机组: $ W) [/ _5 w9 v% h( s" ]
' c) ~' x% \( b# R* G* s
. ~, x9 v# e" b, Y* j6 ]. p( R 随风而动,将海上风能转化为电能 . f6 y, K0 F0 ~0 \1 {: p
' d4 O/ k: W2 e7 k4 [
b9 {. O- Q4 D! I" b9 l, d# D
G/ Y+ h; n T: H 8 K+ Y. a' s1 N/ B+ j
! ^3 i) f9 o, Q: y9 Y 在海上风电场项目中,风电机组的数量都是具有一定规模的,这些风电机组收集海上丰富的风能,转化为人类所需的电能。那对于这些一定规模数量的风电机组,如何保证其运行的流畅性呢?本案例使用了 HT 提供的批量 (batch)提高系统性能。 + o+ W3 z0 s( Y2 O. j
" t' C: s3 f2 i 6 s) r4 I! i1 k( G; B* D
批量的原理即如果图元一个个单独绘制模型时性能较差,但是当一批图元聚合成一个大模型进行一次性绘制时,则会极大提高 WebGL 的刷新性能。批量的使用方法是先通过 ht.Default.setBatchInfo 函数全局注册批量,再对 Data 使用 .s(batch, batchName) 设置对应的 batch 批量名。流程如图所示:
( M+ S6 o3 r0 s+ e/ H
8 j' j- l; M1 v) a
. `: M, k4 v3 ?$ l $ f$ g: _% V7 f+ w' D; E
; E* k8 Q# I9 U% V1 _ ! h1 a! Y9 W% n2 M5 ]5 W
2 d, W- ?, I* s8 d0 R/ D
p6 X$ A* V q6 G) _" j7 l
" U& N+ N* K/ G: s. d 在本案例中,每个风机模型被分为三部分,标签部分1,叶片部分2 和 主体部分 3。在上面图示的 batch 流程中,可以发现只对标签部分 1 和 主体部分 3 应用了 batch 操作,但是没有对主体部分 2 运用 batch。这是因为叶片部分需要随风转动,其属性会发生频繁变化,在 batch 里面的图元尽可能避免频繁的变化,如果属性频繁变化,将可能起到反作用。 : Y3 b7 F6 @/ L1 V7 l, E- m+ o
' M3 m/ L* a3 D* e/ V* U ) Z4 Y1 u* o) q8 n( D
风电机的详细信息: , y! u4 e, \ l# f
' B ?, H# w" W0 v% h/ B) C& z2 j
) g4 ]6 p, c1 a. z# G
进入微观视角,将风电机的一切尽收眼底
. z6 l; d% y" o3 z; h* s
( ?! P1 S6 |5 c) g/ |/ L
* k& W9 q1 D( D" h + ?8 _4 w& X# X& G1 Q
$ M5 p; U* ~2 }$ M$ w: D ; y7 R5 @" v! r" V# C7 G6 c& B
点击每个风电机的叶片,都能打开风电机的详细页面。在此场景中,我们采用了科技线框风格来展示风电机的内部架构,相对于大部分的实景搭建,感官上更为震撼和炫酷。在展示风机内部结构的同时,两侧还展示了该风机周围的环境参数,海上风向风速信息,风机本身的数据监测,发电参数等。点击风电机的某个部位,可以看到以 billboard 样式展示的详细信息。 4 N! V" f0 @4 h6 [8 v
8 u3 ~5 t% D' C7 i3 s0 o( l
0 T/ ?. F# d$ Z7 o/ Z" e) Q 输电系统:
2 ~* E6 z: }9 E" }3 h2 Y4 j9 }* s ~
: r2 O; \1 ?; D6 t. w" j0 d 1 D2 a( Y9 G: P! T( M( F3 j
不辞劳苦,将电能源源不断地输送给升压台
, N, @9 ?- K b$ ]7 |
9 O! \' O% }7 Q* X. q0 H & p, u& Y" |4 R- F1 L# o
经过风电机转换而来的电能,通过输电系统源源不断地输送给升压台,如同涓涓细流汇入大江大河。在本案例中,输电系统是使用空间管线 ht.polyline 实现的,ht.polyline 继承于 ht.shape, 支持{x: 10, y: 20, e: 30}格式的三维空间点描述。 ht.polyline 的走向由 points 和 segments 决定。案例中的流动效果是通过使用 setInterval 方法来不停地动态改变管线的 top.uv.offset 属性来实现。 9 k+ w" V1 h" [* q; |, y$ L
" I: N6 G& F) Y
7 B x5 V1 Q3 ^: s* H7 ?' w
在本案例中,输电系统的管道也是数量庞大的,因此也采用 batch 实现。其流程如图所示:
0 b* O, r2 b6 A' k) K
+ |+ d7 K9 h; R( h
( B* h' T( [$ C9 [* X( { 7 j/ e; H0 a2 Q) W8 K
; l3 ]: c( i, A H" \1 P* x# [
$ t1 U" x/ ]6 E* {7 ^* Q
总结
_! ^* T3 N, X! l; }% U
( T, F. _) ^0 Q
' s* y+ f: ~# c1 v2 N 建设海洋强国,寄托着中华民族向海图强的愿望。人类对海洋的探索永无止境,全面、准确而深刻地了解海洋,掌握海洋的运动规律,才能为建设海洋强国提供坚实的基础。开发海洋,经略海洋,保护海洋,拓展蓝色经济空间,已经成为人类生存和社会发展的趋势。海洋经济,海洋科技将来是一个主攻方向,而海上风力发电场作为海洋强国的一部分,也将会涌现一批又一批精品工程,给中国经济的底色注入更多的蓝色。我们也会更加专注于自主产品研发,在力所能及的领域贡献一份力量。
2 V2 f3 h n% P/ J) A- \, C. E( k
6 c* V, _+ g) O7 G / O0 f, H; K, Y9 p
举报/反馈 ) ]& C3 a d! J: e0 G
6 F3 C( N! G: H9 }
& G: F b9 r# [# i L6 Y" E: [3 Z4 y# ?7 j$ j
. i) d9 p$ W, ]' N1 d8 P) n1 y
4 D8 e# v3 s, B$ W/ Z! m0 h
|