【发布时间】: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 值,这会影响屏幕上绘制的对象,因为较小的值会增加屏幕上的对象大小。
- 在 FOV 值为 45 时,finalPositionMin.x 为 -50
- 在 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