【问题标题】:Why is the camera view matrix not changing the position of the point为什么相机视图矩阵不改变点的位置
【发布时间】:2021-10-23 02:46:52
【问题描述】:
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?

【问题讨论】:

  • 您必须打印finalPositionMin.x/finalPositionMin.w。要获得笛卡尔坐标,需要将 x、y 和 z 分量除以 w 分量。
  • @Rabbid76 这会给我在 NDC 中的价值,但如果我想知道 x 的世界空间中的价值是什么。
  • 在您的示例中,finalPositionMin 不在世界空间中,而是在剪辑空间中。要获得世界空间坐标,您需要将modelVertices 乘以模型矩阵,但仅此而已。 view1世界空间变换到视图空间。 projection1视图空间转换为剪辑空间。
  • 透视分割变换剪辑空间 ndc。
  • 您可能会混淆“窗口”坐标和“世界”坐标。要获得窗口坐标(“像素”坐标),您必须在视口上“投影”ndc。 x = width * (ndc.x+1)/2, y = height * (1-ndc.y)/2

标签: c++ opengl glm-math


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多