OpenGL补充修改下列代码Eigen::Matrix4f myLookAt(float ex, float ey, float ez, float atx, float aty, float atz, float upx, float upy, float upz) { Eigen::Matrix4f m; m.setZero(); mModelView *= m; return m; }
时间: 2024-01-09 18:04:21 浏览: 146
这段代码存在一些问题,需要进行修改和补充。根据OpenGL的标准视图变换函数gluLookAt()的功能,我们需要将眼睛坐标(ex, ey, ez)指向目标点(atx, aty, atz),并且指定上方向向量(upx, upy, upz)。从而生成一个视图矩阵,用于将场景中的对象变换到观察者视角下的坐标系。
修改后的代码如下所示:
```
Eigen::Matrix4f myLookAt(float ex, float ey, float ez, float atx, float aty, float atz, float upx, float upy, float upz) {
Eigen::Vector3f forward = Eigen::Vector3f(atx - ex, aty - ey, atz - ez).normalized();
Eigen::Vector3f up = Eigen::Vector3f(upx, upy, upz).normalized();
Eigen::Vector3f right = forward.cross(up).normalized();
up = right.cross(forward);
Eigen::Matrix4f m;
m << right.x(), up.x(), -forward.x(), 0.0f,
right.y(), up.y(), -forward.y(), 0.0f,
right.z(), up.z(), -forward.z(), 0.0f,
0.0f, 0.0f, 0.0f, 1.0f;
Eigen::Matrix4f translation = Eigen::Matrix4f::Identity();
translation.col(3) << -ex, -ey, -ez, 1.0f;
m = m * translation;
mModelView *= m;
return m;
}
```
这里我们首先计算出视线方向向量、上方向向量和右方向向量,并将它们组合成一个旋转矩阵。然后我们再计算出平移矩阵,将眼睛位置平移到原点处。最后我们将视图矩阵m和模型视图矩阵mModelView相乘,更新模型视图矩阵,并返回视图矩阵m。
阅读全文