日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

cocos 射线检测 3D物体 (Sprite3D点击)

發布時間:2023/11/27 生活经验 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cocos 射线检测 3D物体 (Sprite3D点击) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

看了很多朋友問怎么用一個3D物體做一個按鈕,而且網上好像還真比較難找到答案, 今天翻了一下cocos源碼發現Ray 已經封裝了intersects函數,那么剩下的工作其實很簡單了, 從屏幕的一個point 轉化為 一條射線, 然后從一個3D物體拿到碰撞盒后調用intersects 就可以了。

?

void HelloWorld::onEnter(){Scene::onEnter();//添加一只3D的烏龜在場景, 作為一個按鈕auto orc = cocos2d::Sprite3D::create("tortoise.c3b");orc->setScale(0.05);orc->setPositionNormalized(Vec2(.5f,.3f));//orc->setPositionZ(40);orc->setRotation3D(Vec3(0,180,0));orc->setPosition3D(Vec3(-100, 0, -140));orc->setGlobalZOrder(-1);this->addChild(orc);auto listener1 = EventListenerTouchOneByOne::create();//創建一個觸摸監聽listener1->setSwallowTouches(true);//設置是否想下傳遞觸摸cocos2d::EventListenerTouchOneByOne::ccTouchBeganCallback ccTouchCallback = [this, orc] (Touch* touch, Event* event)->bool{auto point = touch->getLocation();//窗口大小auto winSize = Director::getInstance()->getWinSize();auto camera = this->getDefaultCamera();if(nullptr == camera){return false;}auto nearP = Vec3(point.x, point.y, 0.0f);//近平面auto farP = Vec3(point.x, point.y, 1.0f);//遠平面camera->unprojectGL(winSize, &nearP, &nearP);//反投影camera->unprojectGL(winSize, &farP, &farP);auto dir = farP - nearP;//得到射線方向dir.normalize();//歸一化向量auto ray = Ray(nearP, dir);//從近平面射出的一條射線auto aabb = orc->getAABB();//獲取3D物體的AABB碰撞盒if(ray.intersects(aabb)){//射線是否命中該包圍盒CCLOG("on hit!!!!");}return false;};listener1->onTouchBegan = ccTouchCallback;this->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener1, this);}

  (我的博客:http://www.cnblogs.com/CodeerHome/)

轉載于:https://www.cnblogs.com/CodeerHome/p/7212635.html

總結

以上是生活随笔為你收集整理的cocos 射线检测 3D物体 (Sprite3D点击)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。