ページ 11

MMDモーション再生について2

Posted: 2013年10月10日(木) 20:35
by Isanan
1.スペースキーが押されたら再生時間を初期化して「再生中」のフラグを立てる
2.「再生中」のフラグが立っていたら
 2-1.再生時間を進め、再生時間をセットする
 2-2.再生時間があらかじめ決めた時間に達したら、「再生中」のフラグを折る
アドバイスを元に少し間が空きましたが自分なりにフラグ処理を入れてみました

http://dixq.net/g/25.html

やはりキックのモーション再生がうまくいきません

実行結果が150.0fまで0.4fの早さで再生のはずがモーション中の0.4fの場面を表示になってしまいます

bool型も試しましたが結果は変わりませんでした

初心者
環境:[OS]windows7 [コンパイラ名]VC++ 2008EE
DXライブラリ

コード:

#include "DxLib.h"
 
typedef struct{
        int playing_flag;
}ch_t;

int Key[256]; // キーが押されているフレーム数を格納する
 
// キーの入力状態を更新する
int gpUpdateKey(){
        char tmpKey[256]; // 現在のキーの入力状態を格納する
        GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
        for( int i=0; i<256; i++ ){ 
                if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
                        Key[i]++;     // 加算
                } else {              // 押されていなければ
                        Key[i] = 0;   // 0にする
                }
        }
        return 0;
}
 
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
    ch_t ch;
	
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
 
    int ModelHandle, AttachIndex ;
    float TotalTime, PlayTime ;
	ch.playing_flag=0 ;

    // 3Dモデルの読み込み
    ModelHandle = MV1LoadModel( "Lat式ミク.pmd" ) ;
 
    //奥行0.1~1000までをカメラの描画範囲とする
    SetCameraNearFar( 0.1f, 1000.0f ) ;
 
    //(0,10,-20)の視点から(0,10,0)のターゲットを見る角度にカメラを設置
    SetCameraPositionAndTarget_UpVecY( VGet( 0, 20, -20 ), VGet( 0.0f, 10.0f, 0.0f ) ) ;
 
     // 3Dモデルの1番目のアニメーションをアタッチする
    AttachIndex = MV1AttachAnim( ModelHandle, 0, -1, FALSE ) ;
 
    // アタッチしたアニメーションの総再生時間を取得する
    TotalTime = MV1GetAttachAnimTotalTime( ModelHandle, AttachIndex ) ;
 
    // 再生時間の初期化
    PlayTime = 0.0f ;
 
	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 ){
        if( Key[KEY_INPUT_SPACE] == 1 ){ // スペースキーが押された瞬間なら
            PlayTime = 0.0f ;       //再生時間を初期化
              ch.playing_flag=0 ;	//「再生中」のフラグを立てる
 
                if( ch.playing_flag=1 ){             //「再生中」のフラグが立っていたら
                    PlayTime += 0.4f ;// 再生時間を進める
                    MV1SetAttachAnimTime( ModelHandle, AttachIndex, PlayTime ) ;// 再生時間をセットする
				}
                    if( PlayTime = 150.0f ){//再生時間があらかじめ決めた時間に達したら
					  ch.playing_flag=0 ;                   //「再生中」のフラグを折る
				}

        }
 
        // 3Dモデルの描画
        MV1DrawModel( ModelHandle ) ;
}
 
        DxLib_End(); // DXライブラリ終了処理
        return 0;
}

コード:

#include "DxLib.h"
 
int Key[256]; // キーが押されているフレーム数を格納する
 
