HelloWorldを大幅改定して作ってみました
モデルは簡単なドーナツ型のものをMetasequoiaで作り、xファイルで吐き出させてAmaryllisでsmfファイルにコンバートしました
生成は3ステップ、描画は2ステップ踏む必要があるようです
生成については
まず、Renderer::IRenderを使用して、ファイルからRenderer::Object::IModelを生成します(モデルの読み込み)
つぎに、Scene::ISceneManagerを生成し、最後に、読み込んだモデルを使ってScene::IModelActorを作ります
描画については
まずScene::IModelActor::RenderingRequest関数を使ってScene::ISceneManagerに描画することを要請し、
その後、大元のScene::ISceneManagerでRendering関数を使って実際に描画します
main.cpp("*"がついているのが追加・修正したところです)
#include <Selene.h>
///////////////////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
using namespace Selene;
//
ICore* pCore=NULL;
IGraphicCard* pGraphicCard=NULL;
Renderer::IRender* pRender=NULL;
Peripheral::IKeyboard* pKeyboard=NULL;
//
Renderer::Object::IModel* pModel=NULL; // *
Scene::ISceneManager* pSceneManager=NULL; // *
Scene::ICamera* pCamera=NULL; // *
Scene::IModelActor* pActor=NULL; // *
// *Actorの位置*
Math
::Vector3D Pos(0
.0f
,0
.0f
,0
.0f
); // * // システムの初期化
// コアの生成
// 初期化
if(!pCore
->Initialize("Hello World",FRAME_RATE_60
)){goto
EXIT;} // タイトルバーに情報を表示
pCore->EnableDrawTitleInformation(true);
// グラフィックカードを取得
pGraphicCard=pCore->CreateGraphicCard(GRAPHIC_CARD_DEFAULT_NO);
if(pGraphicCard
==NULL){goto
EXIT;} // ウィンドウ作成(640x480,WindowMode)
pCore->Start(640,480,true);
// レンダラーを取得
pRender=pGraphicCard->CreateRender();
if(pGraphicCard
==NULL){goto
EXIT;} // キーボードを取得
pKeyboard=pCore->GetKeyboard();
if(pKeyboard
==NULL){goto
EXIT;} // *モデルを読み込み生成*
pModel=pRender->CreateModelFromFile("torus.smf"); // *
if(pModel
==NULL){goto
EXIT;} // * // *シーンマネージャーを生成*
pSceneManager=pRender->CreateSceneManager(128,true); // *
if(pSceneManager
==NULL){goto
EXIT;} // * // *シーンマネージャーの初期化系パラメータを設定・更新*
pSceneManager->InitParameter_RenderTargetData(NULL,Math::Point2DI(640,480),false); //*
pSceneManager->InitParameter_Shading(SHADING_TYPE_NORMAL); // *
pSceneManager->InitParameter_Update(); // *
// *カメラの取得・設定*
pCamera=pSceneManager->GetCamera(); // *
pCamera->UpdateProjection(1.0f,1000.0f,DEG_TO_ANGLE(45.0f),640,480); // *
// *Actorの作成*
pActor=pSceneManager->CreateActor(pModel); // *
// メインループ
while(pCore->Run())
{
// *Update処理*
if(pKeyboard
->GetKeyData(SELENE_VK_LEFT
)==TRUE){Pos.x
-=0
.05f
;} // * if(pKeyboard
->GetKeyData(SELENE_VK_RIGHT
)==TRUE){Pos.x
+=0
.05f
;} // * if(pKeyboard
->GetKeyData(SELENE_VK_UP
)==TRUE){Pos.y
+=0
.05f
;} // * if(pKeyboard
->GetKeyData(SELENE_VK_DOWN
)==TRUE){Pos.y
-=0
.05f
;} // * // *Actorの位置・姿勢情報の更新*
pActor->TransformReset(); // *
pActor
->Translation(Pos); // * pActor->TransformUpdate(); // *
// *カメラの位置・姿勢情報の更新*
pCamera->SetTransformSimple(Math::Vector3D(0.0f,0.0f,-8.0f),Math::Vector3D(0.0f,0.0f,0.0f),DEG_TO_ANGLE(0.0f)); // *
pCamera->Update(); // *
// *シーンマネージャーのリセット*
pSceneManager
->Reset(); // * pSceneManager->SetParameter_BGColor(CColor(128,128,128)); // *
// *シーンに平行光を当てる*
pSceneManager->SetLightParameter_Directional(Math::Vector3D(0.5f,-0.5f,0.7f),Math::Vector3D(0.8f,0.8f,0.8f)); // *
// *シーンマネージャーへのレンダリングリクエスト(かならずカメラの位置姿勢を決めてから)*
pSceneManager->Begin(false); // *
pActor->RenderingRequest(); // *
pSceneManager
->End(); // * // 裏画面のクリア(white)
pRender->Clear(CColor(255,255,255));
// 画面への描画を開始
pRender->Begin();
// *シーンマネージャーを描画*
pSceneManager->Rendering(true); // *
// *文字列(Actorの現在位置)を描画(black)*
pRender
->DrawText(Math
::Point2DI(0,0),CColor
(0,0,0),"Pos=[%2.2f,%2.2f,%2.2f];",Pos.x
,Pos.y
,Pos.z
); // * // 画面への描画を完了
}
// 開放
SAFE_RELEASE(pActor); // *
SAFE_RELEASE(pCamera); // *
SAFE_RELEASE(pSceneManager); // *
SAFE_RELEASE(pModel); // *
//
SAFE_RELEASE(pKeyboard);
SAFE_RELEASE(pRender);
SAFE_RELEASE(pGraphicCard);
SAFE_RELEASE(pCore);
// システムの解放
// 終了
return 0;
}
とりあえずこれで動きます
virtual Selene::Renderer::Object::IModel* Selene::Renderer::IRender::CreateModelFromFile(const char* pFileName)
モデルをファイルから生成する
| const char* pFileName |
モデルファイル名 |
| 返り値 |
生成されたモデル |
virtual Scene::ISceneManager* CreateSceneManager(Sint32 QueMax,Bool IsPixelShaderEnable)
シーン管理インターフェイスを生成する
| Sint32 QueMax |
シーンの描画キューの最大数 |
| Bool IsPixelShaderEnable |
ピクセルシェーダーの有無 |
| 返り値 |
生成されたシーン管理インターフェイス |
virtual Selene::Scene::IModelActor* Selene::Scene::ISceneManager::CreateActor(Renderer::Object::IModel* pObject)
シーンアクターを取得する
| Renderer::Object::IModel* pObject |
アクターに関連付ける描画インターフェイス |
| 返り値 |
生成されたIModelActorインターフェイス |
virtual void Selene::Scene::IModelActor::RenderingRequest(void)
描画をリクエストする
Selene::Scene::ISceneManager::Begin()~::End()の間で使うこと
virtual void Selene::Scene::ISceneManager::Rendering(Bool IsDrawBuffer=false)
シーンをレンダリングする
| Bool IsDrawBuffer |
内部用バッファを表示するか |
Selene::Renderer::IRender::Begin()~::End()の間で使うこと
最終更新:2009年06月08日 23:02