//ビュー類の作成 void GameStage::CreateViews(){ //最初にデフォルトのレンダリングターゲット類を作成する //パラメータの2048.0fはシャドウマップのサイズ。大きいほど影が細かくなる(4096.0fなど) //影を細かくするとメモリを大量に消費するので注意! CreateDefaultRenderTargets(2048.0f); //影のビューサイズの設定。この値を小さくすると影が表示される範囲が小さくなる。 //値が小さいほうが影は細かくなる //スタティック変数なので一度設定したらその値はステージを超えて保持される。 Shadowmap::SetViewSize(32.0f); //マルチビューコンポーネントの取得 auto PtrMultiView = GetComponent<MultiView>(); //マルチビューにビューの追加 auto PtrView = PtrMultiView->AddView(); //ビューの矩形を設定(ゲームサイズ全体) Rect2D<float> rect(0, 0, (float)App::GetApp()->GetGameWidth(), (float)App::GetApp()->GetGameHeight()); //ビューの背景色 Color4 ViewBkColor(0.0f, 0.125f, 0.3f, 1.0f); //最初のビューにパラメータの設定 PtrView->ResetParamaters<Camera, MultiLight>(rect, ViewBkColor, 1, 0.0f, 1.0f); //最初のビューのビューのライトの設定 auto PtrLight = PtrView->GetMultiLight()->GetLight(0); PtrLight->SetPositionToDirectional(-0.25f, 1.0f, -0.25f); //ビューのカメラの設定 auto PtrCamera = PtrView->GetCamera(); PtrCamera->SetEye(Vector3(0.0f, 5.0f, -5.0f)); PtrCamera->SetAt(Vector3(0.0f, 0.0f, 0.0f)); }
void CObjectRotateCamera::SetEyeAngle(float x, float z) { Point3 eye = Angle2Pos(x, z); m_anglex = x; m_anglez = z; SetEye(eye.x, eye.y, eye.z); }
void GameStage::Create(){ m_View = Object::CreateObject<View>(); Rect2D<float> rect(0, 0, (float)App::GetApp()->GetGameWidth(), (float)App::GetApp()->GetGameHeight()); m_View->ResetParamaters<Camera, MultiLight>(rect, Color4(0.0f, 0.0f, 0.0f, 1.0f), 1, 0.0f, 1.0f); auto PtrCamera = m_View->GetCamera(); PtrCamera->SetEye(Vector3(0.0f, 2.0f, -5.0f)); PtrCamera->SetAt(Vector3(0.0f, 0.0f, 2.0f)); auto PtrLight = m_View->GetMultiLight(); PtrLight->SetDefaultLighting(); //デフォルトのレンダリングターゲットを作成 m_DefaultRenderTarget = make_shared<DefaultRenderTarget>(); auto Obj = Object::CreateObject<GameObject>( GetThis<GameStage>(), Vector3(1.0f, 1.0f, 1.0f), Vector3(0.0f, 0.0f, 0.0f), Vector3(0.0f, -1.0f, 2.0f) ); m_GameObjectVec.push_back(Obj); //文字列をつける m_StringSprite = Object::CreateObject<StringSprite>(); m_StringSprite->SetText(L""); m_StringSprite->SetTextRect(Rect2D<float>(16.0f, 16.0f, 640.0f, 480.0f)); }
CCamera::CCamera(void) { m_LiftAngle = 0.0f; SetUp(0, 1, 0); SetLookat(0, 0, 0); SetEye(1, 0, 1); UpdateMatrix(); }
void CObjectRotateCamera::SetEyePos(float x, float y, float z) { SetEye(x, y, z); Point3 dir = Point3(x, y, z) - m_center; m_radius = dir.GetLength(); Point3 angle = Dir2Angle(dir); m_anglex = angle.x; m_anglez = angle.y; }
void Camera::SetView(const Vector3& pvEye, const Vector3& pvLookat, const Vector3& pvUp){ SetEye(pvEye); SetLookat(pvLookat); SetUp(pvUp); m_View = Normalized(m_Lookat - m_Eye); m_Cross = Cross(m_Up, m_View); m_matView = LookAt(m_Eye,m_Lookat, m_Up); }
//-------------------------------------------------------------------------------------- // ゲームステージクラス実体 //-------------------------------------------------------------------------------------- //ビューとライトの作成 void GameStage::CreateViewLight() { auto PtrView = CreateView<SingleView>(); //ビューのカメラの設定 auto PtrCamera = PtrView->GetCamera(); PtrCamera->SetEye(Vec3(0.0f, 5.0f, -5.0f)); PtrCamera->SetAt(Vec3(0.0f, 0.0f, 0.0f)); //シングルライトの作成 auto PtrSingleLight = CreateLight<SingleLight>(); //ライトの設定 PtrSingleLight->GetLight().SetPositionToDirectional(-0.25f, 1.0f, -0.25f); }
//ビューとライトの作成 void GameStage::CreateViewLight() { auto PtrView = CreateView<SingleView>(); //ビューのカメラの設定 auto PtrLookAtCamera = ObjectFactory::Create<LookAtCamera>(); PtrView->SetCamera(PtrLookAtCamera); PtrLookAtCamera->SetEye(Vec3(0.0f, 5.0f, -5.0f)); PtrLookAtCamera->SetAt(Vec3(0.0f, 0.0f, 0.0f)); //マルチライトの作成 auto PtrMultiLight = CreateLight<MultiLight>(); //デフォルトのライティングを指定 PtrMultiLight->SetDefaultLighting(); }
bool CObjectRotateCamera::Update() { CMouseManager* mouse = GetMouse(); bool down[2] = {mouse->IsPressed(0), mouse->IsPressed(1)}; int x = mouse->GetX(); int y = mouse->GetY(); int dx = x - m_lastx; int dy = y - m_lasty; bool needUpdate = false; if (!GetKeyboard()->IsPressed(VK_SHIFT) && m_lastDown[0] && down[0] && (abs(dx) + abs(dy) > 0)) { m_anglex += dx * 0.01f; // * elapsedTime; m_anglez += dy * 0.01f;// * elapsedTime; m_anglex = NormAngle(m_anglex); m_anglez = NormAngle(m_anglez); Point3 eye = Angle2Pos(m_anglex, m_anglez); SetEye(eye.x, eye.y, eye.z); needUpdate = true; } if (GetMouse()->GetWheel() != 0) { m_radius *= max(0.01f, 1 - GetMouse()->GetWheel() * 0.0003f); Point3 eye = Angle2Pos(m_anglex, m_anglez); SetEye(eye.x, eye.y, eye.z); needUpdate = true; } m_lastDown[0] = down[0]; m_lastDown[1] = down[1]; m_lastx = x; m_lasty = y; return needUpdate; }
//ビュー類の作成 void GameStage::CreateViews(){ //最初にデフォルトのレンダリングターゲット類を作成する CreateDefaultRenderTargets(); //マルチビューコンポーネントの取得 auto PtrMultiView = GetComponent<MultiView>(); //マルチビューにビューの追加 auto PtrView = PtrMultiView->AddView(); //ビューの矩形を設定(ゲームサイズ全体) Rect2D<float> rect(0, 0, (float)App::GetApp()->GetGameWidth(), (float)App::GetApp()->GetGameHeight()); //最初のビューにパラメータの設定 PtrView->ResetParamaters<LookAtCamera, MultiLight>(rect, Color4(0.0f, 0.125f, 0.3f, 1.0f), 1, 0.0f, 1.0f); auto PtrCamera = PtrView->GetCamera(); PtrCamera->SetEye(Vector3(0.0f, 2.0f, -5.0f)); PtrCamera->SetAt(Vector3(0.0f, 0.0f, 0.0f)); }
//ビューとライトの作成 void GameStage::CreateViewLight() { auto PtrView = CreateView<SingleView>(); //ビューのカメラの設定 auto bkCamera = App::GetApp()->GetScene<Scene>()->GetBackupCamera(); if (!bkCamera) { auto PtrLookAtCamera = ObjectFactory::Create<LookAtCamera>(10.0f); PtrView->SetCamera(PtrLookAtCamera); PtrLookAtCamera->SetEye(Vec3(0.0f, 5.0f, -20.0f)); PtrLookAtCamera->SetAt(Vec3(0.0f, 0.0f, 0.0f)); } else { PtrView->SetCamera(bkCamera); } //マルチライトの作成 auto PtrMultiLight = CreateLight<MultiLight>(); //デフォルトのライティングを指定 PtrMultiLight->SetDefaultLighting(); //シャドウマップのライトの高さを調整(ステージが広いため) Shadowmap::SetLightHeight(50.0f); }
CObjectRotateCamera::CObjectRotateCamera() { m_axisX = Point3(1, 0, 0); m_axisY = Point3(0, 1, 0); m_axisZ = Point3(0, 0, 1); m_anglex = 0; m_anglez = 0; m_radius = 10; SetLookat(0, 0, 0); m_center = Point3(0, 0, 0); vUpVec = D3DXVECTOR3(0, 0, 1); Point3 eye = Angle2Pos(m_anglex, m_anglez); SetEye(eye.x, eye.y, eye.z); m_lastDown[0] = false; m_lastDown[1] = false; m_lastx = 0; m_lasty = 0; }
void Camera::MoveTo(const Vector3& pv){ Vector3 dv = pv - m_Eye; SetEye(pv); m_Lookat += dv; SetView(m_Eye, m_Lookat, m_Up); }
void CObjectRotateCamera::SetRadius(float r) { m_radius = r; Point3 eye = Angle2Pos(m_anglex, m_anglez); SetEye(eye.x, eye.y, eye.z); }
int main( int argc, char *argv[] ) { GLFWwindow *window; int Edit; //File name to load string fileName; //whether name inputtted is valid bool validFile = false; //Try to determine file input while(validFile == false) { printf("Type the file to load (Special options: 'd' = default, 'c' = clean):\n"); scanf("%s", &fileName[0]); ifstream toLoad(&fileName[0]); validFile = toLoad.good(); //If 'c' was entered, then load a clean level if(strcmp(&fileName[0], "c") == 0) { printf("Loading clean level...\n"); fileName = "clean"; validFile = true; } //If 'd' was entered, then deafult level else if(strcmp(&fileName[0], "d") == 0) { printf("Loading default level...\n"); fileName = "default"; validFile = true; } else if(validFile == false) { printf("Bad file, please type another file to load.\n"); } else if(validFile == true) { toLoad.close(); } } //Determine mode printf("Type 0 to play, any other int to edit\n"); scanf("%i", &Edit); glfwSetErrorCallback(glfwError); if (!glfwInit()) { exit(EXIT_FAILURE); } //If Edit Mode if(Edit) { //World Edit Init //initWorldEdit(window); window = glfwCreateWindow(800, 800, "World Editor", NULL, NULL); if (!window) { glfwTerminate(); exit(EXIT_FAILURE); } srand(time(0)); glfwMakeContextCurrent(window); glfwSetWindowPos(window, 80, 80); glfwSetWindowSizeCallback(window, glfwWindowResize); glfwSetWindowSize(window,1600,800); g_height =800; g_width = 1600; setDistance(7); SetEdit(1); paused = false; glfwSetKeyCallback( window, glfwEditKeyPress); glfwSetCursorPosCallback( window, glfwEditGetCursorPos ); glfwSetMouseButtonCallback( window, glfwEditMouse ); glfwSetScrollCallback( window, glfwEditScroll ); glewInit(); glInitialize(window); physicsInit(); InitGeom(); initLevelLoader(); loadLevel(fileName); } //If Play Mode else { //Game Play Init //initGamePlay(window); window = glfwCreateWindow(800, 800, "Grapple", NULL, NULL); if (!window) { glfwTerminate(); exit(EXIT_FAILURE); } srand(time(0)); SetEye(vec3(0, 0, 0)); glfwMakeContextCurrent(window); glfwSetWindowPos(window, 80, 80); glfwSetWindowSizeCallback(window, glfwWindowResize); glfwSetWindowSize(window,1600,800); g_height =800; g_width = 1600; setDistance(10); paused = false; glfwSetKeyCallback(window, glfwGameKeyPress); glfwSetCursorPosCallback( window, glfwGameGetCursorPos ); glewInit(); glInitialize(window); physicsInit(); InitGeom(); initLevelLoader(); loadLevel(fileName); } ShadowMap *shadowMap = new ShadowMap(); if (shadowMap->MakeShadowMap(g_width, g_height) == -1) { printf("SHADOW MAP FAILED\n"); exit(EXIT_FAILURE); } // Start the main execution loop. while (!glfwWindowShouldClose(window)) { glfwPollEvents(); if(Edit) { if(paused == false) { //Keep the cursor centered glfwSetCursorPos(window,g_width/2,g_height/2); renderScene(window, shadowMap); glfwEditGetCursorPos(NULL,g_width/2.0,g_height/2.0); //glfw Game Keyboard glfwEditKeyboard(); } } else { if(paused == false) { //player appy physics controls SetLookAt(glm::vec3(physGetPlayerX(),physGetPlayerY(),physGetPlayerZ())); SetSpeed(.05*magnitude(getPlayerSpeed())); //Keep the cursor centered glfwSetCursorPos(window,g_width/2,g_height/2); physStep(); //Draw stuff renderScene(window, shadowMap); glfwGameGetCursorPos(NULL,g_width/2.0,g_height/2.0); //glfw Game Keyboard glfwGameKeyboard(); } } usleep(15000); } // Clean up after GLFW. glfwDestroyWindow(window); glfwTerminate(); exit(EXIT_SUCCESS); }
void MyCamera::Update(){ auto CntlVec = App::GetApp()->GetInputDevice().GetControlerVec(); //前回のターンからの時間 float ElapsedTime = App::GetApp()->GetElapsedTime(); if (CntlVec[0].bConnected){ Vector3 NewAt(0, 0, 0); auto TargetPtr = GetTargetObject(); if (TargetPtr){ //目指したい場所 Vector3 ToAt = TargetPtr->GetComponent<Transform>()->GetPosition(); NewAt = Lerp::CalculateLerp(GetAt(), ToAt, 0, 1.0f, m_ToTargetLerp, Lerp::Linear); } //ステップ1、注視点と位置の変更 Vector3 Span = GetAt() - GetEye(); Vector3 NewEye = NewAt - Span; SetAt(NewAt); SetEye(NewEye); //ステップ2、ズームの変更 //カメラ位置と注視点の間のベクトルを算出 Span = GetAt() - GetEye(); //正規化 Span.Normalize(); //変化値の決定 Span = Span * ElapsedTime * 10.0f; Vector3 NewArm = GetAt() - GetEye(); //Dパッド下 //カメラを引く if (CntlVec[0].wButtons & XINPUT_GAMEPAD_DPAD_DOWN){ //カメラ位置を引く NewEye = NewEye - Span; NewArm = NewAt - NewEye; if (NewArm.Length() > (GetFar() * 0.1f)){ NewEye = NewEye + Span; NewArm = NewAt - NewEye; } } //Dパッド上 //カメラを寄る if (CntlVec[0].wButtons & XINPUT_GAMEPAD_DPAD_UP){ //カメラ位置を寄る NewEye = NewEye + Span; NewArm = NewAt - NewEye; if (NewArm.Length() < GetNear() * 2.0f){ NewEye = NewEye - Span; NewArm = NewAt - NewEye; } } SetAt(NewAt); SetEye(NewEye); //ステップ3角度の変更 //現在のAtとEyeの角度を得る Vector3 ArmInv = GetEye() - GetAt(); //右スティックX方向 FLOAT AngleY = 0; //右スティックY方向 FLOAT AngleX = 0; FLOAT AngleZ = 0; if (CntlVec[0].fThumbRX != 0){ //右スティックを聞かないようにする // AngleY = -CntlVec[0].fThumbRX * ElapsedTime; } if (CntlVec[0].fThumbRY != 0){ //右スティックを聞かないようにする // AngleX = CntlVec[0].fThumbRY * ElapsedTime; // AngleZ = CntlVec[0].fThumbRY * ElapsedTime; } if (ArmInv.z > 0){ AngleX *= -1.0f; } if (ArmInv.x < 0){ AngleZ *= -1.0f; } Quaternion QtSpan(AngleX, AngleY, AngleZ); QtSpan.Normalize(); //回転先計算の行列を作成 Matrix4X4 Mat, Mat2; Mat.STRTransformation( Vector3(1.0f, 1.0f, 1.0f), ArmInv, QtSpan); Mat2.TranslationFromVector(GetAt()); Mat *= Mat2; NewEye = Mat.PosInMatrix(); if (NewEye.y < 0.5f){ NewEye.y = 0.5f; } //カメラが一定以上、上から視線にならなように調整 ArmInv = NewEye - GetAt(); ArmInv.Normalize(); float y2 = ArmInv.y * ArmInv.y; float x2 = ArmInv.x * ArmInv.x; float z2 = ArmInv.z * ArmInv.z; if (y2 <= (x2 + z2)){ SetEye(NewEye); } } Camera::Update(); }
void cCamera::SetEye(const float & _x, const float & _y, const float & _z) { SetEye(D3DXVECTOR3(_x, _y, _z)); }