図0403a
このサンプルはシンプルな3D表現のサンプルです。1、基本色(PNTフォーマットは法線ライティング)にデフューズ(拡散光)を掛ける。 2、1にエミッシブ色を足す 3、PNTフォーマットはスペキュラーを足す 4、3を基本色とし、テクスチャがある場合はサンプリングした値に3を掛ける。 5、影がある場合は影要素を掛ける
図0403b
この中で頂点シェーダとピクセルシェーダは必須なシェーダです。
//ビューのカメラの設定
auto PtrLookAtCamera = ObjectFactory::Create<LookAtCamera>(10.0f);
void PcSphere::OnCreate() {
auto PtrTrans = GetComponent<Transform>();
PtrTrans->SetScale(Vec3(1.0f, 1.0f, 1.0f));
Quat Qt;
Qt.identity();
PtrTrans->SetQuaternion(Qt);
PtrTrans->SetPosition(m_StartPos);
//描画コンポーネント
auto PtrDraw = AddComponent<PCStaticDraw>();
vector<VertexPositionNormalTexture> vertices;
vector<VertexPositionColor> new_vertices;
vector<uint16_t> indices;
MeshUtill::CreateSphere(1.0f,18, vertices, indices);
for (size_t i = 0; i < vertices.size(); i++) {
VertexPositionColor new_v;
new_v.position = vertices[i].position;
new_v.color = Col4(
new_v.position.x * 2.0f,
new_v.position.y * 2.0f,
new_v.position.z * 2.0f,
1.0f);
new_vertices.push_back(new_v);
}
PtrDraw->CreateOriginalMesh(new_vertices, indices);
PtrDraw->SetOriginalMeshUse(true);
//影をつける
auto ShadowPtr = AddComponent<Shadowmap>();
ShadowPtr->SetMeshResource(PtrDraw->GetOriginalMeshResource());
}
PtrDraw->CreateOriginalMesh(new_vertices, indices);
PtrDraw->SetOriginalMeshUse(true);
//影をつける
auto ShadowPtr = AddComponent<Shadowmap>();
ShadowPtr->SetMeshResource(PtrDraw->GetOriginalMeshResource());
//--------------------------------------------------------------------------------------
///頂点を変更する行動クラス
//--------------------------------------------------------------------------------------
class VertexBehavior : public Behavior {
float m_TotalTime;
public:
//--------------------------------------------------------------------------------------
/*!
@brief コンストラクタ
@param[in] GameObjectPtr このコンポーネントを所持するゲームオブジェクト
*/
//--------------------------------------------------------------------------------------
VertexBehavior(const shared_ptr<GameObject>& GameObjectPtr) :
Behavior(GameObjectPtr),
m_TotalTime(0)
{}
//--------------------------------------------------------------------------------------
/*!
@brief デストラクタ
*/
//--------------------------------------------------------------------------------------
virtual ~VertexBehavior() {}
//--------------------------------------------------------------------------------------
/*!
@brief 伸び縮みする
@tparam T 頂点の型
@return なし
*/
//--------------------------------------------------------------------------------------
template<typename T>
void ExpandAndContract() {
float ElapsedTime = App::GetApp()->GetElapsedTime();
m_TotalTime += ElapsedTime;
if (m_TotalTime >= XM_2PI) {
m_TotalTime = 0;
}
auto PtrDraw = GetGameObject()->GetDynamicComponent<StaticBaseDraw>();
const vector<T>& BackupVec = PtrDraw->GetOriginalMeshResource()->GetBackupVerteces<T>();
vector<T> new_vec;
for (auto& v : BackupVec) {
T new_v;
new_v = v;
auto Len = (sin(m_TotalTime) * 0.5f) + 1.0f;
new_v.position.x *= Len;
new_v.position.z *= Len;
new_vec.push_back(new_v);
}
PtrDraw->UpdateVertices(new_vec);
}
};
auto PtrDraw = GetGameObject()->GetDynamicComponent<StaticBaseDraw>();
void PcSphere::OnUpdate() {
auto Beh = GetBehavior<VertexBehavior>();
Beh->ExpandAndContract<VertexPositionColor>();
}
//初期化
void PntSpSphere::OnCreate() {
auto PtrTrans = GetComponent<Transform>();
PtrTrans->SetScale(Vec3(1.0f, 1.0f, 1.0f));
Quat Qt;
Qt.identity();
PtrTrans->SetQuaternion(Qt);
PtrTrans->SetPosition(m_StartPos);
//影をつける
auto ShadowPtr = AddComponent<Shadowmap>();
ShadowPtr->SetMeshResource(L"DEFAULT_SPHERE");
//描画コンポーネント
auto PtrDraw = AddComponent<PNTStaticDraw>();
PtrDraw->SetSpecular(Col4(1.0f, 1.0f, 1.0f, 1.0f));
PtrDraw->SetMeshResource(L"DEFAULT_SPHERE");
if (m_TextureUse) {
PtrDraw->SetTextureResource(L"SKY_TX");
}
}
void Scene::CreateResourses() {
wstring DataDir;
//サンプルのためアセットディレクトリを取得
App::GetApp()->GetAssetsDirectory(DataDir);
//各ゲームは以下のようにデータディレクトリを取得すべき
//App::GetApp()->GetDataDirectory(DataDir);
//中略
auto ModelMesh = MeshResource::CreateBoneModelMesh(DataDir, L"Chara_R.bmf");
App::GetApp()->RegisterResource(L"Chara_R_MESH", ModelMesh);
auto StaticModelMesh = MeshResource::CreateStaticModelMesh(DataDir, L"Character_01.bmf");
App::GetApp()->RegisterResource(L"MODEL_MESH", StaticModelMesh);
//スタティックモデル(マルチメッシュ)の通常リソース
auto StaticMultiModelMesh = MultiMeshResource::CreateStaticModelMultiMesh(DataDir, L"ObjectOnly.bmf");
App::GetApp()->RegisterResource(L"ObjectOnly_MESH", StaticMultiModelMesh);
//ボーンモデル(マルチメッシュ)の通常リソース
auto MultiModelMesh = MultiMeshResource::CreateBoneModelMultiMesh(DataDir, L"Object_WalkAnimation.bmf");
App::GetApp()->RegisterResource(L"Object_WalkAnimation_MESH", MultiModelMesh);
}
//初期化
void BoneChara::OnCreate() {
//初期位置などの設定
auto Ptr = AddComponent<Transform>();
Ptr->SetScale(0.5f, 0.5f, 0.5f);
Ptr->SetRotation(0.0f, 0.0f, 0.0f);
Ptr->SetPosition(m_StartPos);
Mat4x4 SpanMat; // モデルとトランスフォームの間の差分行列
SpanMat.affineTransformation(
Vec3(1.0f, 1.0f, 1.0f),
Vec3(0.0f, 0.0f, 0.0f),
Vec3(0.0f, 0.0f, 0.0f),
Vec3(0.0f, 0.0f, 0.0f)
);
//影をつける(シャドウマップを描画する)
auto ShadowPtr = AddComponent<Shadowmap>();
//影の形(メッシュ)を設定
ShadowPtr->SetMeshResource(L"Chara_R_MESH");
ShadowPtr->SetMeshToTransformMatrix(SpanMat);
//描画コンポーネントの設定
auto PtrDraw = AddComponent<PNTBoneModelDraw>();
//描画するメッシュを設定
PtrDraw->SetMeshResource(L"Chara_R_MESH");
PtrDraw->SetMeshToTransformMatrix(SpanMat);
PtrDraw->AddAnimation(L"Default", 0, 50, true, 20.0f);
PtrDraw->ChangeCurrentAnimation(L"Default");
//透明処理
SetAlphaActive(true);
}
//更新
void BoneChara::OnUpdate() {
//アニメーションを更新する
auto PtrDraw = GetComponent<PNTBoneModelDraw>();
float ElapsedTime = App::GetApp()->GetElapsedTime();
PtrDraw->UpdateAnimation(ElapsedTime);
}
//初期化
void BoneMultiMeshChara::OnCreate() {
//初期位置などの設定
auto Ptr = AddComponent<Transform>();
Ptr->SetScale(0.5f, 0.5f, 0.5f);
Ptr->SetRotation(0.0f, 0.0f, 0.0f);
Ptr->SetPosition(m_StartPos);
Mat4x4 SpanMat; // モデルとトランスフォームの間の差分行列
SpanMat.affineTransformation(
Vec3(1.0f, 1.0f, 1.0f),
Vec3(0.0f, 0.0f, 0.0f),
Vec3(0.0f, 0.0f, 0.0f),
Vec3(0.0f, 0.0f, 0.0f)
);
//影をつける(シャドウマップを描画する)
auto ShadowPtr = AddComponent<Shadowmap>();
//影の形(メッシュ)を設定
ShadowPtr->SetMultiMeshResource(L"Object_WalkAnimation_MESH");
ShadowPtr->SetMeshToTransformMatrix(SpanMat);
//描画コンポーネントの設定
auto PtrDraw = AddComponent<PNTBoneModelDraw>();
//描画するメッシュを設定
PtrDraw->SetMultiMeshResource(L"Object_WalkAnimation_MESH");
PtrDraw->SetSamplerState(SamplerState::LinearWrap);
PtrDraw->SetMeshToTransformMatrix(SpanMat);
PtrDraw->AddAnimation(L"Default", 0, 30, true, 10.0f);
PtrDraw->ChangeCurrentAnimation(L"Default");
}
//更新
void BoneMultiMeshChara::OnUpdate() {
auto PtrDraw = GetComponent<PNTBoneModelDraw>();
float ElapsedTime = App::GetApp()->GetElapsedTime();
PtrDraw->UpdateAnimation(ElapsedTime);
}
//初期化
void StaticChara::OnCreate() {
//初期位置などの設定
auto Ptr = AddComponent<Transform>();
Ptr->SetScale(0.5f, 0.5f, 0.5f);
Ptr->SetRotation(0.0f, 0.0f, 0.0f);
Ptr->SetPosition(m_StartPos);
Mat4x4 SpanMat; // モデルとトランスフォームの間の差分行列
SpanMat.affineTransformation(
Vec3(1.0f, 1.0f, 1.0f),
Vec3(0.0f, 0.0f, 0.0f),
Vec3(0.0f, 0.0f, 0.0f),
Vec3(0.0f, 0.0f, 0.0f)
);
//影をつける(シャドウマップを描画する)
auto ShadowPtr = AddComponent<Shadowmap>();
//影の形(メッシュ)を設定
ShadowPtr->SetMeshResource(L"MODEL_MESH");
ShadowPtr->SetMeshToTransformMatrix(SpanMat);
auto PtrDraw = AddComponent<PNTStaticModelDraw>();
PtrDraw->SetMeshResource(L"MODEL_MESH");
PtrDraw->SetMeshToTransformMatrix(SpanMat);
}
//初期化
void StaticMultiMeshChara::OnCreate() {
//初期位置などの設定
auto Ptr = AddComponent<Transform>();
Ptr->SetScale(0.5f, 0.5f, 0.5f);
Ptr->SetRotation(0.0f, 0.0f, 0.0f);
Ptr->SetPosition(m_StartPos);
Mat4x4 SpanMat; // モデルとトランスフォームの間の差分行列
SpanMat.affineTransformation(
Vec3(1.0f, 1.0f, 1.0f),
Vec3(0.0f, 0.0f, 0.0f),
Vec3(0.0f, 0.0f, 0.0f),
Vec3(0.0f, 0.0f, 0.0f)
);
//影をつける(シャドウマップを描画する)
auto ShadowPtr = AddComponent<Shadowmap>();
//影の形(メッシュ)を設定
ShadowPtr->SetMultiMeshResource(L"ObjectOnly_MESH");
ShadowPtr->SetMeshToTransformMatrix(SpanMat);
auto PtrDraw = AddComponent<PNTStaticModelDraw>();
PtrDraw->SetMultiMeshResource(L"ObjectOnly_MESH");
PtrDraw->SetMeshToTransformMatrix(SpanMat);
}