★お知らせ(2023/12/27)
いつもLive2D公式コミュニティをご利用いただき誠にありがとうございます。
本コミュニティは2023年12月27日 11:00をもって閉鎖いたしました。
今後の運営はすべて新Live2D公式クリエイターズフォーラムに移行します。
閉鎖に伴い、以下機能は利用不可となります。
・アカウントの新規作成
・トピック投稿、返信
たくさんのご利用誠にありがとうございました。
新Live2D公式クリエイターズフォーラムは以下バナーよりご利用いただけます。
なお、本コミュニティに投稿されたトピックはすべて残りますが、今後削除する可能性がございますので予めご了承ください。
閉鎖に関するお問い合わせにつきましてはLive2D公式クリエイターズフォーラムへご連絡ください。
いつもLive2D公式コミュニティをご利用いただき誠にありがとうございます。
本コミュニティは2023年12月27日 11:00をもって閉鎖いたしました。
今後の運営はすべて新Live2D公式クリエイターズフォーラムに移行します。
閉鎖に伴い、以下機能は利用不可となります。
・アカウントの新規作成
・トピック投稿、返信
たくさんのご利用誠にありがとうございました。
新Live2D公式クリエイターズフォーラムは以下バナーよりご利用いただけます。
なお、本コミュニティに投稿されたトピックはすべて残りますが、今後削除する可能性がございますので予めご了承ください。
閉鎖に関するお問い合わせにつきましてはLive2D公式クリエイターズフォーラムへご連絡ください。
cocos2dx 3.9 mtnファイルの読み込みでエラー「file open error」
初めて投稿させて頂きます
==========================================
制作環境: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も初心者で、至らないところだらけなのですが
同じようなエラーを検索出来なかった為に投稿させて頂きます。
ご教示頂ければ幸いです。
==========================================
制作環境: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も初心者で、至らないところだらけなのですが
同じようなエラーを検索出来なかった為に投稿させて頂きます。
ご教示頂ければ幸いです。
0
コメント
loadMotionの引数はファイルパスではなく、FileUtils::getInstance()->getFileDataの返り値かと思います。
以下にソースをつけたので参考にしてみて下さい。
SampleLive2DSprite.h
#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 "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のサンプルコードのモデル表示について
返信ありがとうございます
添付して頂いたソースを元に試してみます。
今日中に返信出来ないかもしれませんが、
動作確認をして、またコメントさせて頂きます。
先ほど添付して頂いたソースを元にテストしてみたところ、正常に動作いたしました。
startMotionもupdateParamも「onDraw」の内部でやるのですね、、、
恥ずかしいソースを失礼いたしました。。
また投稿させて頂くこともあると思いますが、
その時はまたよろしくお願いします。
もう少しまともな質問が出来るようがんばります。
ありがとうございました。
またなんなりと質問して頂けたらと思います