提示コードのif文のキー入力部ですがクォータニオンを用いて立方体の回転を実装しているのですがキーを押しっぱなしにすると微妙に回転が遅くなって止まってしまうのですがこれはどう対処したらいいのでしょうか?等速で回転してくれません。
transform
cpp
1/*############################################################################################ 2# 行列回転 取得 3############################################################################################*/ 4glm::mat4 FrameWork::Transform::getMatRotate()const 5{ 6 if( (rotateOrigin == glm::vec3(0,0,0)) || (rotateVector == glm::vec3(0,0,0)) ) 7 { 8 assert(0 && "Transform::setRotate() (origin == glm::vec3(0,0,0)) || (vec == glm::vec3(0,0,0)"); 9 } 10 11 return glm::mat4(RotationBetweenVectors(rotateOrigin,rotateVector)); 12} 13 14 15/*############################################################################################ 16# 2つのベクトルのなす角 17############################################################################################*/ 18glm::quat FrameWork::Transform::RotationBetweenVectors(glm::vec3 start, glm::vec3 dest)const 19{ 20 start = glm::normalize(start); 21 dest = glm::normalize(dest); 22 23 float cosTheta = glm::dot(start, dest); 24 glm::vec3 rotationAxis; 25 26 if (cosTheta < -1 + 0.001f) 27 { 28 rotationAxis = glm::cross(glm::vec3(0.0f, 0.0f, 1.0f), start); 29 if (glm::length2(rotationAxis) < 0.01) 30 { 31 rotationAxis = glm::cross(glm::vec3(1.0f, 0.0f, 0.0f), start); 32 } 33 34 rotationAxis = glm::normalize(rotationAxis); 35 36 return glm::angleAxis(glm::radians(180.0f), rotationAxis); 37 } 38 39 rotationAxis = glm::cross(start, dest); 40 41 float s = glm::sqrt((1 + cosTheta) * 2); 42 float invs = 1 / s; 43 44 return glm::quat 45 ( 46 s * 0.5f, 47 rotationAxis.x * invs, 48 rotationAxis.y * invs, 49 rotationAxis.z * invs 50 ); 51} 52 53
Player.cpp
cpp
1#include "Player.hpp" 2#include "FrameWork_3D/FrameWork.hpp" 3#include <memory> 4 5Player::Player() 6{ 7 //FrameWork::Resource::LoadModel("asset/model/mesh.fbx"); 8 texture = FrameWork::Resource::LoadTexture("asset/texture/debug.png",aiTextureType_BASE_COLOR); 9 10 model = FrameWork::Resource::LoadModel("asset/model/mesh.fbx"); 11 //model.setVertexBuffer(); 12 13 shader = std::make_shared<FrameWork::Shader>(); 14 shader->Load("asset/shader/3D/texture/BasicTexture.vert", "asset/shader/3D/texture/BasicTexture.frag"); 15 //shader->Load("asset/shader/3D/Monochromatic/BasicMono.vert","asset/shader/3D/Monochromatic/BasicMono.frag"); 16 17// texture = FrameWork::LoadTexture("asset/texture/debug.png", glm::vec2(8, 8)); 18 19 rotate = glm::vec3(0, 1, 0); 20 transform.position = glm::vec3(0, 0, 0); 21 transform.scale = glm::vec3(1,1,1); 22 transform.rotateOrigin = glm::vec3(0,1,0); 23 transform.rotateVector = rotate; 24 25 //transform.rotateOrigin = glm::vec3(1, 0, 0); 26 //transform.rotateVector = glm::vec3(1, 0, 0); 27 28 shader->setVertexAttribute(model->vao,model->vbo, "vertexPosition", 3, sizeof(FrameWork::VertexAttribute), sizeof(float) * 0); 29 shader->setVertexAttribute(model->vao, model->vbo, "vertexUV", 2, sizeof(FrameWork::VertexAttribute), sizeof(float) * 3); 30// shader->setVertexAttribute(sprite.vao, sprite.vbo, "vertexNormal", 3, sizeof(FrameWork::VertexAttribute_Sprite), sizeof(float) * 5); 31 32 //sprite.shader = shader; 33} 34 35void Player::Render(const glm::mat4 view) 36{ 37 shader->setEnable(); 38 39 40 41 if (FrameWork::Window::windowContext->getKeyInput(GLFW_KEY_UP) == true) 42 { 43 rotate.z += 0.01; 44 } 45 46 if (FrameWork::Window::windowContext->getKeyInput(GLFW_KEY_DOWN ) == true) 47 { 48 rotate.z -= 0.01; 49 } 50 51 52 if (FrameWork::Window::windowContext->getKeyInput(GLFW_KEY_RIGHT) == true) 53 { 54 rotate.x += 0.01; 55 } 56 57 if (FrameWork::Window::windowContext->getKeyInput(GLFW_KEY_LEFT ) == true) 58 { 59 rotate.x -= 0.01; 60 } 61 62 std::cout << "rotate.x: " << rotate.x << std::endl; 63 std::cout << "rotate.z: " << rotate.z << std::endl; 64 std::cout <<std::endl; 65 66 67 68 transform.rotateVector = rotate; 69 70 shader->setUniformSampler2D("uImage", 0, texture.getID()); 71 //shader->setUniform4f("uFragment",glm::vec4(1.0,0.0,0.0,0.0)); 72 shader->setUniformMatrix4x4fv("uViewProjection", view); 73 shader->setUniformMatrix4x4fv("uScale", transform.getMatScale()); 74 shader->setUniformMatrix4x4fv("uTranslate", transform.getMatPosition()); 75 shader->setUniformMatrix4x4fv("uRotate", transform.getMatRotate()); 76 model->Render(); 77 78 shader->setDisable(); 79} 80 81void Player::Update() 82{ 83 //sprite.setTexture(0, texture.at(0)); 84} 85 86

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/11/02 03:03
退会済みユーザー
2022/11/02 03:04
2022/11/02 03:07
2022/11/04 03:06