C++ 在openGL中实现左转功能
基本上,当按下左键(将视图向右旋转)时,我需要正确更改眼睛和上方向向量。我的实现如下,但它似乎没有通过测试。有人能帮忙吗C++ 在openGL中实现左转功能,c++,opengl,C++,Opengl,基本上,当按下左键(将视图向右旋转)时,我需要正确更改眼睛和上方向向量。我的实现如下,但它似乎没有通过测试。有人能帮忙吗 // Transforms the camera left around the "crystal ball" interface void Transform::left(float degrees, vec3& eye, vec3& up) { // YOUR CODE FOR HW1 HERE eye = rotate(degrees,
// Transforms the camera left around the "crystal ball" interface
void Transform::left(float degrees, vec3& eye, vec3& up) {
// YOUR CODE FOR HW1 HERE
eye = rotate(degrees, vec3(0, 1, 0)) * eye;
up = rotate(degrees, vec3(0, 1, 0)) * up;
}
旋转函数采用两个参数degree和axis,并返回旋转矩阵,该矩阵为3乘3矩阵:
mat3 Transform::rotate(const float degrees, const vec3& axis) {
// YOUR CODE FOR HW1 HERE
mat3 rot, I(1.0);
mat3 a_x;
a_x[0][0] = 0;
a_x[0][1] = -axis[2];
a_x[0][2] = axis[1];
a_x[1][0] = axis[2];
a_x[1][1] = 0;
a_x[1][2] = -axis[0];
a_x[2][0] = -axis[1];
a_x[2][1] = axis[0];
a_x[2][2] = 0;
float theta = degrees / 180 * pi;
rot = I * cos(theta) + glm::outerProduct(axis, axis) *(1-cos(theta)) + a_x*sin(theta);
return rot;
}
如果像这样的东西可以修复它,请尝试:
glm::mat3 Transform::rotate(float angle, const glm::vec3& axis) {
glm::mat3 a_x( 0.0f, axis.z, -axis.y,
-axis.z, 0.0f, axis.x,
axis.y, -axis.x, 0.0f);
angle = glm::radians(angle);
return glm::mat3() * cos(angle) + sin(angle) * a_x
+ (1.0f - cos(angle)) * glm::outerProduct(axis, axis);
}
我搜索了一下,找到了一个解决方案:
// Transforms the camera left around the "crystal ball" interface
void Transform::left(float degrees, vec3& eye, vec3& up) {
// YOUR CODE FOR HW1 HERE
eye = eye * rotate(degrees, up);
}
旋转功能正确。您没有提供足够的信息,哪些测试失败?他们怎么会失败?某些测试值的实际和预期输出是什么?你确定
Transform::rotate
返回正确的旋转矩阵吗?我在这里附上了Transform::rotate
的完整实现。这不起作用。而不是平稳地旋转,而是“跳跃”。@YichengYe我在我的程序中测试了这个,它似乎正确地旋转了我的相机。它到底是如何不起作用的(除了“跳跃”可能有完全不同的原因)?它的旋转方向是否错误?它的旋转方向确实正确,但旋转并不平滑,就像每次单击旋转180度一样。