★お知らせ(2023/12/27)
いつもLive2D公式コミュニティをご利用いただき誠にありがとうございます。
本コミュニティは2023年12月27日 11:00をもって閉鎖いたしました。
今後の運営はすべて新Live2D公式クリエイターズフォーラムに移行します。
閉鎖に伴い、以下機能は利用不可となります。
・アカウントの新規作成
・トピック投稿、返信
たくさんのご利用誠にありがとうございました。

新Live2D公式クリエイターズフォーラムは以下バナーよりご利用いただけます。
Live2D公式クリエイターズフォーラム

なお、本コミュニティに投稿されたトピックはすべて残りますが、今後削除する可能性がございますので予めご了承ください。
閉鎖に関するお問い合わせにつきましてはLive2D公式クリエイターズフォーラムへご連絡ください。

cocos2dx 3.9 mtnファイルの読み込みでエラー「file open error」

編集済: 3月 2016 Cubism SDK 2.1
初めて投稿させて頂きます
==========================================
制作環境:mac OSX El Capitan
cocos2dxバージョン:3.9
live2dSDKバージョン:Live2D_SDK_OpenGL_2.0.08_2_jp
==========================================

任意のモーションを再生させようと、mtnファイルを読み込んで再生させようとしています。
素材は「Epsilon」を使用し、Resouce直下に「live2d」ディレクトリを作り、その中にファイルが存在しています。
参考サイトを元に下記のように記述しました。

Live2DMotion* motion = Live2DMotion::loadMotion("live2d/epsilon/motions/Epsilon_m_05.mtn");
MotionQueueManager* motionManager = new MotionQueueManager();//モーション管理クラスの作成
motionManager->startMotion( motion, false );//モーションの再生
motionManager->updateParam( live2DModel );//モーションの更新

ところが
file open error live2d/epsilon/motions/Epsilon_m_05.mtn!!
とエラーが出てしまいます。

cocos2dx初心者、live2dも初心者で、至らないところだらけなのですが
同じようなエラーを検索出来なかった為に投稿させて頂きます。
ご教示頂ければ幸いです。


