2d_2d 3d - CSDN
精华内容
参与话题
  • C和python中%d %.2d %2d %02d的区别

    万次阅读 2017-08-21 13:42:01
    %d就是普通的输出了 % 2d是将数字按宽度为2,采用右对齐方式输出,若数据位数不到2位,则左边补空格。 % 02d,和% 2d差不多,只不过左边补0 %.2d从执行效果来看,和% 02d一样

    %d就是普通的输出了

    % 2d是将数字按宽度为2,采用右对齐方式输出,若数据位数不到2位,则左边补空格
    % 02d,和% 2d差不多,只不过左边补0
    %.2d 输出整形时最少输出2位,如不够前面以0占位。如输出2时变成02。200时只输出200;输出浮点型时(%.2f)小数点后强制2位输出

    展开全文
  • Cocos2d开发系列 一

    千次阅读 2018-11-06 12:28:23
    Cocos2d开发系列 一

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

    也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                   

     

    Cocos2d是一个比较流行的iphone游戏开发框架,据说在AppStore 上已有超过 100 个游戏是基亍 Cocos2D-iPhone。其中 3 个由此 迚入过 TOP 10 的排名。其中的 StickWars 更是曾排名第一。现在,让我们来开始Cocos2d的学习之旅吧!

     

    一、安装下载

    Cocos2d下载地址:http://code.google.com/p/cocos2d-iphone/downloads/list

    当前最新版本为1.0。本教程选用的是稳定版本0.99.5。

    下载文件为targ.gz格式,将其解压到某个目录下,打开该目录,找到install-templates.sh文件,这个就是Cocos2d的安装脚本。

    你可以直接在终端里运行这个脚本进行安装,但如果你的Xcode没有安装在默认目录 下,则你需要在命令中添加一个参数。

    例如,你的Mac中可能同时存在一个Xcode版本(3.2.5),安装目录为:/Users/$yourname$/Developer,如果你想将Cocos2d安装到这个Xcode(3.2.5),则需要使用用命令:

    ./install-templates.sh  /Users/$yourname$/Developer

    来进行安装。

    安装完毕,你可以打开Xcode,新建Project,你会在UserTemplates目录下看到多了4个Cocos2d Application模板(如果是0.99版本,则只有3个模板):

     

    二、新建 cocos2dApplications项目

    新建一个cocos2dApplications项目,编译运行效果如下:

     

    打开HelloWorldScene.h,可以看到如下代码:

    #import "cocos2d.h"

     

    // HelloWorld Layer

    @interface HelloWorld : CCLayer

    {

    }

     

    // returns a Scenethat contains the HelloWorld as the only child

    +(id) scene;

     

    @end

    首先,import指令导入了cocos2d.h,在这个.h文件中,已经包含(import)了cocos2d的所有类。因此我们导入了cocos2d.h后,就不需要再一个个导入要用到的cocos2d类了。

    其次,HelloWorldScene.h中定义了一个CCLayer子类。CCLayer即所谓“层”的概念。层是一个容器的概念,cocos2d在层上放置多个动画元素,如文字、标签、图片、菜单,此外层接收触摸和加速器事件。

    第三,定义了一个静态方法,返回了一个——Scene,这个Scene实际上包含了一个层——HelloWorld,这是一个不错的实例化方法。Coco2d中Scene的概念,类似于电影中“场景”的概念--由于受舞台空间或屏幕空间的限制,一个情节往往只能在固定的空间环境中展现,而电影往往是由许多个情节构成, 随着剧情的发展,场景也需要改变,新的场景需要产生。所以电影就会在一幕幕场景中进行切换 ,这种切换被称为“转场”。

     切换到HelloWorldScene.m :

    #import "HelloWorldScene.h"

     

    // HelloWorldimplementation

    @implementation HelloWorld

     

    上面导入了HelloWorldScene.h并实现了HelloWorld类。O-C中,文件名不见得需要和类名一致。

    +(id) scene

    {

    ……

    }

    这个方法就不介绍了,和前面说过的一样。

    -(id) init

    {

    if( (self=[super init] )) {

    CCLabelTTF *label = [CCLabelTTF labelWithString:@"HelloWorld" fontName:@"MarkerFelt" fontSize:64];

     

    CGSize size = [[CCDirector sharedDirector] winSize];

    label.position =  ccp(size.width /2 , size.height/2 );

    [self addChild: label];

    }

    return self;

    }

    init方法中,创建了一个标签 CCLabelTTF (以前是CCLabel)并让他居中。ccp函数是CGPointMake函数的缩写。

     

    接下来,看一下应用程序委托,如果你有过Cocoa编程的经验,那么会发现这就是一个UIApplicationDelegate,它的主要方法是 applicationDidFinishLaunching:(UIApplication*)application :。

    ,并将EAGLView绑定到

    首先取得Director——导演。导演是cocos2d程序的统筹者和协调者,负责整个应用程序的主窗口的创建,以及每个场景在时间线上的先后顺序。

    CCDirector *director = [CCDirector sharedDirector];

    然后创建EAGLView实例。 EAGLView 派生亍类 UIView, 苹果公司用它来实现 OpenGL 输出支持,以支持OpenGLES 编程:

     

    EAGLView *glView = [EAGLView viewWithFrame:[window bounds]

       pixelFormat:kEAGLColorFormatRGB565

       depthFormat:0

    ];

    并将EAGLView绑定到导演的openGLView属性:

    [director setOpenGLView:glView];

    设置横屏:

    setDeviceOrientation:kCCDeviceOrientationLandscapeLeft];

    设置帧间隔(尚未实现):

    [director setAnimationInterval:1.0/60];

    设置帧率显示,即屏幕左下角不断变化的数字:

    [director setDisplayFPS:YES];

    设置渲染格式位32位RGB:

    [CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA8888];

    移除闪屏,即一开始的那个coco2d Logo标志的屏幕:

    [self removeStartupFlicker];

    显示HelloWorld文字标签的场景:

    [[CCDirector sharedDirector] runWithScene: [HelloWorld scene]];

    }

     

     

     

     

     

     

               

    给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

    这里写图片描述
    展开全文
  • C语言中%d %.2d %2d %02d的区别

    万次阅读 多人点赞 2017-10-24 19:25:36
    %d:即为普通的输出。%2d:按宽度为2输出,右对齐方式输出。若不够两位,左边补空格。%02d:同样宽度为2,右对齐方式。位数不够,左边补0。%.2d:从执行效果来看,与%02d一样。

    %d:即为普通的输出。

    图片为转载

    %2d:按宽度为2输出,右对齐方式输出。若不够两位,左边补空格。

    这里写图片描述

    %02d:同样宽度为2,右对齐方式。位数不够,左边补0。

    这里写图片描述

    %.2d:从执行效果来看,与%02d一样。

    这里写图片描述

    展开全文
  • 二次元日系游戏制作工具 - live2dSDK入门教程

    万次阅读 多人点赞 2019-04-11 21:15:58
    1.Live2d的sdk接入与素材模型的导入 导入该素材模型和Live2d的sdk Live2D模型制作到显示的基本流程: 1.初始化模型。 1.制作模型(读取moc文件)。 2.与贴图建立关联。 3.与绘图环境建立链接。...

    1.Live2d的sdk接入与素材模型的导入

    导入该素材模型和Live2d的sdk

    Live2D模型制作到显示的基本流程:

    1.初始化模型。
        
        1.制作模型(读取moc文件)。
        
        2.与贴图建立关联。
        
        3.与绘图环境建立链接。(有些平台不需要)。

        4.制定显示位置与尺寸。

    2.更新模型状态。

        1.更新顶点。

        2.绘图。

    Live2d虚拟环境的初始化与模型读取的第一种方法

    	void Start () {
    
            //初始化
            Live2D.init();
    
            //释放
            //Live2D.dispose();
    
            //读取模型
            Live2DModelUnity.loadModel(Application.dataPath + "/Resources/Epsilon/runtime/Epsilon.moc");
    	}

    以二进制形式去读取模型

    现将素材的.moc文件添加后缀为.moc.bytes,然后在输入下面的代码

            TextAsset mocFile = Resources.Load<TextAsset>("Epsilon/runtime/Epsilon.moc");
            Live2DModelUnity.loadModel(mocFile.bytes);

    模型与贴图建立关联(单张贴图)

            //与贴图建立关联
            Texture2D texture2D = Resources.Load<Texture2D>("");
            live2DModel.setTexture(0,texture2D);

    多张贴图的设置方法

            //与多张贴图建立关联
            Texture2D texture2D1 = Resources.Load<Texture2D>("Epsilon/runtime/Epsilon.1024/texture_00");
            Texture2D texture2D2 = Resources.Load<Texture2D>("Epsilon/runtime/Epsilon.1024/texture_01");
            Texture2D texture2D3 = Resources.Load<Texture2D>("Epsilon/runtime/Epsilon.1024/texture_02");
            live2DModel.setTexture(0, texture2D1);
            live2DModel.setTexture(1, texture2D2);
            live2DModel.setTexture(2, texture2D2);

    创建负责渲染Live2dCanvas的4乘4矩阵与赋值

     private Live2DModelUnity live2DModel;
    
     //制定显示位置与尺寸
     float modelWidth = live2DModel.getCanvasWidth();
    
     live2DCanvansPos = Matrix4x4.Ortho(0, modelWidth, modelWidth, 0, -50, 50);

    给模型设置显示矩阵与更新和绘图的方法使用

    在Update添加更新顶点的代码以及添加OnRenderObject的方法

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using live2d;
    
    public class Live2dModel : MonoBehaviour {
    
        public TextAsset modelFile;
        public Texture2D[] textures;
    
        private Live2DModelUnity live2DModel;
    
        private Matrix4x4 live2DCanvansPos;
    	
    	void Start () {
    
            //初始化
            Live2D.init();
    
            //释放
            //Live2D.dispose();
    
            //读取模型
            //Live2DModelUnity.loadModel(Application.dataPath + "/Resources/Epsilon/runtime/Epsilon.moc");
            //TextAsset mocFile = Resources.Load<TextAsset>("Epsilon/runtime/Epsilon.moc");
    
            live2DModel = Live2DModelUnity.loadModel(modelFile.bytes);
    
            //与贴图建立关联
            //Texture2D texture2D = Resources.Load<Texture2D>("");
            //live2DModel.setTexture(0,texture2D);
    
            //与多张贴图建立关联
            //Texture2D texture2D1 = Resources.Load<Texture2D>("Epsilon/runtime/Epsilon.1024/texture_00");
            //Texture2D texture2D2 = Resources.Load<Texture2D>("Epsilon/runtime/Epsilon.1024/texture_01");
            //Texture2D texture2D3 = Resources.Load<Texture2D>("Epsilon/runtime/Epsilon.1024/texture_02");
            //live2DModel.setTexture(0, texture2D1);
            //live2DModel.setTexture(1, texture2D2);
            //live2DModel.setTexture(2, texture2D2);
            for (int i = 0; i < textures.Length; i++)
            {
                live2DModel.setTexture(i, textures[i]);
            }
    
            //制定显示位置与尺寸
            float modelWidth = live2DModel.getCanvasWidth();
    
            live2DCanvansPos = Matrix4x4.Ortho(0, modelWidth, modelWidth, 0, -50, 50);      
        }
    	
    	
    	void Update ()
        {
            live2DModel.setMatrix(transform.localToWorldMatrix * live2DCanvansPos);
            //更新顶点
            live2DModel.update();
        }
    
        private void OnRenderObject()
        {
            live2DModel.draw();
        }
    }
    

    运行程序,结果如下:

    动作文件的加载与动作对象的实例化

    两种实例化对象动作的方式,与模型的读取操作一样

            //实例化动作对象
            live2DMotionIdle = Live2DMotion.loadMotion(Application.dataPath + "");
    
            TextAsset mtnFile = Resources.Load<TextAsset>("");
            live2DMotionIdle = Live2DMotion.loadMotion(mtnFile.bytes);

    动作属性的设置与动作管理的实例化

    首先将动作属性进行导入

        public TextAsset[] motionFile;
    
        private Live2DMotion[] motions;
    
             motions = new Live2DMotion[motionFile.Length];
            for (int i = 0; i < motions.Length; i++)
            {
                motions[i] = Live2DMotion.loadMotion(motionFile[i].bytes);
            }

    对某一动作属性进行设置

            //设置某一个动画的一些属性
            //重复播放不淡入
            motions[0].setLoopFadeIn(false);
            //设置淡入淡出时间,参数单位为毫秒
            motions[0].setFadeOut(1000);
            motions[0].setFadeIn(1000);
            //动画是否循环播放
            motions[0].setLoop(true);

    创建一个MotionQueueManager对motions进行管理

    private MotionQueueManager motionQueueManager;
    
    
            motionQueueManager = new MotionQueueManager();
            motionQueueManager.startMotion(motions[0]);

    动作的播放

    按下M键可以改变人物的动作播放,将动作拖入Unity时也需要将动作的mtn文件修改为mtn.bytes。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using live2d;
    
    public class Live2dModel : MonoBehaviour {
    
        //模型
        public TextAsset modelFile;
        public Texture2D[] textures;
        private Live2DModelUnity live2DModel;
        private Matrix4x4 live2DCanvansPos;
    
        //动作
        public TextAsset[] motionFile;
        private Live2DMotion[] motions;
        private MotionQueueManager motionQueueManager;
    
        public int motionIndex;
    
        //private Live2DMotion live2DMotionIdle;
    	
    	void Start () {
    
            //初始化
            Live2D.init();
    
            //释放
            //Live2D.dispose();
    
            //读取模型
            //Live2DModelUnity.loadModel(Application.dataPath + "/Resources/Epsilon/runtime/Epsilon.moc");
            //TextAsset mocFile = Resources.Load<TextAsset>("Epsilon/runtime/Epsilon.moc");
    
            live2DModel = Live2DModelUnity.loadModel(modelFile.bytes);
    
            //与贴图建立关联
            //Texture2D texture2D = Resources.Load<Texture2D>("");
            //live2DModel.setTexture(0,texture2D);
    
            //与多张贴图建立关联
            //Texture2D texture2D1 = Resources.Load<Texture2D>("Epsilon/runtime/Epsilon.1024/texture_00");
            //Texture2D texture2D2 = Resources.Load<Texture2D>("Epsilon/runtime/Epsilon.1024/texture_01");
            //Texture2D texture2D3 = Resources.Load<Texture2D>("Epsilon/runtime/Epsilon.1024/texture_02");
            //live2DModel.setTexture(0, texture2D1);
            //live2DModel.setTexture(1, texture2D2);
            //live2DModel.setTexture(2, texture2D2);
            for (int i = 0; i < textures.Length; i++)
            {
                live2DModel.setTexture(i, textures[i]);
            }
    
            //制定显示位置与尺寸
            float modelWidth = live2DModel.getCanvasWidth();
            live2DCanvansPos = Matrix4x4.Ortho(0, modelWidth, modelWidth, 0, -50, 50);
    
            //播放动作
            //实例化动作对象
            //live2DMotionIdle = Live2DMotion.loadMotion(Application.dataPath + "");
    
            //TextAsset mtnFile = Resources.Load<TextAsset>("");
            //live2DMotionIdle = Live2DMotion.loadMotion(mtnFile.bytes);
            motions = new Live2DMotion[motionFile.Length];
            for (int i = 0; i < motions.Length; i++)
            {
                motions[i] = Live2DMotion.loadMotion(motionFile[i].bytes);
            }
    
            //设置某一个动画的一些属性
            //重复播放不淡入
            motions[0].setLoopFadeIn(false);
            //设置淡入淡出时间,参数单位为毫秒
            motions[0].setFadeOut(1000);
            motions[0].setFadeIn(1000);
            //动画是否循环播放
            motions[0].setLoop(true);
    
            motionQueueManager = new MotionQueueManager();
            motionQueueManager.startMotion(motions[0]);
        }
    	
    	
    	void Update ()
        {
            live2DModel.setMatrix(transform.localToWorldMatrix * live2DCanvansPos);
    
            if (Input.GetKeyDown(KeyCode.M))
            {
                motionIndex++;
                if (motionIndex >= motions.Length)
                {
                    motionIndex = 0;
                }
                motionQueueManager.startMotion(motions[motionIndex]);
            }
    
            //指定播放动作的模型
            motionQueueManager.updateParam(live2DModel);
    
            //更新顶点
            live2DModel.update();
        }
    
        private void OnRenderObject()
        {
            live2DModel.draw();
        }
    }
    

    多个动作的同时播放

    多个动作同时播放只需要多创建一个MotionQueueManger来进行管理

    private MotionQueueManager motionQueueManager;
    
    private MotionQueueManager motionQueueManagerA;
    
            motions[0].setLoop(true);
    
            motionQueueManager = new MotionQueueManager();
            motionQueueManager.startMotion(motions[0]);
    
            motions[5].setLoop(true);
    
            motionQueueManagerA = new MotionQueueManager();
            motionQueueManagerA.startMotion(motions[5]);
    
            motionQueueManager.updateParam(live2DModel);
            motionQueueManagerA.updateParam(live2DModel);

    动作的优先级概念与设置标准

    使用L2DMotionManager来对行为优先级进行管理

        private L2DMotionManager l2DMotionManager;
        //优先级的设置标准“
        //1.动作未进行的状态,优先级为0;
        //2.待机动作发生时,优先级为1;
        //3.其他动作进行时,优先级为2;
        //4.无视优先级,强制发生动作,优先级为3

    动作优先级的代码实现

    首先在Start里面进行L2DMotionManager的初始化

    l2DMotionManager = new L2DMotionManager();

    然后写一个通过优先级播放动作的方法StartMotion

        private void StartMotion(int motionIndex,int priority)
        {
            if (l2DMotionManager.getCurrentPriority() >= priority)
            {
                return;
            }
            else
            {
                l2DMotionManager.startMotion(motions[motionIndex]);
            }
        }

    在Update里面进行使用调用

            //判断待机动作
            if (l2DMotionManager.isFinished())
            {
                StartMotion(0, 1);
            }
            else if (Input.GetKeyDown(KeyCode.M))
            {
                StartMotion(14, 2);
            }
    
            l2DMotionManager.updateParam(live2DModel);

    开始时处于Idle状态,按下M后会变成摇头不高兴,播放完自己又会变成Idle

    设置参数的方法

    首先根据Epsilon.cmox文件把需要设置参数的id取出来,如图所示,取到角度X的id为PARAM_ANGLE_X

    然后在Update里面添加下面的代码进行参数设置,第一个是id,第二个是需要设置的值,第三个是权重。

            //设置参数
            live2DModel.setParamFloat("PARAM_ANGLE_X", 30, 1);

    参数的累加与扩大倍数的方法

            //设置参数
            live2DModel.setParamFloat("PARAM_ANGLE_X", 30, 1);
            //累加参数数值,一次增加10度
            live2DModel.addToParamFloat("PARAM_ANGLE_X", 10);
            //乘法设置参数
            live2DModel.multParamFloat("PARAM_ANGLE_X", 10);

    通过索引获取参数并设置与参数的保存和回复

    通过索引获取参数

            //第二种设置参数的办法,通过索引去设置
            int paramAngleX;
            paramAngleX = live2DModel.getParamIndex("PARAM_ANGLE_X");
            live2DModel.setParamFloat(paramAngleX, 30);

    参数的保存和回复

            参数的保存与回复
            live2DModel.setParamFloat("PARAM_ANGLE_X", 30);
            保存与回复的参数是整个模型的所有参数,并不只是之前同方法里设置的几个参数
            live2DModel.saveParam();
            live2DModel.loadParam();

    不透明度的设置与自动眨眼功能

    不透明度的设置,需要设置的是模型的part部分

            //设定模型某一部分的透明度
            live2DModel.setPartsOpacity("PARTS_01_FACE_001", 0);

    眨眼功能的实现,首先定义一个EyeBlinkMotion的类

    private EyeBlinkMotion eyeBlinkMotion;

    然后在Start方法里进行初始化

            //眨眼
            eyeBlinkMotion = new EyeBlinkMotion();

    在Update方法里面进行调用

            //眨眼
            eyeBlinkMotion.setParam(live2DModel);

    拖拽激发的动作

    拖拽功能的实现,首先定义一个L2DTargetPoint的类

        //鼠标拖拽引起的动作变化
        private L2DTargetPoint drag;

    然后在Start方法里进行初始化

            //鼠标拖拽
            drag = new L2DTargetPoint();

    在Update方法里面进行调用

            //模型跟随鼠标转向与看向
            Vector3 pos = Input.mousePosition;
            if (Input.GetMouseButton(0))
            {
                //把屏幕坐标转换成live2D检测的坐标
                drag.Set(pos.x / Screen.width * 2 - 1, pos.y / Screen.height * 2 - 1);
            }

    关于L2DTargetPoint获取坐标点的详细讲解

            //模型跟随鼠标转向与看向
            //得到的live2d鼠标检测点的比例值是-1到1(对应一个live2d拖拽
            //管理坐标系,或者叫做影响度)。
            //然后通过这个值去设置我们的参数,比如旋转30度*当前得到的值
            //就会按照这个值所带来的影响度去影响我们的模型动作
            //从而到达看向某一个点的位置

    公式的验证与理解

    实现模型跟随鼠标转向与看向的功能

    在Update里面添加代码

            Vector3 pos = Input.mousePosition;
            if (Input.GetMouseButton(0))
            {
                //把屏幕坐标转换成live2D检测的坐标
                drag.Set(pos.x / Screen.width * 2 - 1, pos.y / Screen.height * 2 - 1);
            }
            else if (Input.GetMouseButtonUp(0))
            {
                drag.Set(0, 0);
            }
    
            //参数及时更新,考虑加速度等自然因素,计算坐标,进行逐帧更新
            drag.update();
    
            //模型的转向
            if(drag.getX()!=0)
            {
                live2DModel.setParamFloat("PARAM_ANGLE_X", 30 * drag.getX());
                live2DModel.setParamFloat("PARAM_ANGLE_Y", 30 * drag.getY());
    
                live2DModel.setParamFloat("PARAM_BODY_ANGLE_X", 10 * drag.getX());
                //眼睛跟随鼠标移动
                //live2DModel.setParamFloat("PARAM_EYE_BALL_X", drag.getX());
                //live2DModel.setParamFloat("PARAM_EYE_BALL_Y", drag.getY());
                //眼睛只望向前方
                live2DModel.setParamFloat("PARAM_EYE_BALL_X", -drag.getX());
                live2DModel.setParamFloat("PARAM_EYE_BALL_Y", -drag.getY());
            }

    眼睛跟随鼠标移动

    眼睛只望向前方

    套用物理运算去设置头发的长度重量与收到的空气阻力

    头发摇摆功能的实现,首先定义一个PhysicsHair的类

        //物理运算的设定(本模型头发只有两侧和后侧)
        private PhysicsHair physicsHairSide;
        private PhysicsHair physicsHairBack;

    然后在Start方法里进行初始化和设置

            //头发的摇摆
            physicsHairSide = new PhysicsHair();
            physicsHairBack = new PhysicsHair();
            //套用物理运算
            //第一个参数是长度 单位是公尺 影响摇摆的快慢(周期)
            //第二个参数是空气阻力
            //第三参数是头发的重量
            physicsHairSide.setup(0.2f, 0.5f, 0.14f);

    设置影响头发的输入参数

     

            //设置输入参数
            //社会哪一个部分变动时进行哪一种物理运算
            PhysicsHair.Src srcX = PhysicsHair.Src.SRC_TO_X;//横向摇摆
            //第三个参数,"PARAM_ANGLE_X"变动时头发受到0.005倍影响度的输入参数
            physicsHairSide.addSrcParam(srcX, "PARAM_ANGLE_X", 0.005f, 1);

    设置头发的输出表现

    因为该模型头发有两边,所以我们将之前设置的Hair都分成两个,为Left和Right。

            //设置输出表现
            PhysicsHair.Target targetLeft = PhysicsHair.Target.TARGET_FROM_ANGLE;//表现形式
            PhysicsHair.Target targetRight = PhysicsHair.Target.TARGET_FROM_ANGLE;
    
            physicsHairSideLeft.addTargetParam(targetLeft, "PARAM_HAIR_SIDE_L", 0.005f, 1);
            physicsHairSideRight.addTargetParam(targetRight, "PARAM_HAIR_SIDE_R", 0.005f, 1);

    两边头发的横向摇摆效果

    在Update里面进行调用

            //头发摇摆
            long time = UtSystem.getUserTimeMSec();//获取执行时间
            physicsHairSideLeft.update(live2DModel, time);
            physicsHairSideRight.update(live2DModel, time);

    设置后边左边头发的摇摆效果

    在Start里面添加下面的代码

            //左边的头发
            physicsHairBackLeft = new PhysicsHair();
            physicsHairBackLeft.setup(0.24f, 0.5f, 0.18f);
            PhysicsHair.Src srcXBackLeft = PhysicsHair.Src.SRC_TO_X;
            PhysicsHair.Src srcZBackLeft = PhysicsHair.Src.SRC_TO_G_ANGLE;
    
            physicsHairBackLeft.addSrcParam(srcXBackLeft, "PARAM_ANGLE_X", 0.005f, 1);
            physicsHairBackLeft.addSrcParam(srcZBackLeft, "PARAM_ANGLE_Z", 0.8f, 1);
    
            PhysicsHair.Target targetBackLeft = PhysicsHair.Target.TARGET_FROM_ANGLE;
            physicsHairBackLeft.addTargetParam(targetBackLeft, "PARAM_HAIR_BACK_L", 0.005f, 1);
    
            //右边的头发
            physicsHairBackRight = new PhysicsHair();
            physicsHairBackRight.setup(0.24f, 0.5f, 0.18f);
            PhysicsHair.Src srcXBackRight = PhysicsHair.Src.SRC_TO_X;
            PhysicsHair.Src srcZBackRight = PhysicsHair.Src.SRC_TO_G_ANGLE;
    
            physicsHairBackRight.addSrcParam(srcXBackRight, "PARAM_ANGLE_X", 0.005f, 1);
            physicsHairBackRight.addSrcParam(srcZBackRight, "PARAM_ANGLE_Z", 0.8f, 1);
    
            PhysicsHair.Target targetBackRight = PhysicsHair.Target.TARGET_FROM_ANGLE;
            physicsHairBackRight.addTargetParam(targetBackRight, "PARAM_HAIR_BACK_R", 0.005f, 1);

    在Update里面添加下面的代码

            physicsHairBackLeft.update(live2DModel, time);
            physicsHairBackRight.update(live2DModel, time);

    Live2d中的表情系统

    首先定义三个变量

        //表情
        public TextAsset[] expressionFile;
        public L2DExpressionMotion[] expressions;
        private MotionQueueManager expressionMotionQueueManager;

    在Start里面进行初始化

            //表情
            expressionMotionQueueManager = new MotionQueueManager();
            expressions = new L2DExpressionMotion[expressionFile.Length];
            for (int i = 0; i < expressions.Length; i++)
            {
                expressions[i] = L2DExpressionMotion.loadJson(expressionFile[i].bytes);
            }

    表情的播放

    Update里面添加播放表情的代码,与播放动作的代码相似

            //播放表情
            if (Input.GetKeyDown(KeyCode.M))
            {
                motionIndex++;
                if (motionIndex >= expressions.Length)
                {
                    motionIndex = 0;
                }
                expressionMotionQueueManager.startMotion(expressions[motionIndex]);
            }

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • print('{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x))问题{0:2d} {1:3d} {2:4d}是什么意思?解答format()函数字符串的参数使用{NUM}进行表示,0, 表示第一个参数,1, 表示第二个参数, 以后顺次递加;这里面:{0:2d} ...
  • c语言,%d %.2d %2d %02d的区别

    万次阅读 2014-06-03 11:34:08
    %d就是普通的输出了 %2d是将数字按宽度为2,采用右对齐方式输出,若数据位数不到2位,则左边补空格 %02d,和%2d差不多,只不过左边补0 %.2d没见过,但从执行效果来看,和%02d一样
  • 输出printf 时 %2d,%d,%02d,%.2d

    千次阅读 2017-02-14 10:04:43
    C语言中%d %.2d %2d %02d的区别   %d就是普通的输出了 %.2d %2d %02d的区别" title="[原创]--C语言中%d %.2d %2d %02d的区别" style="margin:0px; padding:0px; border:0px; list-style:none"> ...
  • Steam平台3款2D游戏开发软件对比(转)

    千次阅读 2017-11-04 21:56:10
    无意中看到steam平台。知道这个平台上有很多游戏,第一次接触这个平台是在Dota2...想必这几个工具一定要比写C++代码的cocos2d-x好用很多。这些年,一直在从事cocos2d-x引擎的游戏开发。除了U3d和UE4之外,很少接触到
  • C语言中%d %.2d %2d %02d的区别

    万次阅读 2017-09-06 09:36:21
    1、%d就是普通的输出了 2、% 2d是将数字按宽度为2,采用右对齐方式输出,若数据位数不到2位,则左边补空格。如下: 3、% 02d,和% 2d差不多,只不过左边补0 4、%.2d从执行效果来看,和% 02d一样
  • 2D游戏触发器和碰撞器举例
  • Hexo添加Live2D看板娘+模型预览

    万次阅读 2019-02-13 15:02:19
    文章目录添加和注意事项模型预览live2d-widget-model-chitoselive2d-widget-model-epsilon2_1live2d-widget-model-gflive2d-widget-model-haru_01live2d-widget-model-haru_02live2d-widget-model-harutolive2d-...
  • 使用librtmp的编码器(推流到rtmp服务器),以及基于librtmp服务器(接受rtmp流),都会遇到大约4.6小时就断开连接的问题。 原因在于adobe对于chunk type = 3的包,标准文档说明是不发extended timestamp,但是...
  • cv2.xfeatures2d 找不到 Opencv 3.0 - module object has no attribute ‘xfeatures2d’ 本人使用环境:OpenCV 3.4.0 Python3.5 cv2._ _ version _ _ 查看opencv版本号 开始安装opencv是通过: sudo python3...
  • 在Hexo博客上添加可爱的Live 2D模型

    万次阅读 2018-09-15 23:11:45
    在查找资料的偶然间,我发现一个博客上有非常可爱的Live 2D模型,当时我就被打动了,马上开启审查元素,试图找出这个Live 2D模型的信息,可是找了半天没找到。最后通过截图-&gt;谷歌图片的方式,终于一层一层的...
  • xfeatures2d 在opencv 不能用问题

    万次阅读 2018-09-04 18:33:13
    xfeatures2d 目前在opencv-contrib可以使用,解决方法: pip uninstall opencv-python pip install opencv-contrib-python
  • Unity性能优化——Rigidbody2D详解

    万次阅读 多人点赞 2018-10-25 18:47:02
    在移动或旋转一个物体时,往往会直接使用Transform来执行这些操作。比如使用如下代码来移动一个GameObject: void Update(){ ... this.transform.Translate (Vector3.left * speed * Time.deltaTime);...
  • Unity2018新功能之2D Animation2D动画

    万次阅读 2018-07-21 15:21:49
    新版本中引入不少2D的新功能,我们打开资源包管理器,可以看到2D Animation,2D IK,2D Pixel Perfect,2D SpriteShape等等。 我们先来讲讲2D Animation的功能。 2D Animation的安装 点击菜单Window &gt; ...
  • 卷积神经网络(conv2d参数含义、卷积层、池化层)

    万次阅读 多人点赞 2019-08-28 09:43:29
    本文转载自 罗翌新:中科大数学博士,深度学习医学应用专家; 廖星宇:中科大硕士,...一、tf.nn.conv2d()卷积函数各参数解析 二、卷积例子 三、池化函数tf.nn.max_pool()函数解析 ...
  • C语言里面%2d 意思

    万次阅读 多人点赞 2011-08-05 15:09:37
    看看下面的说明就知道啦:修饰符 格式说明 意义 int a=1;int b=1234;double c=1.2345678;printf("%2d ",a);printf("%+2d ",a);printf("%4d ",a);printf("%2d ",b);printf("%+2d ",b);printf("%4d ",b);printf("%
  • Pytorch——conv2d参数使用

    万次阅读 2019-05-16 16:06:48
    记录下常用参数使用,方便查阅 ...torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros') 输入输出的格式: input(N,C-in,H-...
1 2 3 4 5 ... 20
收藏数 531,489
精华内容 212,595
关键字:

2d