整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          在手機(jī)游戲中實現(xiàn)下雨系統(tǒng)

          者:日音

          先展示最終效果:

          http://v.qq.com/x/page/j0808yxmm3w.html

          雨水會導(dǎo)致物體潮濕,會在平面形成水波,會在斜面形成紋路。雨會被物體阻擋,阻擋的部分依然保持干燥,干燥和潮濕有過度。水積累到一定程度還會有反射。

          很早就想做一個完整的天氣系統(tǒng)。不過難度太大了,所以打算拆分成一個個小系統(tǒng)。首先就是做最常見的下雨。

          雨水本身實現(xiàn)已經(jīng)有很多成熟的方式,包括我個人最喜歡的angrybots里面的雨,性能和表現(xiàn)都非常好。遺憾的是不夠通用,所以我打算還是重新做一個分離的雨滴,方便后面加入一些中級效果,例如遮擋之類這樣的特性。

          我假定雨是有一個下界的,畢竟如果你潛入了水底,那么肯定就不希望會有任何下雨被看到。上界就不需要了,如果你高到一定程度,發(fā)現(xiàn)只有下方有雨,那估計也非常奇怪。

          我們需要設(shè)計一種tile方式的雨來處理攝像機(jī)看到雨的范圍。水平方向上可以調(diào)整tile個數(shù),垂直方向我可以根據(jù)控制雨下落的生命周期來控制。

          根據(jù)這張圖,我們要計算出攝像機(jī)能看到的AABB盒,從而去做需要雨落下的物體的范圍。

          因為每個雨滴都是獨立的,這次我們可以放心使用廣告牌技術(shù)了。

          另外,由于雨離攝像機(jī)太近會有點太大塊的感覺,所以我建議將攝像機(jī)的nearPlane調(diào)整到1左右。

          由于是局部雨,攝像機(jī)快速移動或者瞬間切換位置的時候,需要還原雨本應(yīng)該的場景。 我們保存上一幀的AABB盒,并且對當(dāng)前的AABB盒遍歷,判斷如果在原來的AABB盒內(nèi),那么就啥都不做,否則需要還原雨滴。

          經(jīng)過測試,發(fā)現(xiàn)雖然有一點點的銜接不夠流暢的問題,但整體感受其實還不錯。

          不過上面做出的雨太干巴巴了,首先我要考慮的是增加雨滴打中地面的波紋。

          波紋我們參考的是這篇文章:

          https://seblagarde.wordpress.com/2013/01/03/water-drop-2b-dynamic-rain-and-its-effects/

          其中涉及波紋的部分比較簡單。

          r通道代表離圓心的距離。gb通道代表法線方向,a通道代表隨機(jī)強(qiáng)度值。

          這樣之后,波紋是有了。

          遠(yuǎn)處可以優(yōu)化下,太遠(yuǎn)的地方其實可以不用算,優(yōu)化性能。然而這還不夠,因為這地面看上去壓根就不像濕滑的,濕滑的地面需要額外處理一下。通過增加一張法線貼圖,控制一下uv的擾動,并且替換了下地表,來展示雨水的效果。

          靜態(tài)圖效果不明顯,還是看視頻吧。

          接下來要處理的是水導(dǎo)致物體本身的變化。一般顏色會稍變深,表面會變光滑,如果有水坑的話就會反光之類。其實就是pbr里面的smooth。但是手機(jī)用全套pbr性能有點耗,打算先把brdf3的一部分拿過來用。

          做了一些修改。然后就是要考慮被阻擋的部分,我打算在頂部放一個攝像機(jī),用來記錄物體的深度,然后整個系統(tǒng)都需要去判斷深度,然后看是否被雨水阻擋,再做相應(yīng)處理。實際操作分為這么幾步:

          1.頂部攝像機(jī)用深度shader替換去渲染物體,然后做一下高斯模糊,用來讓邊界過度的更加自然。

          2.平面shader把世界坐標(biāo)轉(zhuǎn)到頂部攝像機(jī)裁剪空間坐標(biāo),算出uv去取深度值,然后根據(jù)矩陣反算出世界坐標(biāo)的值,比較兩個世界坐標(biāo)的y,來看是否頂部有物體擋住,如果有的話,就對潮濕效果,反射效果,波紋效果進(jìn)行弱化處理。

          3.反射效果就是用水面反射,增加一個反射攝像機(jī),具體可以參考自帶的水面反射。

          效果大概是這樣:

          看視頻效果更好一些。

          手機(jī)上試了一下,效果全開的話幀率下降的比較厲害,然后去掉了反射效果,簡化了光照模型之后,幀率得到了改善。

          說下這個雨的注意事項。

          我的本意是希望可以在不更改項目的情況下增加這個雨的效果,但我發(fā)現(xiàn)這樣是需要做屏幕后處理才可以達(dá)到,但處理起來比較復(fù)雜。最終我還是選擇了用Plane,Cube來做效果。如果要整合到自己的項目中,還是需要做一些代碼上的整合。例如水導(dǎo)致物體潮濕,可以把我的函數(shù)和貼圖放到自己的shader中,也可以直接修改shader里面的高光,光滑度等這些參數(shù)。

          對于遮擋攝像機(jī)的部分,需要設(shè)置合適的大小和位置,如果場景特別大的話,通過移動攝像機(jī)的話,邊緣部分會產(chǎn)生抖動。所以我建議大場景要使用多個深度攝像機(jī)或者自己提前烘焙好深度數(shù)據(jù)(如果場景沒有動態(tài)障礙物的話)。

          聯(lián)系我們

          歡迎優(yōu)質(zhì)創(chuàng)意項目隨時與我們聯(lián)系:

          Danielkyan@tencent.com

          Yunmi@tencent.com

          在玩 HDRP 的內(nèi)置 Lit 著色器的時候,對它的 Mask Map 貼圖很感興趣,感覺似乎能夠為材質(zhì)添加很多細(xì)節(jié)

          不使用 Mask Map

          使用 Mask Map

          查了下文檔,發(fā)現(xiàn) Mask Map 是分 RGBA 通道作為灰度蒙版,為材質(zhì)添加金屬度、環(huán)境光遮蔽、細(xì)節(jié)貼圖蒙版與粗糙度效果的:

          讓我最感興趣的是 A 通道的粗糙度蒙版,就像上圖那樣,能營造出非常類似物體表面的水霧的感覺。

          恩..如果我用 Shader 讓這個 A 通道做一個平移,再加點噪聲,說不定就能做出來類似下雨時物體表面潺潺流水的效果?

          實現(xiàn)思路

          使用 ShaderGraph 的 TimeTilling and Offset節(jié)點將 UV 做一個平移,加上線性噪聲節(jié)點做一些扭曲,添加一點隨機(jī)性。最后直接復(fù)用原材質(zhì)的 Mask Map 的 A 通道并應(yīng)用擾動。用一個布爾來控制是否應(yīng)用效果。添加各種屬性值就不說了。應(yīng)該還不錯。

          在實現(xiàn)過程中,由于 HDRP 的內(nèi)置 Lit 著色器沒有 ShaderGraph 版本,就從論壇上找了一個官方的 Lit 著色器的 ShaderGraph 版本,基于它進(jìn)行修改。

          整體(糊也沒事..大部分是官方給的,用于實現(xiàn) Lit 的特性,核心就那上面的一小點)

          核心效果實現(xiàn)(就這幾個節(jié)點..真的挺簡陋的..)

          效果

          磚墻材質(zhì)

          石碑(?) 材質(zhì)

          模型效果

          一些個人感受:

          • 這是個很粗糙的效果,用到的節(jié)點也很少,之后要實際應(yīng)用的話肯定要補(bǔ)充很多細(xì)節(jié),比如單獨做水流的 Mask 應(yīng)該會好很多

          • 個人認(rèn)為的效果優(yōu)缺點:

            • 優(yōu)點:

              • 和網(wǎng)上其他的雨水效果比起來,對性能影響應(yīng)該蠻低的。加上天氣效果以及一些點綴應(yīng)該也能實現(xiàn)不錯的效果

              • 簡單啊(連我都能做出來..),直接復(fù)用材質(zhì)自己的 Mask Map 也懶省事了

              • 因為不同材質(zhì)的 Mask Map 不同,所以這個效果也會帶有各自材質(zhì)的特點,不會說效果千篇一律看著疲勞

            • 缺點:

              • 對于較為光滑的平面類物體感覺效果比較一般

              • 因為復(fù)用了原材質(zhì)的 Mask Map,應(yīng)用效果時材質(zhì)自身的粗糙度會丟失,不太好

              • 可遠(yuǎn)觀而不可褻玩(bushi),在遠(yuǎn)處看起來還不錯,如果離得太近的話就能比較明顯的看出來違和的平移與噪聲

          • 總之還是個很粗糙的效果,不過這種思路應(yīng)該還是有點意思的,必能活用于下一次..

          參考鏈接

          • https://forum.unity.com/threads/trying-to-replicate-the-hdrp-lit-shader-i-need-help-with-the-detail-input-part.660538/Unity Forum-ShaderGraph 版 Lit 原貼

          • https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@7.1/manual/Mask-Map-and-Detail-Map.htmlMask Map 文檔

          • https://github.com/OnyxAmber/UnityHDRP_ShaderGraphTest把著色器圖與材質(zhì)傳到 Github 上了,項目太大就不傳了,直接拖入 Unity 窗口即可。使用貼圖也是 HDRP 自帶的示例。

          通過閱讀這篇文章,你將學(xué)會用Python創(chuàng)建一個天氣警報系統(tǒng),當(dāng)它預(yù)測未來幾小時內(nèi)天空將下雨/下雪時,它會向多個收件人發(fā)送一封電子郵件通知。電子郵件通知包含其他信息,如預(yù)測的溫度和濕度。

          本教程有3個部分:

          1.設(shè)置

          2.實現(xiàn)

          3.結(jié)果


          設(shè)置

          天氣API

          我們將使用ClimaCell的天氣API來獲取預(yù)報天氣數(shù)據(jù)。根據(jù)您的需要,它提供了相當(dāng)多的有用和準(zhǔn)確的數(shù)據(jù)。

          它涵蓋了4周以前的歷史站點數(shù)據(jù)以及15天以前的每日預(yù)報數(shù)據(jù)。此外,你可以很容易地實現(xiàn)它的官方文件提供參考4種不同的計算機(jī)語言:

          • JavaScript
          • Ruby
          • Node
          • Python

          前往注冊和注冊一個新帳戶。一旦完成,您應(yīng)該會看到下面的指示板,它概述了計劃細(xì)節(jié)和您的調(diào)用活動。



          請注意API鍵,因為我們將在后面的代碼中使用它。


          郵件配置

          我將使用個人Gmail賬號通過SMTP給自己發(fā)郵件。為了使用它,你需要改變帳戶設(shè)置的配置,并打開不太安全的應(yīng)用程序訪問。

          轉(zhuǎn)到帳戶設(shè)置,然后點擊安全菜單。


          打開不太安全的應(yīng)用訪問,如下所示

          完成之后,在項目的根目錄中創(chuàng)建一個名為config.ini的新文件。它將被用作我們項目的配置文件。將以下代碼添加到其中。

          [email]
          email=your_email@gmail.com
          host=smtp.gmail.com
          port=587
          password=your_password
          • 電子郵件-您的電子郵件帳戶的名稱
          • 主機(jī)- smtp服務(wù)器的主機(jī)名。修改這個基于smtp服務(wù)器為您的電子郵件
          • 端口-用于smtp服務(wù)器的端口。修改這個基于smtp服務(wù)器為您的電子郵件
          • 密碼-密碼到您的電子郵件帳戶。請務(wù)必不要將此文件或信息泄露給其他人。


          Python模塊

          強(qiáng)烈建議為這個項目創(chuàng)建一個虛擬環(huán)境。在終端中運(yùn)行以下命令來安裝configparser模塊。它在從文件加載配置設(shè)置時非常有用。

          pip install configparser


          實現(xiàn)

          在與config.ini相同的目錄中創(chuàng)建一個名為weather_email.py的新文件。這個文件作為我們的應(yīng)用程序的電子郵件模塊。

          import

          在文件的頂部添加以下導(dǎo)入聲明

          try:
              import configparser
          except:
              from six.moves import configparserimport smtplib
          from email.mime.multipart import MIMEMultipart
          from email.mime.text import MIMEText
          import requests

          接下來,創(chuàng)建一個字典,表示在下雨或下雪時我們將要發(fā)送的消息。您可以根據(jù)您的用例創(chuàng)建自己的映射或自定義消息。

          weather_dict = {'freezing_rain_heavy': 'Heavy rain and snow', 'freezing_rain': 'Rain and snow', 'freezing_rain_light': 'Light rain and snow', 'freezing_drizzle': 'Light drizzle and snow', 'ice_pellets_heavy': 'Heavy ice pellets', 'ice_pellets': 'Normal ice pellets', 'ice_pellets_light': 'Light ice pellets', 'snow_heavy': 'Heavy snow', 'snow': 'Normal snow', 'snow_light': 'Light snow', 'tstorm': 'Thunder storm', 'rain_heavy': 'Heavy rain', 'rain': 'Normal rain', 'rain_light': 'Light rain'}


          天氣API設(shè)置

          初始化調(diào)用weather API時需要的以下變量。

          url = "https://api.climacell.co/v3/weather/nowcast"
          querystring = {"lat":"1.29027","lon":"103.851959","unit_system":
                         "si","timestep":"60","start_time":"now","fields":"temp,humidity,weather_code",
                         "apikey":"xxxx"}

          我們將調(diào)用nowcast API,它有以下參數(shù),可以修改:

          • 緯度,-87至89
          • 經(jīng)度,-180到180度
          • unit_system—單位制,“si”或“us”
          • 時間步長-時間步長,分1到60。將start_time設(shè)置為現(xiàn)在并將timestep設(shè)置為60將返回7個數(shù)據(jù)點。(現(xiàn)在,60分鐘后,120分鐘后,……)
          • start_time—您可以設(shè)置自己的時間,或者現(xiàn)在就初始化它
          • end_time—限制結(jié)束時間的可選參數(shù)。默認(rèn)情況下,它將返回距離當(dāng)前時間戳最多6小時的數(shù)據(jù)。
          • 字段-從所提供的數(shù)據(jù)層中選擇的字段(如“降水”或“陣風(fēng)”)。我在本教程中使用了temp,濕度和weather_code。
          • apikey -來自Climacell天氣API儀表板的API鍵


          郵件發(fā)送

          我們將創(chuàng)建一個名為EmailSender的新類,并像下面這樣初始化它。我們使用configparser模塊從config.ini中讀取數(shù)據(jù),并將其分配給相應(yīng)的變量。

          def __init__(self):
              self.cf = configparser.ConfigParser()
              self.cf.read('./config.ini')
              self.sec = 'email'
              self.email = self.cf.get(self.sec, 'email')
              self.host = self.cf.get(self.sec, 'host')
              self.port = self.cf.get(self.sec, 'port')
              self.password = self.cf.get(self.sec, 'password')

          在類內(nèi)部創(chuàng)建另一個函數(shù)SendEmail,它接受一個接收者參數(shù)。它接受列表而不是字符串。這允許我們向多個電子郵件地址發(fā)送相同的電子郵件通知。

          def SendEmail(self, recipient):

          在函數(shù)內(nèi)部,使用以下代碼初始化一個新的MIMEMultipart對象

          title = "Home Sweet Home"msg = MIMEMultipart()
          msg['Subject'] = '[Weather Notification]'
          msg['From'] = self.email
          msg['To'] = ', '.join(recipient)

          調(diào)用天氣API

          下一步是通過請求模塊調(diào)用API,它將以json的形式返回結(jié)果。

          response = requests.request("GET", url, params=querystring)
          result = ""json_data = response.json()

          您可以充分利用結(jié)果并將其映射到我們在上面指定的字典,以便創(chuàng)建所需的通知消息。然后,用它初始化一個MIMEText對象,并將其附加到MIMEMultipart對象。通過調(diào)用smtplib結(jié)束它。SMTP上下文管理器發(fā)送電子郵件。

          msgText = MIMEText('<b>%s</b><p>%s</p>' % (title, result), 'html')
          msg.attach(msgText)with smtplib.SMTP(self.host, self.port) as smtpObj:
              smtpObj.ehlo()
              smtpObj.starttls()
              smtpObj.login(self.email, self.password)
              smtpObj.sendmail(self.email, recipient, msg.as_string())

          查看以下網(wǎng)址以獲得完整的代碼:

          https://gist.github.com/wfng92/f5af6144053aeab514e5ff330949b112

          您的根目錄中應(yīng)該有以下文件。

          • config.ini
          • weather_email.py

          只要這兩個文件與您調(diào)用的Python文件位于同一目錄中,您就可以在任何Python應(yīng)用程序中輕松觸發(fā)電子郵件警報功能。只需根據(jù)您的用例修改import語句。下面的示例概述了在未來6小時內(nèi)下雨或下雪時向兩個收件人發(fā)送電子郵件通知的代碼。

          import weather_emailemail_obj = weather_email.EmailSender()
          email_obj.SendEmail(["email@gmail.com", "email2@gmail.com"])


          結(jié)果

          讓我們看一下運(yùn)行測試時的結(jié)果。我接到通知,說我家下著小雨。

          當(dāng)雨停的時候,我運(yùn)行了相同的代碼,預(yù)報說6小時后還會下雨。也許我應(yīng)該在下雨之前回去把我所有的衣服從晾衣架上取下來。

          英文原文鏈接:

          https://towardsdatascience.com/how-to-create-a-weather-alert-system-in-python-5fab4b42e49a


          主站蜘蛛池模板: 日韩少妇无码一区二区三区| 99热门精品一区二区三区无码| 在线视频一区二区三区| 亚洲AV网一区二区三区| 在线精品亚洲一区二区小说| 在线欧美精品一区二区三区| 中文字幕一区二区人妻性色| 精品一区二区三人妻视频| 久久国产精品视频一区| 一区二区国产精品| 在线观看国产一区二三区| 亚洲国产精品一区二区成人片国内 | 无码国产精品一区二区免费式直播 | 日韩精品一区二区三区在线观看| 国产日韩精品视频一区二区三区| 中文字幕久久亚洲一区| 波多野结衣中文一区二区免费| 日本激情一区二区三区| 国产精品美女一区二区视频| 成人乱码一区二区三区av| 动漫精品第一区二区三区| 无码视频一区二区三区| 深田咏美AV一区二区三区| 日韩国产免费一区二区三区| 色婷婷一区二区三区四区成人网| 三上悠亚一区二区观看| AV无码精品一区二区三区宅噜噜| 国产在线一区二区杨幂| 国产精品盗摄一区二区在线| 日韩精品午夜视频一区二区三区| 无码国产精品一区二区免费虚拟VR | 国产肥熟女视频一区二区三区| 亚洲Av无码国产一区二区| 国产精品视频一区二区三区经| 亚洲第一区视频在线观看| 人妻夜夜爽天天爽爽一区| 日韩精品区一区二区三VR| 亚洲电影唐人社一区二区| 国产成人精品第一区二区| 亚无码乱人伦一区二区| 国产一区二区三区小向美奈子|