提示コードのコメント部内部のコードですがFPSゲームで座標(0,0,0)の時に例えば左に向けている時に右キーを押すとワールド空間でいうところのZ軸マイナス方向に向かって進といった処理を実装したいのですがこれはどうすれば実装できるのでしょうか?ベクトルの求め方がわかりません。
※ 前が-Z 左が-X の上が+Y の座標形です。
Main.cpp
#include "../header/FrameWork.hpp" #include "../header/Resource.hpp" #include <iostream> #include "../header/Camera.hpp" int main() { FrameWork::Init(glm::ivec2(800, 600), glm::ivec2(4, 2), "FrameWork"); // 初期化 FrameWork::Camera::Init(); //カメラ初期化 FrameWork::ObjFile cubeFile; FrameWork::D3::LoadObj("Model/Cube.obj", cubeFile); FrameWork::D3::Object cube(cubeFile); FrameWork::ObjFile groundFile; FrameWork::D3::LoadObj("Model/ground.obj", groundFile); FrameWork::D3::Object ground(groundFile); float z = 0; float x = 0; float angleY = 0; float angleX = 0; float vecSpeed = PI / 1000; float moveSpeed = 5; glm::ivec2 prevPos = FrameWork::windowContext->getMousePos(); glm::ivec2 nowPos; glm::vec3 cameraPos = glm::vec3(100, 0, 300); while (*FrameWork::windowContext) { FrameWork::windowContext->FrameUpdate(glm::vec4(0, 0, 0, 255)); nowPos = FrameWork::windowContext->getMousePos(); glm::vec2 vec = nowPos - prevPos; vec.x = vec.x * vecSpeed; vec.y = -vec.y * vecSpeed; glm::vec3 moveVec = glm::vec3(cos(vec.x) * cos(vec.y), sin(vec.y), sin(vec.x) * cos(vec.y)); //カメラ向き if (FrameWork::windowContext->getKeyInput(GLFW_KEY_A) > (short)0) { angleY = 0.001; cube.setRotate(glm::vec3(0, 1, 0), angleY); } else if (FrameWork::windowContext->getKeyInput(GLFW_KEY_D) > (short)0) { angleY = -0.001; cube.setRotate(glm::vec3(0, 1, 0), angleY); } else if (FrameWork::windowContext->getKeyInput(GLFW_KEY_W) > (short)0) { angleY = 0.001; cube.setRotate(glm::vec3(1, 0, 0), angleY); } else if (FrameWork::windowContext->getKeyInput(GLFW_KEY_S) > (short)0) { angleY = -0.001; cube.setRotate(glm::vec3(1, 0, 0), angleY); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////// //カメラ移動 if (FrameWork::windowContext->getKeyInput(GLFW_KEY_LEFT) > (short)0) { x += -moveSpeed; cameraPos.x += moveVec.x * 10; cameraPos.z += moveVec.z * 10; // printf("left\n"); // printf("%f , %f \n",x,y); } else if (FrameWork::windowContext->getKeyInput(GLFW_KEY_RIGHT) > (short)0) { x += moveSpeed; // printf("right\n"); // printf("%f , %f \n",x,y); cameraPos.x += moveVec.x * 10; cameraPos.z += moveVec.z * 10; } if (FrameWork::windowContext->getKeyInput(GLFW_KEY_UP) > (short)0) { z += moveSpeed; // printf("up\n"); // printf("%f , %f \n",x,y); cameraPos.x += moveVec.x * 10; cameraPos.z += moveVec.z * 10; } else if (FrameWork::windowContext->getKeyInput(GLFW_KEY_DOWN) > (short)0) { z += -moveSpeed; // printf("down\n"); // printf("%f , %f \n",x,y); cameraPos.x += moveVec.x * 10; cameraPos.z += moveVec.z * 10; } else { } FrameWork::Camera::setLook(glm::vec3(cos(vec.x) * cos(vec.y), sin(vec.y), sin(vec.x) * cos(vec.y))); FrameWork::Camera::setPosition(cameraPos); ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Cube cube.shader->setEnable(); cube.setPosition(glm::vec3(0, 70, 30)); cube.setScale(glm::vec3(30, 30, 30)); // cube.shader->setUniform4f("uFragment",FrameWork::GetGlColor(glm::vec4(0,0,100,255))); cube.shader->setUniform3f("objectColor", glm::vec3(1.0f, 0.5f, 0.31f)); cube.shader->setUniform3f("lightColor", glm::vec3(1.0f, 1.0f, 1.0f)); cube.shader->setUniform3f("lightPos", glm::vec3(0, 0, 0.0f)); cube.shader->setUniform3f("viewPos", FrameWork::Camera::getPosition()); cube.Renderer(); cube.shader->setDisable(); // Ground ground.shader->setEnable(); ground.setPosition(glm::vec3(0, 0, 0)); ground.setScale(glm::vec3(1, 1, 1)); ground.shader->setUniform3f("objectColor", glm::vec3(1.0f, 0.5f, 0.31f)); ground.shader->setUniform3f("lightColor", glm::vec3(1.0f, 1.0f, 1.0f)); ground.shader->setUniform3f("lightPos", glm::vec3(0, 0, 0)); ground.shader->setUniform3f("viewPos", FrameWork::Camera::getPosition()); // ground.shader->setUniform4f("uFragment",FrameWork::GetGlColor(glm::vec4(0,100,0,255))); ground.Renderer(); ground.shader->setDisable(); FrameWork::windowContext->Wait(); FrameWork::windowContext->SwapBuffers(); } return 0; }
> 座標(0,0,0)の時に例えば左に向けている時に右キーを押すとワールド空間でいうところのZ軸マイナス方向に向かって進…
話の前提として
「あなたの考えている世界での座標軸の方向に関する定義」を
まずは与える必要があるのではないでしょうか?
また,「左」とか言われても何がなんだかわかりません.
> Z軸マイナス方向に向かって
という説明と同じように,XYZ軸の話で述べるべきでしょう.
回答1件
あなたの回答
tips
プレビュー