📅  最后修改于: 2023-12-03 14:54:45.184000             🧑  作者: Mango
摄影机机制是计算机图形学中的一个重要主题,它涉及到虚拟摄影机的模拟和应用,包括摄像机姿态的描述和更改、镜头的类型和参数、摄像机的投影方式和视锥体、图像剪裁等。
摄像机姿态是描述摄像机方向、位置、朝向等属性的概念。它通常由一个三维坐标系和一个相机位置描述。摄像机可以朝向物体,拍摄物体的不同部位,可以从不同位置拍摄同一个物体,也可以同时捕捉多个物体。
代码片段:
struct Camera {
glm::vec3 position;
glm::vec3 front;
glm::vec3 up;
glm::vec3 right;
glm::mat4 getViewMatrix() {
return glm::lookAt(position, position + front, up);
}
};
在现实世界中,镜头有不同的焦距和光圈,这些参数会影响到照片的成像效果。同样地,虚拟摄像机的镜头也有相关的参数,例如焦距、透视投影和正交投影模式等。
代码片段:
struct Camera {
...
float zoom = 45.0f;
float aspectRatio = 16.0f / 9.0f;
float nearPlane = 0.1f;
float farPlane = 100.0f;
glm::mat4 getProjectionMatrix() {
return glm::perspective(glm::radians(zoom), aspectRatio, nearPlane, farPlane);
}
};
视锥体是一个有限空间,它定义了视图的可见区域。在视锥体中的所有物体(处于其内部或部分交错)将出现在图像中。视锥体可以被定义为六个平面的空间形状,通常使用一个六面体体积表示,其中每个侧面都通过极端和摄像机位置来作为顶点。
代码片段:
struct Frustum {
glm::vec4 planes[6];
void update(const glm::mat4& vpMatrix) {
// Left plane
planes[0] = glm::row(vpMatrix, 3) + glm::row(vpMatrix, 0);
// Right plane
planes[1] = glm::row(vpMatrix, 3) - glm::row(vpMatrix, 0);
// Bottom plane
planes[2] = glm::row(vpMatrix, 3) + glm::row(vpMatrix, 1);
// Top plane
planes[3] = glm::row(vpMatrix, 3) - glm::row(vpMatrix, 1);
// Near plane
planes[4] = glm::row(vpMatrix, 3) + glm::row(vpMatrix, 2);
// Far plane
planes[5] = glm::row(vpMatrix, 3) - glm::row(vpMatrix, 2);
}
};
当计算机绘制三维场景时,在屏幕上只需要显示部分场景。因此,绘制前需要检查哪些部分在视锥体之外然后排除它们。这个过程称为“裁剪”或“剪裁”。图像剪裁是实现剪裁的过程,并被应用于视锥体内的几何形状,以确保最终的绘制只涉及可见部分。
代码片段:
void Renderer::clipPolygon(Polygon& polygon) {
for (int i = 0; i < clippingPlanesCount; i++) {
const glm::vec3& normal = clippingPlanes[i].normal;
const float distance = clippingPlanes[i].distance;
bool outside = true;
for (const glm::vec3& vertex : polygon.vertices) {
if (glm::dot(vertex, normal) - distance >= 0.0f) {
outside = false;
break;
}
}
if (outside) return;
}
// Polygon is visible, continue drawing...
}
总体而言,摄影机机制是计算机图形学中的重要领域,是实现许多3D应用程序和游戏的基础之一。