// キーの入力状態を更新する
int gpUpdateKey(){
        char tmpKey[256]; // 現在のキーの入力状態を格納する
        GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
        for( int i=0; i<256; i++ ){ 
                if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
                        Key[i]++;     // 加算
                } else {              // 押されていなければ
                        Key[i] = 0;   // 0にする
                }
        }
        return 0;
}
 
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
 
    int ModelHandle, AttachIndex ;
    float TotalTime, PlayTime ;
	bool playing_Flag=false ;

    // 3Dモデルの読み込み
    ModelHandle = MV1LoadModel( "dat/ソリッド・スネーク ver1.2/ソリッド・スネーク.pmd" ) ;
 
    //奥行0.1~1000までをカメラの描画範囲とする
    SetCameraNearFar( 0.1f, 1000.0f ) ;
 
    //(0,10,-20)の視点から(0,10,0)のターゲットを見る角度にカメラを設置
    SetCameraPositionAndTarget_UpVecY( VGet( 0, 20, -20 ), VGet( 0.0f, 10.0f, 0.0f ) ) ;
 
     // 3Dモデルの1番目のアニメーションをアタッチする
    AttachIndex = MV1AttachAnim( ModelHandle, 0, -1, FALSE ) ;
 
    // アタッチしたアニメーションの総再生時間を取得する
    TotalTime = MV1GetAttachAnimTotalTime( ModelHandle, AttachIndex ) ;
 
    // 再生時間の初期化
    PlayTime = 0.0f ;
 
	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 ){
        if( Key[KEY_INPUT_SPACE] == 1 ){ // スペースキーが押された瞬間なら
            PlayTime = 0.0f ;            //再生時間を初期化
              playing_Flag=true ;	     //「再生中」のフラグを立てる
			  
                if( playing_Flag=true ){                                         //「再生中」のフラグが立っていたら
                    PlayTime += 0.4f ;                                           // 再生時間を進める
                    MV1SetAttachAnimTime( ModelHandle, AttachIndex, PlayTime ) ; // 再生時間をセットする
				}

                if( PlayTime = 150.0f ){    //再生時間があらかじめ決めた時間に達したら
					playing_Flag=false ;     //「再生中」のフラグを折る
				}

        }
 
        // 3Dモデルの描画
        MV1DrawModel( ModelHandle ) ;
}
 
        DxLib_End(); // DXライブラリ終了処理
        return 0;
}

Re: MMDモーション再生について2

Posted: 2013年10月10日(木) 21:19
by softya(ソフト屋)
前のトピックが終了していませんので、前のトピックをお使いください。話が繋がらなくなります。
「MMDモーション再生について • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=13919#p111517
なお、フラグの使い方の理解がやはり問題あると思います。

Re: MMDモーション再生について2

Posted: 2013年10月10日(木) 21:30
by Isanan
すみません


前のトピックで返信が消えたと勘違いしていました

Re: MMDモーション再生について2

Posted: 2013年10月10日(木) 21:32
by Isanan
1.スペースキーが押されたら再生時間を初期化して「再生中」のフラグを立てる
2.「再生中」のフラグが立っていたら
 2-1.再生時間を進め、再生時間をセットする
 2-2.再生時間があらかじめ決めた時間に達したら、「再生中」のフラグを折る
アドバイスを元に少し間が空きましたが自分なりにフラグ処理を入れてみました

http://dixq.net/g/25.html

やはりキックのモーション再生がうまくいきません

実行結果が150.0fまで0.4fの早さで再生のはずがモーション中の0.4fの場面を表示になってしまいます

bool型も試しましたが結果は変わりませんでした

初心者
環境:[OS]windows7 [コンパイラ名]VC++ 2008EE
DXライブラリ

コード:

#include "DxLib.h"
 
typedef struct{
        int playing_flag;
}ch_t;

int Key[256]; // キーが押されているフレーム数を格納する
 
