📜  摄影机机制(1)

📅  最后修改于: 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应用程序和游戏的基础之一。