在3D中旋转针孔相机
Rotating a pinhole camera in 3D
我正在尝试在3D空间中旋转针孔相机。我以前对一个房间进行过光线追踪。作为一个好的练习,我先做了数学,然后试着用c++编程。
// Camera position
vec3 cameraPos(0, 0, -19);
// Rotate camera
float& yaw;
vec3 c1(cos(yaw), 0, sin(yaw));
vec3 c2(0, 1, 0);
vec3 c3(-sin(yaw), 0, cos(yaw));
glm::mat3 R(c1, c2, c3);
我所做的旋转相机是这样的:
if (keystate[SDLK_LEFT])
{
//cameraPos.x -= translation;
if (yaw > 0)
{
yaw = 0.01;
}
cout << yaw << endl;
cameraPos = R * cameraPos;
cout << "LEFT" << endl;
}
if (keystate[SDLK_RIGHT])
{
//cameraPos.x += translation;
if (yaw > 0)
{
yaw = -0.01;
}
cout << yaw << endl;
cameraPos = R * cameraPos;
cout << "RIGHT" << endl;
}
我已经将旋转矩阵R与相机位置向量相乘。现在发生的情况是,无论我按什么键,房间都只向左移动。
我下面的教程说:
如果相机被矩阵R旋转,则表示右(x轴)、下(y轴)和前(z轴)方向检索为:
vec3 right(R[0][0],R[0][1],R[0][2]); vec3 down(R[1][0],R[1][1],R[2][2]); vec3 right(R[2][0],R[2][1],R[2][2]);
若要为旋转相机建模,您需要在以下两种情况下都使用这些方向移动摄影机和投射光线时。
我不明白我应该如何使用上述信息。
感谢任何帮助或推荐。
在更改yaw
之后,您似乎没有更新R
矩阵。这意味着每次执行camerapos = R * camerapos
时,都会在一个方向上旋转camerapos
矢量。
更合适的方法是将camerapos分离,每次构建R
,并使用另一个向量作为相机位置的结果。
类似这样的东西:
// Camera position
vec3 cameraPos(0, 0, -19);
vec3 trueCameraPos;
float yaw;
if (keystate[SDLK_LEFT])
{
//cameraPos.x -= translation;
if (yaw > 0)
{
yaw = 0.01;
}
cout << yaw << endl;
cout << "LEFT" << endl;
}
if (keystate[SDLK_RIGHT])
{
//cameraPos.x += translation;
if (yaw > 0)
{
yaw = -0.01;
}
cout << yaw << endl;
cout << "RIGHT" << endl;
}
// Rotate camera
vec3 c1(cos(yaw), 0, sin(yaw));
vec3 c2(0, 1, 0);
vec3 c3(-sin(yaw), 0, cos(yaw));
glm::mat3 R(c1, c2, c3);
trueCameraPos = R * cameraPos;
至于摄影机的定义,摄影机需要三个向量来定义其方向。如果你旋转相机,方向也会旋转,否则你只需要移动相机,它就会一直朝一个方向看。
黄色的定义是不正确的,因为应该有三个垂直向量,通常是向上、向右和向前。现在有两个右向量(一个是down,与up正好相反),所以最后一个应该是forward向量。
这些矢量定义光线跟踪器中使用的方向。"向前"是光线追踪到的位置,向上和向右定义每个图像像素在图像平面中的位移方向。您很可能已经在跟踪代码中使用了这些。
相关文章:
- 了解 GLM- openGL 中的相机转换
- OpenGL相机和相机空间转型的困惑
- 如何使用按钮更新GTK3图像以使用C++从相机捕获图片
- 通过 API 控制 DJI 相机
- 将相机数据从服务器实时流式传输到客户端
- 来自逆 vp 矩阵和相机位置的光线方向不正确
- OpenCV - Python 断言错误:SAD 算法 - 立体相机视差图计算
- Qt 和 Android - 如何使用 Qandroidjniobject 启动相机
- 在Windows(C++)中使用USB相机拍摄高分辨率照片
- 如何在相机类中添加胶卷
- 强制Qt相机视频格式
- 操纵安卓相机的深度图导致应用程序崩溃
- 深度值没有意义 R200 相机
- Qt QML相机在部署后显示白屏
- Opencv 如何从相机读取单帧
- OpenCV - 来自相机的实时馈送不流畅
- 佳能SDK无法从相机下载图片
- 如何处理来自MIPI相机的12位图像?
- 如何设置vtk相机的正确变焦系数?
- OpenGL 相机移动程序顶点着色器问题