コメント

  • @satochi さん

    loadMotionの引数はファイルパスではなく、FileUtils::getInstance()->getFileDataの返り値かと思います。
    以下にソースをつけたので参考にしてみて下さい。

    SampleLive2DSprite.h
    #ifndef __sampleCocos2dx__SampleLive2DSprite__
    #define __sampleCocos2dx__SampleLive2DSprite__

    #include "cocos2d.h"
    #include "2d/CCSprite.h"
    #include
    #include "Live2DModelOpenGL.h"
    #include "motion/Live2DMotion.h"
    #include "motion/MotionQueueManager.h"


    class SampleLive2DSprite :public cocos2d::DrawNode {

    live2d::Live2DModelOpenGL* live2DModel ;
    live2d::MotionQueueManager* motionManager; // モーションマネジャー
    std::vector textures ;

    public:
    SampleLive2DSprite();
    virtual ~SampleLive2DSprite();

    virtual void draw(cocos2d::Renderer *renderer, const cocos2d::Mat4 &transform, uint32_t flags) override;
    void onDraw(const cocos2d::Mat4 &transform, uint32_t flags);
    static SampleLive2DSprite* createDrawNode();
    protected:
    cocos2d::CustomCommand _customCommand;
    };

    #endif /* defined(__sampleCocos2dx__SampleLive2DSprite__) */


    SampleLive2DSprite.cpp

    #include "SampleLive2DSprite.h"
    #include "base/CCDirector.h"
    #include "util/UtSystem.h"

    #include "graphics/DrawProfileCocos2D.h"
    #include "platform/CCFileUtils.h"

    using namespace live2d;
    USING_NS_CC;
    const char* TEXTURES[] ={
    "haru/haru_02.1024/texture_00.png" ,
    "haru/haru_02.1024/texture_01.png" ,
    "haru/haru_02.1024/texture_02.png" ,
    NULL
    };

    AMotion* motion; // モーション

    SampleLive2DSprite::SampleLive2DSprite()
    {
    //Live2D Sample
    const char* MODEL = "haru/haru_02.moc" ;
    unsigned char* buf;
    ssize_t bufSize;
    buf = FileUtils::getInstance()->getFileData(MODEL,"rb", &bufSize);
    // mocロード
    live2DModel = Live2DModelOpenGL::loadModel( buf,bufSize ) ;
    free(buf);

    // Textureロード
    for( int i = 0 ; TEXTURES[i] != NULL ; i++ ){
    auto texture =Director::getInstance()->getTextureCache()->addImage(std::string(TEXTURES[i]));
    Texture2D::TexParams texParams = { GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE };
    texture->setTexParameters(texParams);
    texture->generateMipmap();

    int glTexNo = texture->getName() ;

    live2DModel->setTexture( i , glTexNo ) ;// テクスチャとモデルを結びつける
    textures.push_back( texture ) ;
    }

    // Motionロード
    const char* MOTION = "haru/motions/tapBody_00.mtn";
    unsigned char* motionbuf;
    ssize_t MotionSize;
    motionbuf = FileUtils::getInstance()->getFileData(MOTION,"rb", &MotionSize);
    motion=Live2DMotion::loadMotion(motionbuf,(int)MotionSize);
    motionManager = new MotionQueueManager();

    // Live2Dモデルはローカル座標で左上を原点にして(CanvasWidth、CanvasWidth)
    // のサイズになるため、以下のようにして調整してください。
    float w = Director::getInstance()->getWinSize().width;
    float h = Director::getInstance()->getWinSize().height;
    float scx = 2.0 / live2DModel->getCanvasWidth() ;
    float scy = -2.0 / live2DModel->getCanvasWidth() * (w/h);
    float x = -1 ;
    float y = 1 ;
    float matrix []= {
    scx , 0 , 0 , 0 ,
    0 , scy ,0 , 0 ,
    0 , 0 , 1 , 0 ,
    x , y , 0 , 1
    } ;

    live2DModel->setMatrix(matrix) ;// 位置を設定

    }

    SampleLive2DSprite::~SampleLive2DSprite()
    {
    delete live2DModel;
    // テクスチャを解放
    Director::getInstance()->getTextureCache()->removeTextureForKey(std::string(TEXTURES[0]));
    Director::getInstance()->getTextureCache()->removeTextureForKey(std::string(TEXTURES[1]));
    Director::getInstance()->getTextureCache()->removeTextureForKey(std::string(TEXTURES[2]));

    }


    void SampleLive2DSprite::draw(cocos2d::Renderer *renderer, const cocos2d::Mat4 &transform, uint32_t flags)
    {
    DrawNode::draw(renderer, transform, flags);

    _customCommand.init(_globalZOrder);
    _customCommand.func = CC_CALLBACK_0(SampleLive2DSprite::onDraw, this, transform, flags);
    renderer->addCommand(&_customCommand);
    }

    void SampleLive2DSprite::onDraw(const cocos2d::Mat4 &transform, uint32_t flags)
    {
    kmGLPushMatrix();
    kmGLLoadMatrix(&transform);

    // モーションが終了した場合
    if(motionManager->isFinished())
    {
    // モーションをスタート
    motionManager->startMotion(motion, false);
    }
    // モーションのパラメーターを更新
    motionManager->updateParam(live2DModel);

    // Live2Dの描画前と描画後に以下の関数を呼んでください
    // live2d::DrawProfileCocos2D::preDraw() ;
    // live2d::DrawProfileCocos2D::postDraw() ;
    // これはOpenGLの状態をもとに戻すための処理です。
    // これを行わない場合、Cocos2DかLive2Dどちらかで状態の不整合が起こります。
    live2d::DrawProfileCocos2D::preDraw();

    live2DModel->update() ;
    live2DModel->draw() ;

    live2d::DrawProfileCocos2D::postDraw() ;

    kmGLPopMatrix();
    }

    SampleLive2DSprite* SampleLive2DSprite::createDrawNode()
    {
    SampleLive2DSprite *ret = new SampleLive2DSprite();
    if (ret && ret->init())
    {
    ret->autorelease();
    return ret;
    }
    else
    {
    CC_SAFE_DELETE(ret);
    return nullptr;
    }
    }


    cocos2dxのver3.5で確認していますが、3.9でもほぼ同様に動くかと思います。


    これで解決しない場合は過去に類似したスレッドがあったので、こちらの設定を確認してみて下さい。

    Cocos2d-xのサンプルコードのモデル表示について

  • naotaro様

    返信ありがとうございます
    添付して頂いたソースを元に試してみます。
    今日中に返信出来ないかもしれませんが、
    動作確認をして、またコメントさせて頂きます。

  • naotaro様

    先ほど添付して頂いたソースを元にテストしてみたところ、正常に動作いたしました。
    startMotionもupdateParamも「onDraw」の内部でやるのですね、、、
    恥ずかしいソースを失礼いたしました。。

    また投稿させて頂くこともあると思いますが、
    その時はまたよろしくお願いします。
    もう少しまともな質問が出来るようがんばります。

    ありがとうございました。
  • いえいえ、解決してよかったです。
    またなんなりと質問して頂けたらと思います
コメントするにはサインインまたは登録して下さい。