为什么相机视图矩阵不改变点的位置
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 值,那么会影响在屏幕上绘制的对象,对于较小的值,对象在屏幕上的大小会增加。
- FOV 值为 45 时,finalPositionMin.x 为 -50
- FOV 值为 25 时,finalPositionMin.x 为 -126
但是如果我将相机移动到更靠近物体的位置,那也应该会影响物体,而我们离物体越近,finalPositionMin.x 应该会受到影响。
为什么更改相机 Z 位置的值不会影响对象的 finalPositionMin.x?
要获得笛卡尔坐标,您需要将 x
、y
和 z
分量除以 w
分量。你必须打印 finalPositionMin.x/finalPositionMin.w
.
您可能混淆了“window”坐标和“世界”坐标。在您的示例中,finalPositionMin
不在世界 space 中,而是在片段 space 中。要获得世界 space 坐标,您需要将 modelVertices
乘以模型矩阵,但仅此而已。
请注意,视图矩阵 (view1
) 将 从 世界 space 转换为 视图 space。投影矩阵 (projection1
将 从 视图 space 转换为 剪辑 space。使用透视划分,您可以将 从 剪辑 space 转换为 标准化设备坐标。
要获得 window 坐标(“像素”坐标),您必须将 NDC“投影”到视口(width
,height
是视口的大小):
x = width * (ndc.x+1)/2
y = height * (1-ndc.y)/2
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 值,那么会影响在屏幕上绘制的对象,对于较小的值,对象在屏幕上的大小会增加。
- FOV 值为 45 时,finalPositionMin.x 为 -50
- FOV 值为 25 时,finalPositionMin.x 为 -126
但是如果我将相机移动到更靠近物体的位置,那也应该会影响物体,而我们离物体越近,finalPositionMin.x 应该会受到影响。
为什么更改相机 Z 位置的值不会影响对象的 finalPositionMin.x?
要获得笛卡尔坐标,您需要将 x
、y
和 z
分量除以 w
分量。你必须打印 finalPositionMin.x/finalPositionMin.w
.
您可能混淆了“window”坐标和“世界”坐标。在您的示例中,finalPositionMin
不在世界 space 中,而是在片段 space 中。要获得世界 space 坐标,您需要将 modelVertices
乘以模型矩阵,但仅此而已。
请注意,视图矩阵 (view1
) 将 从 世界 space 转换为 视图 space。投影矩阵 (projection1
将 从 视图 space 转换为 剪辑 space。使用透视划分,您可以将 从 剪辑 space 转换为 标准化设备坐标。
要获得 window 坐标(“像素”坐标),您必须将 NDC“投影”到视口(width
,height
是视口的大小):
x = width * (ndc.x+1)/2
y = height * (1-ndc.y)/2