• cocos2d-x实现3d翻转

    2014-07-11 13:26:55
    通过OrbitCamera实现立体翻转,当精灵翻转到90度时切换精灵纹理 代码解析 1.创建一个精灵,设定精灵的userdata用于确定切换图片 1 2 auto poker=Sprite::create("poker/poker_...

    实现原理

    通过OrbitCamera实现立体翻转,当精灵翻转到90度时切换精灵纹理

    代码解析

    auto *flip3d = OrbitCamera::create(2, -45, 0, 90, 180, 0, 0);
    然后用layer或者其他的精灵等去run这个action,就可以看到一个3D的翻转效果。
    可以用于layer之间的3D翻转切换,笔者亲自试了下,两个layer同时run action,然后翻转到一半的时候回调一下,隐藏之前的layer,这样就能完美实现3D翻转
    展开全文
  • 为了能够更好的使用cocos为我们提供的Sprite3D,我和大家分享一下Sprite3D中关于骨骼动画原理的部分,本文使用cocos2d-x 3.2版本,这是cocos首次出现3D骨骼动画的版本,相对与本文写出来时候最新的3.5版本,由于没有...

    为了能够更好的使用cocos为我们提供的Sprite3D,我和大家分享一下Sprite3D中关于骨骼动画原理的部分,本文使用cocos2d-x 3.2版本,这是cocos首次出现3D骨骼动画的版本,相对与本文写出来时候最新的3.5版本,由于没有其他比如灯光等功能,3D骨骼动画模块读起来要更加的清晰。如果文章有纰漏或者错误的地方,也请大家指教。 目前引擎支持3种动画格式,分别是.obj,.c3b,.c3t,由于.obj没有骨骼,.c3b是二进制,而.c3t是json格式,所以本文就用官方test中自带的orc.c3t的创建以及渲染作为例子。

    第一步:读取文件,得到数个struct,以下说明是对这些struct的说明:

    复制代码
    // D:\phoneclient\cocos2dxlib\cocos\3d\CCBundle3DData.h
    /**mesh vertex attribute*/
    // 顶点属性(位置属性、颜色属性、纹理属性等)
    struct MeshVertexAttrib
    {
        //attribute size
        // 描述该属性所需要的元素个数,比如描述一个Vec3的位置信息,需要x,y,z这么3个变量
        GLint size;
        //GL_FLOAT
        // 元素的类型,如GL_FLOAT
        GLenum type;
        //VERTEX_ATTRIB_POSITION,VERTEX_ATTRIB_COLOR,VERTEX_ATTRIB_TEX_COORD,VERTEX_ATTRIB_NORMAL, VERTEX_ATTRIB_BLEND_WEIGHT, VERTEX_ATTRIB_BLEND_INDEX, GLProgram for detail
        // 描述改属性类型的值,使用的值是GLProgram类的枚举,如GLProgram::VERTEX_ATTRIB_POSITION
        int  vertexAttrib;
        //size in bytes
        // 存储该属性所需要的字节数,等于size * sizeof(type)
        int attribSizeBytes;
    };
    
    /**mesh data*/
    // 模型蒙皮数据
    struct MeshData
    {
        // 每个顶点拥有的属性类型数目
        int attribCount;
        // Vertex数组元素个数
        int vertexSizeInFloat;
        // indices数组元素个数
        int numIndex;
        // 每个顶点的属性信息
        std::vector<MeshVertexAttrib> attribs;
        std::vector<float> vertex;
        std::vector<unsigned short> indices;
    };
    复制代码

    注释:拿orc.c3t来举例说明一下,得到的attribs数组分别是代表:
    1、顶点在模型坐标系下的位置信息(VERTEX_ATTRIB_POSITION)
    2、顶点的法线(VERTEX_ATTRIB_NORMAL)
    3、顶点的纹理坐标(VERTEX_ATTRIB_TEX_COOD)
    4、作用于该顶点的某骨骼,对该顶点最终位置的权重(VERTEX_ATTRIB_BLEND_WEIGHT)
    5、影响该顶点的骨骼在骨骼数组中的索引(VERTEX_ATTRIB_BLEND_INDEX)
    所以一个顶点共计要16个float变量来表示,所以vertex数组中的顶点数目就是数组大小除以16,而每个面需要3个顶点,所以面的数目我们也能确定了。至于indices数组,就是这些个顶点的索引了。

    复制代码
    /**skin data*/
    // 模型骨骼信息
    struct SkinData
    {
        // 影响到模型蒙皮的骨骼名字数组,称之为skinBone的数组
        std::vector<std::string> skinBoneNames; //skin bones affect skin
        // 未影响到模型蒙皮的骨骼名字数组,称之为nodeBone的数组
        std::vector<std::string> nodeBoneNames; //node bones don't affect skin, all bones [skinBone, nodeBone]
        // 从对应的skinBone坐标系到模型坐标系变换的逆变换,可实现将该骨骼影响的蒙皮顶点从模型坐标系的坐标,转换至该骨骼坐标系的坐标
        std::vector<Mat4>        inverseBindPoseMatrices; //bind pose of skin bone, only for skin bone
        // skinBone到其父骨骼坐标系的初始矩阵
        std::vector<Mat4>        skinBoneOriginMatrices; // original bone transform, for skin bone
        // nodeBone到其父骨骼坐标系的初始矩阵
        std::vector<Mat4>        nodeBoneOriginMatrices; // original bone transform, for node bone
        
        //bone child info, both skinbone and node bone
        // 所有骨骼与其子骨骼索引的map,值得说明的是这个索引是对skinBone和nodeBone两个数组而言的
        std::map<int, std::vector<int> > boneChild;//key parent, value child
        // 根骨骼索引,同样是相对两个数组而言
        int                              rootBoneIndex;
    }
    
    /**material data*/
    // 材质数据
    struct MaterialData
    {
        // 3.2 版本的材质数据结构很简单,只有纹理信息
        std::string texturePath;
    };
    复制代码

    第二步:根据以上解析出来的数据结构,在Sprite3D中创建Mesh类对象和MeshSkin类对象,下面说明一下这两个类的作用:

    复制代码
    // D:\phoneclient\cocos2dxlib\cocos\3d\CCMesh.h
    /** 
     * Mesh: Geometry with a collection of vertex. 
     * Supporting various vertex formats.
     */
    class Mesh : public Ref
    {
    public:
        /**build buffer*/
        // 将MeshData中的vertex和indices数组传给GPU并得到对应的_vertexBuffer和_indexBuffer
        void buildBuffer();
    
    protected:
        // 顶点数据缓冲
        GLuint _vertexBuffer;
        // 顶点索引缓冲
        GLuint _indexBuffer;
    
        // 复制了MeshData中的数据
        RenderMeshData _renderdata;
    };
    
    // D:\phoneclient\cocos2dxlib\cocos\3d\CCMeshSkin.h
    /**
     * Defines a basic hierachial structure of transformation spaces.
     */
    class Bone3D : public Ref
    {
    protected:
        // 复制对应SkinData::inverseBindPoseMatrices而来,只对skinBone有意义
        Mat4 _invBindPose;
        // 复制对应SkinData::skinBoneOriginMatrices 或 Skin::nodeBoneOriginMatrices而来
        Mat4 _oriPose; //original bone pose
        // 其父骨骼指针
        Bone3D* _parent; //parent bone
        // 子骨骼指针
        Vector<Bone3D*> _children;
        // 到模型空间的变换矩阵
        Mat4          _world;
        // 到父骨骼坐标系的变换矩阵
        Mat4          _local;
        
    };
    
    
    /**
     * MeshSkin, A class maintain a collection of bones that affect Mesh vertex.
     * And it is responsible for computing matrix palletes that used by skin mesh rendering.
     */
    class MeshSkin: public Ref
    {
    protected:
        // 由SkinData::skinBoneNames, inverseBindPoseMatrices, skinBoneOriginMatrices这些数据创建出相应Bone3D,得到该数组
        Vector<Bone3D*> _skinBones; // bones with skin
        // 由SkinData::skinBoneNames, nodeBoneOriginMatrices这些数据创建出相应Bone3D,得到该数组
        Vector<Bone3D*> _nodeBones; //bones without skin, only used to compute transform of children
        // 根骨骼
        Bone3D* _rootBone;
        
        // Pointer to the array of palette matrices.
        // This array is passed to the vertex shader as a uniform.
        // Each 4x3 row-wise matrix is represented as 3 Vec4's.
        // The number of Vec4's is (_skinBones.size() * 3).
        Vec4* _matrixPalette;
    };
    复制代码

    注释:这里说一下_matrixPalette这个成员变量。在Mesh::buildBuffer()后,已经将所有的顶点传递给了GPU,所以接下来的问题就是如何将这些顶点坐标,由其初始状态的模型坐标系下的坐标,跟随对应骨骼,变换至当前模型坐标系下的坐标。而这些变换的矩阵,就是使用_matrixPalette来传递的。引擎使用3个Vec4来表示这样一个矩阵,而_matrixPalette就表示了所有_skinBones的这个变换矩阵。而具体每个skinBone的这个4x3矩阵的计算则在MeshSkin::updateJointMatrix函数中:

    复制代码
    // D:\phoneclient\cocos2dxlib\cocos\3d\CCMeshSkin.cpp
    void Bone3D::updateJointMatrix(Vec4* matrixPalette)
    {
        {
            static Mat4 t;
            // 得到我们需要的矩阵,但这是4*4 的。
            Mat4::multiply(_world, getInverseBindPose(), &t);
            // 将矩阵最后一行去掉,得到4*3的Vec4向量数组
            matrixPalette[0].set(t.m[0], t.m[4], t.m[8], t.m[12]);
            matrixPalette[1].set(t.m[1], t.m[5], t.m[9], t.m[13]);
            matrixPalette[2].set(t.m[2], t.m[6], t.m[10], t.m[14]);
        }
    }
    复制代码

    第三步:构建渲染指令,传递相应数据至GPU进行绘制:
    我们来分析一下对应的ccShader_3D_PositionTex.vert文件,看看经过这些步骤以后,shader是如何使用这些数据的:

    复制代码
    const char* cc3D_PositionTex_vert = STRINGIFY(
    
    attribute vec4 a_position;
    attribute vec2 a_texCoord;
    
    varying vec2 TextureCoordOut;
    
    void main(void)
    {
        gl_Position = CC_MVPMatrix * a_position;
        TextureCoordOut = a_texCoord;
        TextureCoordOut.y = 1.0 - TextureCoordOut.y;
    }
    );
    
    const char* cc3D_SkinPositionTex_vert = STRINGIFY(
    attribute vec3 a_position;
    
    attribute vec4 a_blendWeight;
    attribute vec4 a_blendIndex;
    
    attribute vec2 a_texCoord;
    
    const int SKINNING_JOINT_COUNT = 60;
    // Uniforms
    uniform vec4 u_matrixPalette[SKINNING_JOINT_COUNT * 3];
    
    // Varyings
    varying vec2 TextureCoordOut;
    
    vec4 getPosition()
    {   
        // 对该顶点产生作用的第一个块骨骼,所占的权重
        float blendWeight = a_blendWeight[0];
    
        int matrixIndex = int (a_blendIndex[0]) * 3;
        // 对传递进来的matriPalette矩阵乘以该骨骼的权重
        vec4 matrixPalette1 = u_matrixPalette[matrixIndex] * blendWeight;
        vec4 matrixPalette2 = u_matrixPalette[matrixIndex + 1] * blendWeight;
        vec4 matrixPalette3 = u_matrixPalette[matrixIndex + 2] * blendWeight;
        
        
        blendWeight = a_blendWeight[1];
        if (blendWeight > 0.0)
        {
            // 若还有别的骨骼对该顶点产生影响,则进行混合
            matrixIndex = int(a_blendIndex[1]) * 3;
            matrixPalette1 += u_matrixPalette[matrixIndex] * blendWeight;
            matrixPalette2 += u_matrixPalette[matrixIndex + 1] * blendWeight;
            matrixPalette3 += u_matrixPalette[matrixIndex + 2] * blendWeight;
        }
        
        
        blendWeight = a_blendWeight[2];
        if (blendWeight > 0.0)
        {
            matrixIndex = int(a_blendIndex[2]) * 3;
            matrixPalette1 += u_matrixPalette[matrixIndex] * blendWeight;
            matrixPalette2 += u_matrixPalette[matrixIndex + 1] * blendWeight;
            matrixPalette3 += u_matrixPalette[matrixIndex + 2] * blendWeight;
        }
        
        
        blendWeight = a_blendWeight[3];
        if (blendWeight > 0.0)
        {
            matrixIndex = int(a_blendIndex[3]) * 3;
            matrixPalette1 += u_matrixPalette[matrixIndex] * blendWeight;
            matrixPalette2 += u_matrixPalette[matrixIndex + 1] * blendWeight;
            matrixPalette3 += u_matrixPalette[matrixIndex + 2] * blendWeight;
        }
        
    
        vec4 _skinnedPosition;
        vec4 postion = vec4(a_position, 1.0);
        // 使用这个混合后的矩阵,对顶点进行变换,得到该顶点在模型坐标系下的坐标
        _skinnedPosition.x = dot(postion, matrixPalette1);
        _skinnedPosition.y = dot(postion, matrixPalette2);
        _skinnedPosition.z = dot(postion, matrixPalette3);
        _skinnedPosition.w = postion.w;
        
        return _skinnedPosition;
    }
    
    void main()
    {
        // 得到顶点在模型坐标系下的坐标
        vec4 position = getPosition();
        // 使用MVP矩阵进行变换得到最终坐标
        gl_Position = CC_MVPMatrix * position;
        
        TextureCoordOut = a_texCoord;
        TextureCoordOut.y = 1.0 - TextureCoordOut.y;
    }
    
    );
    复制代码

    总结:本文忽略了很多细节,只重点讲解了三个关于骨骼动画原理的部分,希望能对关于这部分有兴趣的朋友有所帮助,也特别希望有前辈能指出问题,或者进行补充。下次有时间我会加上animation部分,谢谢。

    【上文转自】http://www.cocoachina.com/bbs/read.php?tid-295864-page-1.html

    http://www.cocoachina.com 全球最大苹果开发者中文社区

    -----------------------------------------------------------------------------------------------------

    cocos2d-x 开发者文档

    【下文转自】http://cn.cocos2d-x.org/article/index?type=cocos2d-x&url=/doc/cocos-docs-master/manual/framework/native/v3/spine/zh.md

    骨骼动画详解-Spine

    游戏中人物的走动,跑动,攻击等动作是必不可少,实现它们的方法一般采用帧动画或者骨骼动画。

    帧动画与骨骼动画的区别在于:帧动画的每一帧都是角色特定姿势的一个快照,动画的流畅性和平滑效果都取决于帧数的多少。而骨骼动画则是把角色的各部分身体部件图片绑定到一根根互相作用连接的“骨头”上,通过控制这些骨骼的位置、旋转方向和放大缩小而生成的动画。

    它们需要的图片资源各不相同,如下分别是帧动画和骨骼动画所需的资源图:   

    骨骼动画比传统的逐帧动画要求更高的处理器性能,但同时它也具有更多的优势,比如:

    • 更少的美术资源: 骨骼动画的资源是一块块小的角色部件(比如:头、手、胳膊、腰等等),美术再也不用提供每一帧完整的图片了,这无疑节省了资源大小,能为您节省出更多的人力物力更好的投入到游戏开发中去。
    • 更小的体积: 帧动画需要提供每一帧图片。而骨骼动画只需要少量的图片资源,并把骨骼的动画数据保存在一个 json 文件里面(后文会提到),它所占用的空间非常小,并能为你的游戏提供独一无二的动画。
    • 更好的流畅性: 骨骼动画使用差值算法计算中间帧,这能让你的动画总是保持流畅的效果。
    • 装备附件: 图片绑定在骨骼上来实现动画。如果你需要可以方便的更换角色的装备满足不同的需求。甚至改变角色的样貌来达到动画重用的效果。
    • 不同动画可混合使用: 不同的骨骼动画可以被结合到一起。比如一个角色可以转动头部、射击并且同时也在走路。
    • 程序动画: 可以通过代码控制骨骼,比如可以实现跟随鼠标的射击,注视敌人,或者上坡时的身体前倾等效果。

    骨骼动画编辑器——Spine

    Spine是一款针对游戏的2D骨骼动画编辑工具,它具有良好的UI设计和完整的功能,是一个比较成熟的骨骼动画编辑器。Spine旨在提供更高效和简洁的工作流程,以创建游戏所需的动画。

    使用Spine创建骨骼动画分两大步骤:

    1. 在SETUP模式下,组装角色部件,为其绑定骨骼;
    2. 在ANIMATE模式下,基于绑定好的骨骼创建动画。

    下面简单介绍下具体步骤,更多详细内容请查看官方网站教程:Spine快速入门教程

    1)在SETUP模式下,选中Images属性,导入所需图片资源所在文件夹,其中路径名和资源名中不能出现中文,否则解析不了; 

    2)拖动Images下的图片到场景,对角色进行组装(把各个身体部位拼在一起),可通过Draw Order属性调整图片所在层的顺序; 

    3)创建骨骼,并绑定图片到骨骼上,要注意各骨骼的父子关系。 

    4)切换到ANIMATE模式,选中要“动”的骨骼,对其进行旋转、移动、缩放等操作,每次改动后要记得打关键帧。

    5)在菜单栏找到Texture Packer项,对角色纹理进行打包,资源文件后缀为atlas(而非Cocos2d-x常用的plist)。打包后将生成两个文件,即:png 和 atlas。

       

    6)导出动画文件Json。

    Spine动画的使用

    Cocos2d-x程序中,使用Spine动画首先需要包含spine的相关头文件。

    1
    2
    3
    #include <spine/spine-cocos2dx.h>
    #include "spine/spine.h"
    using namespace spine;

    其常用方法如下:

    创建一个Spine动画对象,将动画文件和资源文件导入。

    1
    auto skeletonNode = new SkeletonAnimation("enemy.json", "enemy.atlas");

    骨骼动画往往是不止一个动画的,例如:当人物需要行走时,就设置播放动画为行走;当要发动攻击时,就设置播放动画为攻击。下面方法可以设置当前播放动画,其中参数false表示不循环播放,true表示循环播放。

    1
    skeletonNode->setAnimation(0, "walk", true);

    setAnimation方法只能播放一种动画,所以当要连续播放不同的动画时,需要使用addAnimation方法来实现,它可以一条一条的播放不同的动画。

    1
    2
    skeletonNode->addAnimation(0, "walk", true);
    skeletonNode->addAnimation(0, "attack", false);

    对于一般情况下,动画的切换要求两个动画完全能衔接上,不然会出现跳跃感,这个对于美术来说要求很高,而Spine加了个动画混合的功能来解决这个问题。使得不要求两个动画能完全的衔接上,比如上面的walk和attack动画, 就是衔接不上的,直接按上面的办法播放,会出现跳跃,但是加了混合后,看起来就很自然了。哪怕放慢10倍速度观察,也完美无缺。这个功能在序列帧动画时是无法实现的,也是最体现Spine价值的一个功能。

    1
    2
    skeletonNode->setMix("walk", "attack", 0.2f);
    skeletonNode->setMix("attack", "walk", 0.4f);

    设置动画的播放快慢可通过设置它的timeScale值来实现。

    1
    skeletonNode->timeScale = 0.6f;

    设置是否显示骨骼通过设置debugBones,true表示显示,false表示隐藏。

    1
    skeletonNode->debugBones = true;

    例子:创建一个player行走和攻击的动画, 并且循环播放。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    auto skeletonNode = new SkeletonAnimation("enemy.json", "enemy.atlas");
    skeletonNode->setMix("walk", "attack", 0.2f);
    skeletonNode->setMix("attack", "walk", 0.4f);
     
    skeletonNode->setAnimation(0, "walk", false);
    skeletonNode->setAnimation(0, "attact", false);
    skeletonNode->addAnimation(0, "walk", false);
    skeletonNode->addAnimation(0, "attact", true);
     
    skeletonNode->debugBones = true;
     
    Size windowSize = Director::getInstance()->getWinSize();
    skeletonNode->setPosition(Point(windowSize.width / 2, windowSize.height / 2));
    addChild(skeletonNode);
    效果图: 
    展开全文
  • Cocos Creator模拟砸金蛋3d旋转效果 | 附代码egg.zip // Learn TypeScript: // - [Chinese] https://docs.cocos.com/creator/manual/zh/scripting/typescript.html // - [English] ...
  • cocos creator 牌面翻转

    2019-02-26 09:12:38
    cocos creator 牌面翻转 思路描述 利用方法 var rotationTo = cc.rotateTo(1, 0, 180); this.paiNode.runAction(rotationTo); 进行位置的移动。移动完成之后,Node.setScaleX(-1); 完成翻转。在 update 中...

    cocos creator 牌面翻转


    思路描述

    1、利用方法
    var rotationTo = cc.rotateTo(1, 0, 180);
    this.paiNode.runAction(rotationTo);
    进行位置的移动。移动完成之后,Node.setScaleX(-1); 完成翻转。在 update 中监 Node.rotationY 的值,达到自己要求的时候,更换精灵图片。

    代码块

    paiclick:function(){
    	  this.paiNode.rotationX = 0;
    	  this.paiNode.rotationY = 0;
    	  var rotationTo = cc.rotateTo(1, 0, 180);
    	  this.paiNode.runAction(rotationTo);
    	  this.paiNode.setScaleX(-1);
    },
    update: function (dt) {
       if(this.paiNode.rotationY > 90){
         this.paiNode.getComponent(cc.Sprite).spriteFrame = this.pokerAtlas.getSpriteFrame("c_10");
        }else{
          this.paiNode.getComponent(cc.Sprite).spriteFrame = this.pokerAtlas.getSpriteFrame("back");
        }
    }
    

    2、利用动画编辑器将翻转过程做成序列帧动画,在动画播放完成的时候,将需要的显示出来的实际内容贴图上去

    展开全文
  • cocos2d-x显示3d模型

    2013-06-13 20:49:26
    比如,小场景3d应用(3d立体童话书,3d麻将,3d水果忍者,3d魔方等等),2d地图加入3d 模型的2.5dmmo应用(这个不确定会不会比2d骨骼动画更有表现力或者是开发效率更高),小型3d mmo的开发(比如龙之召唤类卡牌游戏...

    如果cocos2d-x进化成一个2.5d游戏引擎的话,那应该会比现在更加强大。 纯3d的估计不会比Unity做的更好了,但是2.5d的应用还是具有很大的现实意义。

    比如,小场景3d应用(3d立体童话书,3d麻将,3d水果忍者,3d魔方等等),2d地图加入3d 模型的2.5dmmo应用(这个不确定会不会比2d骨骼动画更有表现力或者是开发效率更高),小型3d mmo的开发(比如龙之召唤类卡牌游戏,这些游戏完全没有必要使用Unity),2d游戏加入3d光效(纯2d光效消耗太大,3d光效虽然会增加一些cpu运算,但是极大的降低内存开销---一张贴图和20张图片帧的对比啊)


    这里暂时仅仅完成对md2模型的加载和显示,相比cocos3d它更加简单,与cocos2d-x的系统更加契合,也更加符合我的需求--毕竟我不是拿cocos2d-x做一个3d游戏,而是想3d的一些特殊元素增加2d游戏的表现力(代码取自cocos2d-x的一个3d分支,我抛坟抛出来的...),后期会尝试加入特效系统,主要完成2d游戏中3d光效的播放。(在完成后代码会发布到github,现在先直接贴源代码)


    3d显示代码相对比较多,暂时放到csdn的资源下载里(http://download.csdn.net/detail/langresser/5574973)


    CCNode修改: transform变为虚函数,方便CCSprite3D子类重写

    virtual void transform(void);


    使用:

    CCSprite3D* sprite = CCSprite::create("模型文件", "贴图文件");
    layer->addChild(sprite);
    sprite->runAction(移动、旋转之类的action)




    展开全文
  • Cocos Creator 2.1.1版3d模型导入详细介绍,主要讲解3d基础特性,3d场景操作,3d摄像机属性,3d模型材质贴图设置,动画设置等内容。

    本文假设你是一个新手,按照本文的操作,可以跑起来一个3D人物模型,附带两个跳舞的动画可以欣赏。

    首先说明一点,目前2.1.1的3d功能还不完善,商用项目请不要升级。
    本教程和源码献给先吃螃蟹的同学。

    前言

    昨天我把Cocos Creator最新2.1.1 版的3D demo放出来了,但是官方文档比较欠缺,论坛也缺少相关文档,这里就把过程详细写一下,也算是一个吃螃蟹的新姿势,希望对大家有用。

    3d系统基础

    在 Creator 2.1 版本中,支持了 3D 模型渲染、3D Camera、3D 骨骼动画 等 3D 特性,同时编辑器原生支持解析 FBX 格式的 3D 模型文件,不需要额外的导入流程。
    详细见官方的文档
    下面开始讲解如何导入FBX格式的3D模型。

    FBX模型导入

    这里讲解带贴图,带动作的FBX模型。

    • 在资源管理器新建一个文件夹DanceMode
    • 将贴图文件夹textures和FBX模型文件同时拖入DanceMode目录下
      在这里插入图片描述

    配置模型参数

    • 点击资源管理器里面的模型women,在属性面板设置缩放系数400,点击应用按钮
      在这里插入图片描述
      在这里插入图片描述
    • 点击属性检查器里面的动画菜单,预先计算骨骼矩阵打上勾,点击应用按钮
      在这里插入图片描述
      到这里模型导入,配置完成,现在就可以开始使用了。

    相机分组

    因为要加载3d模型,又有2d的button,所以既有3d,又有2d,需要分组渲染,2d渲染ui,3d相机渲染模型。

    在菜单项目–>项目设置—>分组管理里面新增一个分组ui

    2D相机设置

    将默认层级管理器里面的节点都删掉,保留一个Main Camera。

    • 将Main Camera的Group设置为ui
    • 将Main Camera的Depth设为0,cullingMask勾上ui,clearFlags去掉Color
      在这里插入图片描述

    添加UI节点

    • 添加两个按钮samba和macarena,代码桑巴舞和马卡雷纳舞
    • samba按钮的x位置-400,macarena的x设为400,两个按钮y坐标都为0
    • 给按钮Group设置为ui

    添加3D节点

    • 在层级管理器,添加一个空节点和Canvas平级,命名为root,在属性面板点击3D,这样就变成了一个3D节点
    • 给root节点添加灯光节点,命名为Light
      在这里插入图片描述
    • 在root下添加平台,命名为Plane
      在这里插入图片描述
    • 在root下添加摄像机,命名为3D Camera,在属性面板上点击3D将其变为3d节点
      在这里插入图片描述
    • 将资源管理下的模型文件women,拖入root下,引擎会自动解析模型
      在这里插入图片描述

    设置灯光

    点击Light节点,设置属性说明:

    • Type:光源类型,选这DIRECTIONAL,平行光源
    • Intensity:光照强度
    • Shadow Type:阴影类型,选HARD,硬阴影
    • Shadow Resolution:阴影分辨率,值越大阴影越清晰。在 Shadow Type 不设为 NONE 时生效
    • Shadow Darkness:阴影暗度,值越大阴影越暗。在 Shadow Type 不设为 NONE 时生效
    • Shadow Min Depth:光源产生阴影的最小距离,如果物体跟光源的距离小于最小距离则不会产生阴影。在 Shadow Type 不设为 NONE 时生效
    • Shadow Max Depth:光源产生阴影的最大距离,如果物体跟光源的距离大于最大距离则不会产生阴影。在 Shadow Type 不设为 NONE 时生效
    • Shadow Depth Scale:光源深度缩放值,值越大阴影越暗。在 Shadow Type 不设为 NONE 时生效
    • Shadow Frustum Size:平行光中视锥体的大小,决定平行光产生阴影的范围。仅在 Shadow Type 不设为 NONE,Type 设为 DIRECTIONAL 时生效
      在这里插入图片描述

    设置平台接收阴影

    为了产生阴影,必须设置Plane接受阴影,勾上Receive Shadows
    在这里插入图片描述

    设置3D相机

    3D相机,主要有两个属性要设置

    • cullingMask,只勾选default
    • 取消正交投影,设置视野大小
      在这里插入图片描述

    3D场景编辑器

    点击场景编辑器上面的3D按钮,场景编辑器就切换为3D模式,如下图。
    在这里插入图片描述
    使用alt+左键,就可以改变移动视野,滚轮缩放,右键旋转视角

    设置模型材质

    • 点击模型文件下的材质球,查看属性面板,默认是使用冯氏材质
      在这里插入图片描述
      在这里插入图片描述
    • 设置材质贴图,将对应贴图拖到对应框内,有3个贴图,法线贴图,漫反射贴图,高光贴图
      在这里插入图片描述

    设置模型产生阴影

    • 点击层级管理器里面的节点Kachujin,查看属性面板
      在这里插入图片描述
    • shadow Casting Mode设置为On,这样可以在Plane上看见模型的阴影了
      在这里插入图片描述

    设置相机位置

    • 选中3dCamera节点,可以看到场景中相机有3个轴,拖拉可以改变相机位置
      在这里插入图片描述
    • 选中菜单下面的工具条,第二个旋转工具,摄像机会出现三个带颜色的圆,是用来调整节点3个方向的旋转角的,鼠标放在圆上拖动,就可以改变摄像机的旋转角
      在这里插入图片描述
    • 菜单面板下面,开启游戏预览,可以查看3d预览
      在这里插入图片描述

    播放动画

    • 层级管理器选中模型根节点RootNode,可以看到属性面板有一个Clips数组,将其值改为1
    • 将资源管理器下,模型文件里面的动画资源拖入对应的框,playonload勾上
      在这里插入图片描述
      到这里就操作完了,选择浏览器运行,就能看到人物跳舞的画面了。
      在这里插入图片描述

    增加3D动作

    目前2.1.1版本的动作系统,只有Rotation有了3D的,其他的动作都还没有支持3D,应该在下一个版本支持。我们先试试跳一跳的动作。

    • 增加两个按钮,取名jumpLeft,jumpRight
    • 脚本上增加两个回调,代码如下
        jumpLeft() {
            this.node.runAction(cc.jumpBy(1, -400, 0, 300, 2));
        }
    
        jumpRight() {
            this.node.runAction(cc.jumpBy(1, 400, 0, 300, 2));
        }
    

    效果如下:
    在这里插入图片描述
    源码地址:https://github.com/fylz1125/3Demo
    好了,就写这么多了,欢迎关注我的公众号【Cocos Creator研究笔记】,可以下载最新源码。

    展开全文
  • 骨骼动画原理与Cocos2d骨骼动画 声明:本文使用的是cocos2d-x-3.17的代码 文章中的提到的测试代码下载地址https://gitee.com/Kyle12/Cocos2dRenderStudy 蒙皮骨骼动画 蒙皮骨骼动画可以分为两部分,蒙皮Skinned ...
  • 首先:了解详细情况请看这里:https://github.com/wantnon2/3DToolKit-for-cocos2dx 在看代码之前,不妨先把项目git下来运行一下demo工程:)
  • Cocos2d-x中的3D功能

    2018-07-25 11:59:11
    或许你已经开始接触Cocos2d-x了,并且已经知道它是一个2D游戏引擎。从3.x版本开始,Cocos2d-x已增加并改进了3D功能。3D游戏有着巨大的市场,所以Cocos2d-x中添加了3D开发所需的所有功能。或许3D开发对你来说是个新...
  • Cocos 不算长的生命历程中,我们曾多次尝试给开发者带来 3D 游戏的开发能力:2014 年,我们的 3D 团队开辟了 Cocos2d-x 对 3D 的支持,至今已...
  • (以下内容依据Cocos秋季峰会演讲速记稿整理) 主持人王哲: 前面几个演讲人展示了不同的技术解决方案。 第一种是《三国之刃》用Flash完成所有动画、UI制作,然后用JSFL开发一个Flash扩展来做导出,最后到...
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  • var pic1 = cc.find("Canvas/puke/hu"); var run = cc.callFunc(function() { cc.loader.loadRes("longhu/card", cc.SpriteAtlas, function (err, atlas) { ...
  • 任珊原创,首发于泰然,转载请注明出处 ... 欢迎大家斧正错误,提交PR。 Cocos2d-x官方中文文档 v3.x ...在之前的骨骼动画详解-Spine一文中,我们已经介绍过什么是骨骼动画,骨骼动画
  • ​感谢所有开发者对 Cocos Creator 3D v1.0.0 的支持,我们兴奋地发现发布不到三周,就有几款 3D 小游戏上线了,多少也算验证了我们在工作流效率上所付出的努力。相信目前的 Cocos Creator 3D 对于制作纯 3D 小游戏...
1 2 3 4 5 ... 20
收藏数 2,426
精华内容 970