相機坐標系與世界坐標系的理解與應用

一、什麼是相機坐標系?

相機坐標系,又稱為相機空間坐標系,是指相機內部的坐標系,通常原點位於相機的光心位置。在相機坐標系中,其它的參數都是針對相機而言的,例如相機的焦距、光圈、透視投影矩陣等。

在OpenGL等圖形學API中,我們常用3個向量表示相機坐標系的狀態,即相機位置向量(eye)、相機視線向量(center)和相機上方向量(up)。根據這三個向量,可以構建出一個正交或投影的相機坐標系,以此來描述相機內部場景的設置和視角。

視圖變換部分代碼示例:
mat4 view = lookAt(eye, center, up);

二、什麼是世界坐標系?

世界坐標系是指整個場景的坐標系,所有的物體都是相對於這個坐標系而言的。在OpenGL等圖形學API中,我們常用世界坐標系來描述場景的配置和物體的定位。在這個坐標系中,相機的位置和姿態通常是已知的,所以我們在建立物體的模型坐標系時,可以很方便地將其附加在世界坐標繫上。

模型矩陣變換部分代碼示例:
mat4 model = translate(mat4(1.0f), vec3(0.0f, 0.0f, 0.0f));
model = scale(model, vec3(1.0f, 1.0f, 1.0f));
model = rotate(model, radians(angle), axis);

三、相機坐標系與世界坐標系的關係

相機坐標系與世界坐標系之間的轉換是圖形學應用中非常重要的一個問題。相機坐標系通常需要通過透視矩陣(Perspective Matrix)或正交矩陣(Orthogonal Matrix)來進行轉換,而世界坐標系則通常需要用到模型矩陣(Model Matrix)。

在OpenGL中,我們通過將不同的矩陣相乘,來實現對相機坐標系和世界坐標系的轉換。具體的計算方式可以參考下面的代碼示例:

視圖變換部分代碼示例:
mat4 view = lookAt(eye, center, up);

透視投影矩陣部分代碼示例:
mat4 proj = perspective(radians(45.0f), (float)width / (float)height, 0.1f, 100.0f);

模型矩陣變換部分代碼示例:
mat4 model = translate(mat4(1.0f), vec3(0.0f, 0.0f, 0.0f));
model = scale(model, vec3(1.0f, 1.0f, 1.0f));
model = rotate(model, radians(angle), axis);

最終變換矩陣部分代碼示例:
mat4 mvp = proj * view * model;

四、相機坐標系與世界坐標系的應用

相機坐標系與世界坐標系的概念在計算機圖形學中有著非常廣泛的應用。例如,我們可以利用相機坐標系的變換來動態地改變場景的視角,並在屏幕上渲染出預期的效果;而在計算機視覺處理中,我們也可以將相機坐標系和世界坐標系用於圖像的校正、姿態的計算等。

下面是一個例子,演示了如何利用OpenGL中的相機坐標系和世界坐標系,來繪製出一個基本的紋理立方體:

// 創建立方體的頂點和紋理坐標
float vertices[] = {
    // 頂點坐標         // 紋理坐標
    -1.0f, -1.0f, -1.0f,  0.0f, 0.0f,
     1.0f, -1.0f, -1.0f,  1.0f, 0.0f,
     1.0f,  1.0f, -1.0f,  1.0f, 1.0f,
     1.0f,  1.0f, -1.0f,  1.0f, 1.0f,
    -1.0f,  1.0f, -1.0f,  0.0f, 1.0f,
    -1.0f, -1.0f, -1.0f,  0.0f, 0.0f,

    // 更多的頂點和紋理坐標,省略...

};

// 創建立方體的VAO和VBO
unsigned int VAO, VBO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float)));
glEnableVertexAttribArray(1);

// 載入立方體的紋理
unsigned int texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
int width, height, nrChannels;
unsigned char *data = stbi_load("container.jpg", &width, &height, &nrChannels, 0);
if (data)
{
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
    glGenerateMipmap(GL_TEXTURE_2D);
}
else
{
    std::cout << "Failed to load texture" << std::endl;
}
stbi_image_free(data);

