淺析射線檢測 raycast 的使用!Cocos Creator 3D!

2021-01-08 白玉無冰

哎呀?為什麼我設置了節點點擊回調沒反應呀?

記得在寫小雞拍拍的時候遇到一個問題,想要捕捉排球的點擊事件,按照 2d 的寫法,給3d 節點添加 node 事件,結果點了沒反應。代碼大概是以下的樣子。

this.node_volleyball.on(Node.EventType.TOUCH_START, () => { console.log('不可能看見我')}, this);

後來在論壇上找了個方法,稀裡糊塗的寫上去就完事了。

但是,最近我把版本升級到 v1.0.1 之後,發現之前的方法不管用了。還好,在最新官方文檔找到了解決方案。那 就 是 —— 射線檢測 。

什麼是射線檢測呢?上網查了一下,射線檢測是這樣子的。

這好像不是我想要的東西。於是,我就腦補了一下射線檢測是怎麼個邏輯。

首先,我們看到的視角是這樣子的。假設我們點擊其中屏幕中的一個位置(圖中的紅點點)。

因為這個視角是攝像機提供的,我們就把這個點點和攝像機組合一條射線。

接著,檢查這條射線穿過了那些物體,這些物體中可能就有我們點擊的對象。

也可以這麼理解,你用眼睛看著一塊區域,伸出手指。你可以看到手指頭擋住了一點視線,從你的視線做經過手指這個點畫一條射線,這個射線穿過的物體,就剛好是你想要點擊的物體。

講了大概原理(?),一起看看如何使用吧。

既然是射線檢測,當然要先創建一個射線。

private _ray: geometry.ray = new geometry.ray();

觸摸檢測的就用全局系統事件。

systemEvent.on(SystemEventType.TOUCH_START, this.onTouchStart, this);//onTouchStart(touch: Touch, event: EventTouch)

開始畫射線,就要用到攝像機嘛!記得上面說的是由點擊的點和攝像機決定這條射線的吧。

this.camera_3d.screenPointToRay(touch._point.x, touch._point.y, this._ray);

接下來就是檢測這條線穿過了哪些物體啦。

creator 3d 提供了三種檢測方案,可以一起看看是如何使用的。

基於物理碰撞器的射線檢測:

我們先給需要檢測的物體添加碰撞器。

在代碼中調用物理碰撞器檢測方法就可以啦。

//基於物理碰撞器的射線檢測if (PhysicsSystem.instance.raycast(this._ray)) { const r = PhysicsSystem.instance.raycastResults; for (let i = 0; i < r.length; i++) {const item = r[i];if (item.collider.node.uuid == this.node_volleyball.uuid) {this.label_info.string = '點了排球' } }}

基於模型的射線檢測:

大致與物理模型檢測相同,使用的是模型組件。

檢測代碼如下。

//基於模型的射線檢測const rs = director.getScene().renderScene;if (rs.raycastSingleModel(this._ray, this.model_basketball.model)) { const r = rs.rayResultSingleModel;for (let i = 0; i < r.length; i++) { const item = r[i];if (item.node.uuid == this.model_basketball.node.uuid) { this.label_info.string = '點了籃球' } }}

基於 UITransform 組件的射線檢測:

因為 canvas 有自己的相機實體,我們需要切換攝像機,代碼如下。

//基於 UITransform 組件的射線檢測const uiCamera = this.canvas_2d.camera;uiCamera.screenPointToRay(this._ray, touch._point.x, touch._point.y);if (rs.raycastAllCanvas(this._ray)) { const result = rs.rayResultCanvas;for (let i = result.length; i--;) { const item = result[i];if (item.node.uuid == this.label_info.node.uuid) { this.label_info.string = '點了文字'; } }}

一起看看最後的效果吧!

官方文檔寫的很詳細了,這裡只是稍做整理,如有錯誤,歡迎指出!希望對正在學習 Cocos Creator 3D 的朋友有點幫助。

