とりあえずSeleneで3D描画

HelloWorldを大幅改定して作ってみました

モデルは簡単なドーナツ型のものをMetasequoiaで作り、xファイルで吐き出させてAmaryllisでsmfファイルにコンバートしました
Link:Metasequoia(http://www.metaseq.net/)

生成は3ステップ、描画は2ステップ踏む必要があるようです
生成については
まず、Renderer::IRenderを使用して、ファイルからRenderer::Object::IModelを生成します(モデルの読み込み)
つぎに、Scene::ISceneManagerを生成し、最後に、読み込んだモデルを使ってScene::IModelActorを作ります
描画については
まずScene::IModelActor::RenderingRequest関数を使ってScene::ISceneManagerに描画することを要請し、
その後、大元のScene::ISceneManagerでRendering関数を使って実際に描画します

main.cpp("*"がついているのが追加・修正したところです)
  1. #include <Selene.h>
  2. ///////////////////////////////////////////////////////////////
  3. int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
  4. {
  5. using namespace Selene;
  6. //
  7. ICore* pCore=NULL;
  8. IGraphicCard* pGraphicCard=NULL;
  9. Renderer::IRender* pRender=NULL;
  10. Peripheral::IKeyboard* pKeyboard=NULL;
  11. //
  12. Renderer::Object::IModel* pModel=NULL; // *
  13. Scene::ISceneManager* pSceneManager=NULL; // *
  14. Scene::ICamera* pCamera=NULL; // *
  15. Scene::IModelActor* pActor=NULL; // *
  16. // *Actorの位置*
  17. Math::Vector3D Pos(0.0f,0.0f,0.0f); // *
  18. // システムの初期化
  19. System::Initialize();
  20. // コアの生成
  21. pCore=System::CreateCore();
  22. // 初期化
  23. if(!pCore->Initialize("Hello World",FRAME_RATE_60)){goto EXIT;}
  24. // タイトルバーに情報を表示
  25. pCore->EnableDrawTitleInformation(true);
  26. // グラフィックカードを取得
  27. pGraphicCard=pCore->CreateGraphicCard(GRAPHIC_CARD_DEFAULT_NO);
  28. if(pGraphicCard==NULL){goto EXIT;}
  29. // ウィンドウ作成(640x480,WindowMode)
  30. pCore->Start(640,480,true);
  31. // レンダラーを取得
  32. pRender=pGraphicCard->CreateRender();
  33. if(pGraphicCard==NULL){goto EXIT;}
  34. // キーボードを取得
  35. pKeyboard=pCore->GetKeyboard();
  36. if(pKeyboard==NULL){goto EXIT;}
  37. // *モデルを読み込み生成*
  38. pModel=pRender->CreateModelFromFile("torus.smf"); // *
  39. if(pModel==NULL){goto EXIT;} // *
  40. // *シーンマネージャーを生成*
  41. pSceneManager=pRender->CreateSceneManager(128,true); // *
  42. if(pSceneManager==NULL){goto EXIT;} // *
  43. // *シーンマネージャーの初期化系パラメータを設定・更新*
  44. pSceneManager->InitParameter_RenderTargetData(NULL,Math::Point2DI(640,480),false); //*
  45. pSceneManager->InitParameter_Shading(SHADING_TYPE_NORMAL); // *
  46. pSceneManager->InitParameter_Update(); // *
  47. // *カメラの取得・設定*
  48. pCamera=pSceneManager->GetCamera(); // *
  49. pCamera->UpdateProjection(1.0f,1000.0f,DEG_TO_ANGLE(45.0f),640,480); // *
  50. // *Actorの作成*
  51. pActor=pSceneManager->CreateActor(pModel); // *
  52. // メインループ
  53. while(pCore->Run())
  54. {
  55. // *Update処理*
  56. if(pKeyboard->GetKeyData(SELENE_VK_LEFT)==TRUE){Pos.x-=0.05f;} // *
  57. if(pKeyboard->GetKeyData(SELENE_VK_RIGHT)==TRUE){Pos.x+=0.05f;} // *
  58. if(pKeyboard->GetKeyData(SELENE_VK_UP)==TRUE){Pos.y+=0.05f;} // *
  59. if(pKeyboard->GetKeyData(SELENE_VK_DOWN)==TRUE){Pos.y-=0.05f;} // *
  60. // *Actorの位置・姿勢情報の更新*
  61. pActor->TransformReset(); // *
  62. pActor->Translation(Pos); // *
  63. pActor->TransformUpdate(); // *
  64. // *カメラの位置・姿勢情報の更新*
  65. pCamera->Reset(); // *
  66. pCamera->SetTransformSimple(Math::Vector3D(0.0f,0.0f,-8.0f),Math::Vector3D(0.0f,0.0f,0.0f),DEG_TO_ANGLE(0.0f)); // *
  67. pCamera->Update(); // *
  68. // *シーンマネージャーのリセット*
  69. pSceneManager->Reset(); // *
  70. pSceneManager->SetParameter_BGColor(CColor(128,128,128)); // *
  71. // *シーンに平行光を当てる*
  72. pSceneManager->SetLightParameter_Directional(Math::Vector3D(0.5f,-0.5f,0.7f),Math::Vector3D(0.8f,0.8f,0.8f)); // *
  73. // *シーンマネージャーへのレンダリングリクエスト(かならずカメラの位置姿勢を決めてから)*
  74. pSceneManager->Begin(false); // *
  75. pActor->RenderingRequest(); // *
  76. pSceneManager->End(); // *
  77. // 裏画面のクリア(white)
  78. pRender->Clear(CColor(255,255,255));
  79. // 画面への描画を開始
  80. pRender->Begin();
  81. // *シーンマネージャーを描画*
  82. pSceneManager->Rendering(true); // *
  83. // *文字列(Actorの現在位置)を描画(black)*
  84. pRender->DrawText(Math::Point2DI(0,0),CColor(0,0,0),"Pos=[%2.2f,%2.2f,%2.2f];",Pos.x,Pos.y,Pos.z); // *
  85. // 画面への描画を完了
  86. pRender->End();
  87. }
  88. // 開放
  89. SAFE_RELEASE(pActor); // *
  90. SAFE_RELEASE(pCamera); // *
  91. SAFE_RELEASE(pSceneManager); // *
  92. SAFE_RELEASE(pModel); // *
  93. //
  94. SAFE_RELEASE(pKeyboard);
  95. SAFE_RELEASE(pRender);
  96. SAFE_RELEASE(pGraphicCard);
  97. SAFE_RELEASE(pCore);
  98. // システムの解放
  99. System::Finalize();
  100. // 終了
  101. return 0;
  102. }
  103.  
とりあえずこれで動きます


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
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。
添付ファイル