// 圖形渲染循環
while (!glfwWindowShouldClose(window))
{
    // 處理輸入事件
    processInput(window);

    // 渲染背景色和立方體
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // 應用相機坐標系和世界坐標系的變換
    mat4 view = lookAt(eye, center, up);
    mat4 proj = perspective(radians(45.0f), (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 100.0f);
    mat4 model = mat4(1.0f);
    mat4 mvp = proj * view * model;
    ourShader.setMat4("mvp", mvp);

    // 繪製立方體
    glBindTexture(GL_TEXTURE_2D, texture);
    glBindVertexArray(VAO);
    glDrawArrays(GL_TRIANGLES, 0, 36);

    // 交換緩衝區並檢查事件
    glfwSwapBuffers(window);
    glfwPollEvents();
}

五、總結

相機坐標系與世界坐標系的概念在計算機圖形學和計算機視覺領域有著廣泛的應用,尤其對於那些需要對物體姿態、視角、紋理等進行處理的應用來說,更是不可或缺的基礎概念。因此,深入理解這兩個坐標系的原理和應用,對於圖形學和視覺處理領域的學習和應用有著重要的啟發意義。

原創文章,作者:LBTKP,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/333524.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
LBTKP的頭像LBTKP
上一篇 2025-02-01 13:34
下一篇 2025-02-01 13:34

相關推薦

  • Python快捷:走進Python快速編程世界

    Python作為一種高級編程語言,近年來備受關注。其主張簡單明了、易於閱讀的語法,以及豐富的庫和模塊,使其成為了全球程序員愛寵。在Python中,快捷編程的理念極為重要,使得開發者…

    編程 2025-04-27
  • 雙目相機及其應用

    一、雙目相機的基本概念 雙目相機由兩個攝像頭構成,模擬人類兩隻眼睛觀察世界的方式。雙目相機可獲得豐富的深度信息,適用於三維視覺、立體測量、目標檢測等領域。 雙目相機的核心技術是立體…

    編程 2025-04-25
  • 火星坐標系與wgs84關係

    一、火星坐標系簡介 火星坐標系(Mars Geodetic Datum)是指在地球外星球(例如火星)上建立的以該星球自轉軸為Z軸、過赤道與某子午線相交於X、Y軸的右手直角坐標系。而…

    編程 2025-04-24
  • Android相機應用的開發

    一、基本介紹 Android相機應用是移動設備拍攝和錄製視頻的主要途徑,它可以讓用戶使用相機來拍攝照片、錄製視頻、使手機成為一個掃描儀,掃描條形碼等。 Android中使用相機應用…

    編程 2025-04-24
  • 全面解析B站(嗨豆世界)

    一、B站簡介 B站(Bilibili)成立於2009年6月26日,曾名「嗶哩嗶哩彈幕網」,是一個以ACG(動畫、漫畫、遊戲)為主要內容的彈幕視頻分享網站。B站提供的彈幕評論、UP主…

    編程 2025-04-24
  • 小程序編輯器: 進入小程序世界的第一步

    如今,小程序已經成為了各種企業和個人推廣、銷售、服務的一個重要載體。而小程序編輯器則是進入小程序開發的第一步,成為了各種小程序開發者的必備工具。 本文將從多個方面對小程序編輯器進行…

    編程 2025-04-22
  • 導航坐標系

    導航坐標系是一個重要的概念,在現代導航系統中得到了廣泛應用。在本文中,我們將從多個方面詳細介紹導航坐標系。 一、坐標系的定義 坐標系是一個三維空間內的標誌系統,它用於描述物體在該空…

    編程 2025-04-18
  • 相機模型

    相機模型是計算機視覺領域中的一個重要概念,它描述了相機如何將三維空間中的物體投影到二維平面上。了解相機模型對於進行投影變換、計算相機參數、三維重建等任務具有重要意義。 一、針孔相機…

    編程 2025-04-02
  • C++隨機 – 讓程序的世界變得更加豐富多彩

    一、隨機數的基本概念 隨機性是程序中一個非常重要的概念,在很多場景中,隨機性是實現某些功能或達到某些效果的必要條件。那麼什麼是隨機數呢? 隨機數是程序在運行時根據某種隨機性產生的數…

    編程 2025-02-25
  • Matlab相機標定的探究

    一、相機標定介紹 相機標定是指確定相機內外參數的過程,其目的是為了在圖像空間和世界空間之間建立映射關係,將圖像空間中的坐標轉化為世界空間中的坐標,從而提取出圖像中物體的信息。相機標…

    編程 2025-02-25

發表回復

登錄後才能評論