为什么相机视图矩阵不改变点的位置

Why is the camera view matrix not changing the position of the point

glm::vec3 Position(0, 0, 500);
glm::vec3 Front(0, 0, 1);
glm::vec3 Up(0, 1, 0);

glm::vec3 vPosition = glm::vec3(Position.x, Position.y, Position.z);
glm::vec3 vFront = glm::vec3(Front.x, Front.y, Front.z);
glm::vec3 vUp = glm::vec3(Up.x, Up.y, Up.z);
glm::mat4 view1 = glm::lookAt(vPosition, vPosition + vFront, vUp);


glm::mat4 projection1 = glm::perspective(glm::radians(45.0f), (float)1920 / (float)1080, 0.1f, 1000.0f);

   glm::mat4 VPMatrix = projection1 * view1;    

float testZ = 0.0f;
glm::vec3 modelVertices(-50.0f, 50.0f, testZ);
glm::vec4 finalPositionMin = VPMatrix * glm::vec4(modelVertices, 1.0);
Print() << finalPositionMin.x;

在代码中,如果我更改透视的 FOV 值,那么会影响在屏幕上绘制的对象,对于较小的值,对象在屏幕上的大小会增加。

  1. FOV 值为 45 时,finalPositionMin.x 为 -50
  2. FOV 值为 25 时,finalPositionMin.x 为 -126

但是如果我将相机移动到更靠近物体的位置,那也应该会影响物体,而我们离物体越近,finalPositionMin.x 应该会受到影响。

为什么更改相机 Z 位置的值不会影响对象的 finalPositionMin.x?

要获得笛卡尔坐标,您需要将 xyz 分量除以 w 分量。你必须打印 finalPositionMin.x/finalPositionMin.w.

您可能混淆了“window”坐标和“世界”坐标。在您的示例中,finalPositionMin 不在世界 space 中,而是在片段 space 中。要获得世界 space 坐标,您需要将 modelVertices 乘以模型矩阵,但仅此而已。 请注意,视图矩阵 (view1) 将 世界 space 转换为 视图 space。投影矩阵 (projection1 视图 space 转换为 剪辑 space。使用透视划分,您可以将 剪辑 space 转换为 标准化设备坐标。
要获得 window 坐标(“像素”坐标),您必须将 NDC“投影”到视口(widthheight 是视口的大小):

x = width * (ndc.x+1)/2
y = height * (1-ndc.y)/2