Nanashi-softプログラマ専用AndroidでOpenGL ES 2.0プログラミング


◇AndroidでOpenGL ES 2.0プログラミング -pmdデータを表示する(1-

実は,C++がコンパイルできるようになって,DirectX11で組んだ pmdデータ読み込みクラスがそのままコピペで使えました
なので,そうして下さい(ぉ

↓ココにある,pmd.hと pmd.cppを,jniフォルダに放り込みます
○DirectX11プログラミング -新システム(sgc5)のソース-
http://yun.cup.com/directx11027.html

そのままではエラーになるので,ちょっとだけ触ります
ヘッダーに記述した。コンパイラに送るアラインメント制御を gcc用に書き直します
・pmd.h
#pragma pack(push,1)    //アラインメント制御をオフる

#pragma pack(1)    //アラインメント制御をオフる

#pragma pack(pop)    //アラインメント制御エンド

#pragma pack()    //アラインメント制御エンド

Windows専用部分の記述を削除します。エラー時にダイアログボックスを出していただけでした
このままではエラー時に何も出ませんが,完成されたプログラムですので,そこはフィーリングで(*'-')
・pmd.cpp
#include <windows.h>

//#include <windows.h>

    }else{
            MessageBoxW(NULL, L"fopen", L"Err", MB_ICONSTOP);

//    }else{
    //        MessageBoxW(NULL, L"fopen", L"Err", MB_ICONSTOP);


次に,jniフォルダにある Android.mkに,pmd.cppをコンパイルするように指定します
    LOCAL_SRC_FILES := hello-jni.cpp

    LOCAL_SRC_FILES := hello-jni.cpp pmd.cpp

pmdクラスが入ったら,データがそこから引き出せるので,後はシェーダーに放り込むだけです

hello-jni.cppの先頭に pmdヘッダーを追加
    #include "pmd.h"

onSurfaceCreated関数に,pmdデータ読み込みを追加します
pmdクラスを生成するのですが,問題はその時の pmdファイルのパスです
『機種依存でデバイス名が異なります』
Life Touch NOTEは,SDカードが『/sdcard』と決まっていますので,SDカードのルートに初音ミクのpmdファイルを放り込んで,↓のように指定しました
    //pmdクラスを生成する。その際にコンストラクタにファイル名を教える
        pmd *modeldata;
        modeldata = new pmd((char*)"/sdcard/hatsunemiku.pmd");

読み込んだデータをシェーダーに送り込みます
前に記述した,頂点データとインデックスデータを全て削除して下さい。それと差し替える形になります
//const int TYOUTEN=8;
//float hVectorData[]={
//const int INDEXSU=36;
//GLuint hIndexData[]={
新たに送り込む部分を追加します
	//頂点データを取得
	TYOUTEN = modeldata->vert_count;
	//取得失敗時には黄色にしてみる
	if(TYOUTEN == 0){
		debug_r=1.0f;
		debug_g=1.0f;
	}

	hVectorData = new Vertex3D[TYOUTEN];

	for(int i=0; i < TYOUTEN; i++){
		hVectorData[i].pos[0] = modeldata->vertex[i].pos[0];
		hVectorData[i].pos[1] = modeldata->vertex[i].pos[1];
		hVectorData[i].pos[2] = modeldata->vertex[i].pos[2];
	}

	//インデックスデータを取得
	INDEXSU = modeldata->face_vert_count;

	hIndexData = new GLuint[INDEXSU];

	for(int i=0; i < INDEXSU; i++){
		hIndexData[i] = modeldata->face_vert_index[i];
	}

とりあえず頂点データを送っただけで実行してみました

ツインテの可愛いシルエットが浮かび上がってきました('-'*)


TOPプログラマ 専用AndroidでOpenGL ES 2.0プログラミング