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


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 ?

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

你可能混淆了"window"坐标和"世界"坐标。在您的示例中,finalPositionMin不在世界空间中,它在剪辑空间中。为了获得世界空间坐标,你需要将modelVertices乘以模型矩阵,除此之外别无其他。注意,视图矩阵(view1)从转换世界空间视图空间。投影矩阵(projection1)从变换view spaceto剪辑空间。使用透视分割,你可以从转换剪辑空间一个标准化的设备坐标。
获取窗口坐标("pixel"坐标)你必须"项目";视口上的NDC (width,height是视口的大小):

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

最新更新