// キーの入力状態を更新する
int gpUpdateKey(){
        char tmpKey[256]; // 現在のキーの入力状態を格納する
        GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
        for( int i=0; i<256; i++ ){ 
                if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
                        Key[i]++;     // 加算
                } else {              // 押されていなければ
                        Key[i] = 0;   // 0にする
                }
        }
        return 0;
}
 
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
    ch_t ch;
	
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
 
    int ModelHandle, AttachIndex ;
    float TotalTime, PlayTime ;
	ch.playing_flag=0 ;

    // 3Dモデルの読み込み
    ModelHandle = MV1LoadModel( "Lat式ミク.pmd" ) ;
 
    //奥行0.1~1000までをカメラの描画範囲とする
    SetCameraNearFar( 0.1f, 1000.0f ) ;
 
    //(0,10,-20)の視点から(0,10,0)のターゲットを見る角度にカメラを設置
    SetCameraPositionAndTarget_UpVecY( VGet( 0, 20, -20 ), VGet( 0.0f, 10.0f, 0.0f ) ) ;
 
     // 3Dモデルの1番目のアニメーションをアタッチする
    AttachIndex = MV1AttachAnim( ModelHandle, 0, -1, FALSE ) ;
 
    // アタッチしたアニメーションの総再生時間を取得する
    TotalTime = MV1GetAttachAnimTotalTime( ModelHandle, AttachIndex ) ;
 
    // 再生時間の初期化
    PlayTime = 0.0f ;
 
	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 ){
        if( Key[KEY_INPUT_SPACE] == 1 ){ // スペースキーが押された瞬間なら
            PlayTime = 0.0f ;       //再生時間を初期化
              ch.playing_flag=0 ;	//「再生中」のフラグを立てる
 
                if( ch.playing_flag=1 ){             //「再生中」のフラグが立っていたら
                    PlayTime += 0.4f ;// 再生時間を進める
                    MV1SetAttachAnimTime( ModelHandle, AttachIndex, PlayTime ) ;// 再生時間をセットする
				}
                    if( PlayTime = 150.0f ){//再生時間があらかじめ決めた時間に達したら
					  ch.playing_flag=0 ;                   //「再生中」のフラグを折る
				}

        }
 
        // 3Dモデルの描画
        MV1DrawModel( ModelHandle ) ;
}
 
        DxLib_End(); // DXライブラリ終了処理
        return 0;
}

コード:

#include "DxLib.h"
 
int Key[256]; // キーが押されているフレーム数を格納する
 
// キーの入力状態を更新する
int gpUpdateKey(){
        char tmpKey[256]; // 現在のキーの入力状態を格納する
        GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
        for( int i=0; i<256; i++ ){ 
                if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
                        Key[i]++;     // 加算
                } else {              // 押されていなければ
                        Key[i] = 0;   // 0にする
                }
        }
        return 0;
}
 
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
 
    int ModelHandle, AttachIndex ;
    float TotalTime, PlayTime ;
	bool playing_Flag=false ;

    // 3Dモデルの読み込み
    ModelHandle = MV1LoadModel( "dat/ソリッド・スネーク ver1.2/ソリッド・スネーク.pmd" ) ;
 
    //奥行0.1~1000までをカメラの描画範囲とする
    SetCameraNearFar( 0.1f, 1000.0f ) ;
 
    //(0,10,-20)の視点から(0,10,0)のターゲットを見る角度にカメラを設置
    SetCameraPositionAndTarget_UpVecY( VGet( 0, 20, -20 ), VGet( 0.0f, 10.0f, 0.0f ) ) ;
 
     // 3Dモデルの1番目のアニメーションをアタッチする
    AttachIndex = MV1AttachAnim( ModelHandle, 0, -1, FALSE ) ;
 
    // アタッチしたアニメーションの総再生時間を取得する
    TotalTime = MV1GetAttachAnimTotalTime( ModelHandle, AttachIndex ) ;
 
    // 再生時間の初期化
    PlayTime = 0.0f ;
 
	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 ){
        if( Key[KEY_INPUT_SPACE] == 1 ){ // スペースキーが押された瞬間なら
            PlayTime = 0.0f ;            //再生時間を初期化
              playing_Flag=true ;	     //「再生中」のフラグを立てる
			  
                if( playing_Flag=true ){                                         //「再生中」のフラグが立っていたら
                    PlayTime += 0.4f ;                                           // 再生時間を進める
                    MV1SetAttachAnimTime( ModelHandle, AttachIndex, PlayTime ) ; // 再生時間をセットする
				}

                if( PlayTime = 150.0f ){    //再生時間があらかじめ決めた時間に達したら
					playing_Flag=false ;     //「再生中」のフラグを折る
				}

        }
 
        // 3Dモデルの描画
        MV1DrawModel( ModelHandle ) ;
}
 
        DxLib_End(); // DXライブラリ終了処理
        return 0;
}

Re: MMDモーション再生について2

Posted: 2013年10月10日(木) 21:45
by softya(ソフト屋)
投稿先を間違えたのだと思いますが、こちらは閉鎖しておきますので元のトピックでお願いします。