相關焦點

  • Cocos Creator 3D v1.0.1 正式發布
    _point.y, ray); if (PhysicsSystem.instance.raycast(ray, Layers.Enum.DEFAULT, maxDistance)) { const r = PhysicsSystem.instance.raycastResults; for (let i = 0; i < r.length; i++)
  • Unity - Raycast 射線檢測
    ,而非無窮)用法:Ray ray = new Ray(transform.position,transform.forward)Ray camerRay = Camera.main.ScreenPointToRay(Input.mousePosition)RaycastHit 光線投射碰撞信息檢測方法 - 線型檢測Physics.Raycast
  • 菜鳥丨Egret 3D射線使用
    本文將通過射線和射線回調實現簡單的遮擋物半透明過程,來介紹具體功能的作用和使用方法。一、Rayegret3d.Ray.create(origin,direction)。1、origin:起點,射線的出發點;2、direction:方向:射線指向的方向;3、射線不會被遮擋;4、射線創建需要跟隨移動後需手動修改位置。這裡把起點設置在相機位置,並且指向人物。完成射線創建。需要設置其他屬性「ray.xxx」即可具體參數參考egret3d射線文檔。
  • 射線檢測!Cocos Creator
    最近剛好在《Cocos Creator遊戲開發實戰》中看到物理系統有一個射線檢測,於是,基於這個射線檢測,寫了一個反覆橫跳的瞄準線效果。一起往下看吧!國際慣例,先上最終效果!在講解之前我們需要一些向量的知識,簡單地介紹一些吧!向量的加法,OA + AB = OB向量的點乘,表示一個向量在另一個向量上的投影,是個標量,有正負之分。
  • 四元數與3D旋轉實例! Cocos Creator 3D Quternion !
    前言本文不會講太多四元數公式的推導過程,重點講講幾個接口的使用和個人理解。以上為白玉無冰使用 Cocos Creator 3D v1.2 實現 "四元數與旋轉" 的技術分享。歡迎分享給身邊的朋友!參考https://docs.cocos.com/creator3d/api/zh/classes/core_math.quat.htmlhttps://en.wikipedia.org/wiki/Quaternionhttps://eater.net/quaternionshttps://github.com/Krasjet/quaternionhttps://forum.cocos.org
  • 直播筆記 | Unity中射線檢測詳解
    這周三我們直播剖析了Unity中射線檢測的功能,以下是直播內容精華部分筆記。完整錄播:https://www.bilibili.com/video/av24468720源碼地址:https://github.com/zhenghongzhi/PhysicRaycast什麼是射線(Ray)?
  • Cocos Creator!
    當然直接使用Math.random()可以實現。參考代碼如下。=> 95% 的概率 0~1coin.initial_velocity.x = (random_normal_x / 4 + 0.5) * (V_X_MAX - V_X_MIN) + V_X_MIN;coin.initial_velocity.y = (random_normal_y / 4 + 0.5) * (V_Y_MAX - V_Y_MIN) + V_Y_MIN;以上為白玉無冰使用
  • 極具潛力的效率啟動器 App,Raycast 腳本功能詳解
    /bin/bash# Required parameters:# @raycast.schemaVersion 1# @raycast.title Echo SSPAI# @raycast.mode compact# Optional parameters:# @raycast.icon echo "Hello World!"
  • X-ray的堂兄弟---中子無損檢測方法淺析
    中子無損檢測方法是NDT五大常規之一的X-ray的一個堂兄弟。所採用的的是中子射線與物質作用獲悉物質內部微觀與宏觀結構與材料信息。中子射線與其小夥伴X-ray和γ-ray最大的不同點是:不帶電,與物質作用機理不同。
  • 【教程】Unity3D 之射線檢測
    > 射線檢測故名就是通過射線去檢測是否和碰撞器產生了交集
  • 快捷啟動器Raycast|它想成為你的Mac默認搜索工具
    老實說,我並不是Alfred的忠實用戶,曾因為看到很多人推薦而去安裝使用,但略顯陳舊的UI和繁雜的設置菜單讓我覺得「聚焦(Spotlight)」好像也能湊合用著Raycast默認只有Google、DuckDuckGo兩種搜尋引擎且無法修改。右下角有快捷菜單,除了打開應用/文件之外,還可以快速定位文件位置或者執行其它操作,而且這些所有的一系列操作都可以使用快捷鍵完成。
  • 淺聊X-ray檢測技術
    X-ray檢測技術檢測原理X-ray 檢測設備是現代工業生產中非常重要的檢測設備。
  • 新興的製程方法和分析手段 X-ray檢測設備的原理
    近幾年,隨著通信、計算機、消費電子等產業的發展,x-ray檢測設備也漸漸發展起來。X-ray檢測技術作為新興的製程方法和分析手段,可以實現在不破壞產品的前提下,檢測出肉眼不可見缺陷,反映產品的內部信息,可對檢測結果進行定性、定量分析,以便及早發現故障,降低廢品率。今天卓茂科技就跟大家一起來聊聊x-ray檢測設備的原理。
  • x-ray檢測設備的原理,特點及其功能介紹?
    今天,讓我們來談談「X-ray檢測設備」,它是快速發展的電子行業中有能力的人。相信在這個行業工作的朋友有一定的了解。本文總結了X-ray檢測設備的原理、特點和及其功能,以便每個人在閱讀X-ray檢測設備後都能快速掌握它。  一.日聯科技X射線檢測設備的功能  1.首先要介紹的是測量功能,它可以測量直線距離,圓直徑,同心圓,點與圓心之間的距離等。
  • Cocos2d-x v3.3-RC0 發布說明! - OSCHINA - 中文開源技術交流社區
    因為加載這兩個lua文件會返回一個對象,lua代碼會使用返回的對象進行操作,所以需要替換對應的加載路徑,具體修改如下:require "luaj" -> require "cocos.cocos2d.luaj"require "luaoc" -> require "cocos.cocos2d.luaoc"兼容舊API的lua文件默認沒有被加載上來
  • 【大咖專欄】Unity AR Foundation 平面檢測實戰
    要使用ARFoundation,必須安裝一個XRPlugin,考慮到iOS調試的便利性,我們選擇iOS平臺的ARKitXR Plugin進行初次學習。  ARKitXR Plugin的安裝會自動觸發ARFoundation和ARSubsystems包的安裝,如下圖所示:
  • 使用多年的窗口管理工具Magnet,我用Raycast替換了它
    結合自己的使用習慣,我最常用的其實只有「左半屏」、「右半屏」、「最大化」以及「窗口居中」這四個,極其偶爾可能會需要1/3分屏,才會點下狀態欄的圖標或者手動拖東下(畢竟不需要那麼精準)。在Raycas上,使用窗口調節功能,如果不設置快捷鍵,其實並不會比Magnet方便。
  • Raycast年末更新:新增懸浮便籤、瀏覽器書籤查詢
    不支持拼音搜索就不提了,書籤名或者閱讀列表保存的網頁名中確實出現的中英文關鍵詞都無法搜索到結果,唯獨使用目標名稱開頭的字、詞才能夠搜索到準確目標。而同樣的問題在英文書籤名中,卻又不會出現。類似這種中文搜索問題,其實在第一次接觸 Raycast 就已經察覺,包括在搜索應用名時同樣會出現。因此,我也是多次建議大家儘量使用英文搜索。
  • Raycast年末更新,這些功能是你想要的麼?
    老實說,使用 Raycast 第一個公測版時,並沒有特別剛需的功能讓我繼續使用下去,況且還有中文搜索不夠友好的問題。但 Raycast 的顏值和對其未來新功能的期待還是讓我用它替換了 macOS 的聚焦。在 v1.5.1 版本中新增的懸浮便籤是 Raycast 又一使用工具,類似功能的有 SideNotes、macOS 自帶的便籤等。