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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Isanan

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

#1

投稿記事 by Isanan » 11年前

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;
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 11年前

前のトピックが終了していませんので、前のトピックをお使いください。話が繋がらなくなります。
「MMDモーション再生について • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=13919#p111517
なお、フラグの使い方の理解がやはり問題あると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Isanan

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

#3

投稿記事 by Isanan » 11年前

すみません


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

Isanan

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

#4

投稿記事 by Isanan » 11年前

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;
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#5

投稿記事 by softya(ソフト屋) » 11年前

投稿先を間違えたのだと思いますが、こちらは閉鎖しておきますので元のトピックでお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る