补充完整代码,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; }
时间: 2023-07-16 22:15:10 浏览: 177
这个函数的代码有些问题,需要进行修改。下面是我修改后的代码:
```
Eigen::Matrix4f myLookAt(float ex, float ey, float ez, float atx, float aty, float atz, float upx, float upy, float upz) {
Eigen::Vector3f eye(ex, ey, ez);
Eigen::Vector3f at(atx, aty, atz);
Eigen::Vector3f up(upx, upy, upz);
Eigen::Vector3f z = (eye - at).normalized();
Eigen::Vector3f x = up.cross(z).normalized();
Eigen::Vector3f y = z.cross(x).normalized();
Eigen::Matrix4f m;
m << x.x(), x.y(), x.z(), -x.dot(eye),
y.x(), y.y(), y.z(), -y.dot(eye),
z.x(), z.y(), z.z(), -z.dot(eye),
0, 0, 0, 1;
return m;
}
```
这个函数使用欧几里得空间的方法来计算摄像机的观察矩阵。它使用了向量的叉积和点积来计算摄像机的方向和位置,并将它们放入一个 4x4 矩阵中。
相关问题
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; }
这段代码存在一些问题,需要进行修改和补充。根据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。
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();补充完整函数
以下是补充完整的函数:
```
Eigen::Matrix4f myLookAt(float ex, float ey, float ez, float atx, float aty, float atz, float upx, float upy, float upz) {
Eigen::Vector3f eye(ex, ey, ez);
Eigen::Vector3f target(atx, aty, atz);
Eigen::Vector3f up(upx, upy, upz);
Eigen::Vector3f zaxis = (eye - target).normalized();
Eigen::Vector3f xaxis = up.cross(zaxis).normalized();
Eigen::Vector3f yaxis = zaxis.cross(xaxis);
Eigen::Matrix4f view_matrix;
view_matrix << xaxis.x(), yaxis.x(), zaxis.x(), 0,
xaxis.y(), yaxis.y(), zaxis.y(), 0,
xaxis.z(), yaxis.z(), zaxis.z(), 0,
-xaxis.dot(eye), -yaxis.dot(eye), -zaxis.dot(eye), 1;
return view_matrix;
}
```
此函数实现了OpenGL中的lookAt函数,返回一个观察矩阵。其中,ex、ey、ez为相机位置坐标,atx、aty、atz为相机看向的目标点坐标,upx、upy、upz为相机向上方向的向量坐标。函数首先计算出相机坐标系的三个轴向量,然后将其组合成一个四维矩阵返回。
阅读全文