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/)

时间: 2024-12-18 12:25:34

cocos 射线检测 3D物体 (Sprite3D点击)的相关文章

关于射线检测:3D物体点击 与UI检测

物体添加Collider ui遮挡射线问题:关掉UI上面Raycast Target 在场景添加 EventSystem Physics Raycaster 组件 添加在相机上 在被检测的物体上添加如下脚本 //引用命名空间 using UnityEngine.EventSystems; public class EventTest : MonoBehaviour, IPointerClickHandler { public void OnPointerClick(PointerEventDat

【Unity3D】枪战游戏—发射子弹、射线检测

一.子弹的碰撞检测: 因为子弹的移动速度非常的快,那么如果为子弹添加一个collider,就有可能检测不到了. 因为collider是每一帧在执行,第一帧子弹可能在100米处,那么下一帧就在900米处了, 那么中间的障碍物就不能被检测到了. 所以就需要射线检测: 在每一帧的执行,都向上一帧发射射线,不断地检测射线中是否有穿过的障碍物体 1 void Update () { 2 transform.Translate (Vector3.forward * Speed * Time.deltaTim

unity区分点击在3D物体还是2D UI上

当场景中的3D物体需要响应点击,但同时有UI显示时,存在判断点击是在3D物体上还是UI上的问题,办法如下: 1. 射线检测所有2D 3D物体,有2D物体被检测到时表明当前有UI.但无论Physics2D.Raycast()还是Physics.Raycast()都只能检测到含有Collider组件的物体,普通UI如Image Button等一般用射线是不起作用的.EventSystem.current.RaycastAll()可以将当前屏幕上的所有可检测的物体全部检测到,该方法需要自己构造一个Po

反复横跳的瞄准线!从向量计算说起!基于射线检测的实现!Cocos Creator!

最近有小伙伴问我瞄准线遇到各种形状该怎么处理?如何实现反复横跳的瞄准线?最近刚好在<Cocos Creator游戏开发实战>中看到物理系统有一个射线检测,于是,基于这个射线检测,写了一个反复横跳的瞄准线效果.一起往下看吧!文章底部获取完整项目! 国际惯例,先上最终效果! 在讲解之前我们需要一些向量的知识,简单的介绍一些吧! 向量的加法,OA + AB = OB 向量的点乘,表示一个向量在另一个向量上的投影,是个标量,有正负之分.向量夹角小于 90度 为正数,等于 90度 为 零,大于 90度

【转】 [UnityUI]UGUI射线检测

http://blog.csdn.net/lyh916/article/details/50947026 1.Graphic Raycaster 主要用于UI上的射线检测,挂有这个组件的物体,必须要挂上Canvas这个组件(当挂上Graphic Raycaster时Canvas也会自动挂上). Ignore Reversed Graphics:是否忽略反方向的图形,如果为true,则表示图形正面展示时,会接收到射线检测:反面展示时,不会接收到射线检测:否则,正反面展示都会接收到射线检测 Bloc

使用3D物体做GUI界面

通常来说,Unity自带的OnGUI不太好用,靠代码完成,在场景中无法直接编辑.所以,一般项目使用NGUI插件来做界面,但我这次要修改一个游戏,它没用NGUI,也没用OnGUI,而是使用类似NGUI的原理,采用Plane这种3D物体来做界面. 其实很简单,比如你需要一个按钮,就创建一个Plane,然后用对应的图片创建一个材质,给它贴上去就行了.这样只是显示了一张图片,要实现点击效果,还要在Update函数中捕获用户输入.我这里检测到输入时,先使用ScreenToWorldPoint函数来转换输入

OpenGL学习笔记3 —— 绘制3D物体、鼠标交互、反向变换

/* reference http://nehe.gamedev.net/article/using_gluunproject/16013/ */ #include <windows.h> // windows系统要加这个.因为下面2个头文件的一些宏是在这个文件中定义的 #include <gl/Gl.h> #include <gl/glut.h> //这两个头文件在OpenGL程序中几乎必加. #include <cstdio> //标准输入输出,用来打印

UGUI射线检测

1.Graphic Raycaster 主要用于UI上的射线检测,挂有这个组件的物体,必须要挂上Canvas这个组件(当挂上Graphic Raycaster时Canvas也会自动挂上). Ignore Reversed Graphics:是否忽略反方向的图形,如果为true,则表示图形正面展示时,会接收到射线检测:反面展示时,不会接收到射线检测:否则,正反面展示都会接收到射线检测 Blocking Objects:屏蔽指定类型的(物理)对象,使它们不参与射线检测.渲染模式不为ScreenSpa

Unity LineRenderer 射线检测 激光攻击

在进行激光攻击的脚本编写前,我们需要先进行一定程度的想象,激光和普通的远程攻击有哪些不太一样的地方. 正常的远程攻击例如子弹,箭矢,技能波等,都有明确的弹道,不可能同时命中多个敌人,而且一般只要命中敌人后就会被销毁.(特殊技能除外) 但激光可以认为是一种持续性的范围伤害,只是它的范围(长度)是不固定的,在激光的发射阶段,它会在第一个被命中的目标或障碍物处截断. 一旦整个激光成型后,一般来说,它将不再被运动的目标截断,反而是依靠它已经生成的光柱将目标弹开并造成伤害. 当然,如果之前被命中的目标或障