c++ - OpenGL:沿该方向旋转和移动
问题描述
我想在它所面对的方向上旋转和移动猫模型。但是,当我旋转猫时,它围绕原点运行,这不是我想要的。演示
我知道计算模型位置的公式是:
// y is the up axis
x = distance * sin(theta);
z = distance * cos(theta);
这是键盘控制功能:
float translate_delta = 0.01f;
float rotate_delta = 0.1f;
int translate_press_num = 0;
int rotate_press_num = 0;
void special_callback(int key, int x, int y)
{
if (key == GLUT_KEY_UP)
{
translate_press_num++;
}
else if (key == GLUT_KEY_DOWN)
{
translate_press_num--;
}
else if (key == GLUT_KEY_LEFT)
{
rotate_press_num--;
}
else if (key == GLUT_KEY_RIGHT)
{
rotate_press_num++;
}
}
这是模型转换:
mat4 model = mat4(1.0f);
float catAngle = rotate_delta * rotate_press_num * -45.0f;
float catX = translate_delta * translate_press_num * sin(catAngle * M_PI / 180);
float catZ = translate_delta * translate_press_num * cos(catAngle * M_PI / 180);
model = glm::translate(mat4(1.0f), vec3(catX, 0.0f, catZ)) *
glm::rotate(mat4(1.0f), rotate_delta * rotate_press_num * glm::radians(-45.0f), vec3(0.0f, 1.0f, 0.0f));
我知道这catAngle
会影响catX
和catZ
旋转时。我尝试了很多次,但我找不到将它们分开的方法。
解决方案
将 cat 位置定义为glm::vec3 catPosition
与您保留其他状态变量相同的位置。
在您的关键回调函数中:
void special_callback(int key, int x, int y) {
float catAngle = rotate_delta * rotate_press_num * -45.0f;
glm::vec3 displacement = translate_delta * glm::vec3(sin(catAngle * M_PI / 180), 0, cos(catAngle * M_PI / 180));
if (key == GLUT_KEY_UP)
{
catPosition += displacement;
}
else if (key == GLUT_KEY_DOWN)
{
catPosition -= displacement;
}
}
模型转换则变为:
mat4 model =
glm::translate(mat4(1.0f), catPosition) *
glm::rotate(mat4(1.0f), rotate_delta * rotate_press_num * glm::radians(-45.0f), vec3(0.0f, 1.0f, 0.0f))
推荐阅读
- c# - “无法加载文件或程序集 'Microsoft.Office.Interop.Excel,版本 = 15.0.0.0,文化 = 中性,PublicKe .....”
- r - 将一个 Dataframe 映射到第二个 Dataframe
- css - 店面子主题仍然加载父 CSS
- laravel-5 - 如何让 laravel 在我的本地服务器上运行
- elasticsearch - 匹配短语查询未按预期工作
- ionic3 - 在 ionic3 中找不到 manifest-merger.jar (com.android.tools.build:manifest-merger:26.0.0)?
- .htaccess - 使用 .htaccess 将所有 url 重定向到 http//www
- java - onCreate() 方法中的 FileNotFoundException
- python - Django REST-Auth 密码重置
- asp.net - 使用点空间重新投影的形状文件与原始文件不同