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
不在世界空间中,它在剪辑空间中。为了获得世界空间坐标,你需要将modelVertices
乘以模型矩阵,除此之外别无其他。注意,视图矩阵(view1
)从转换世界空间到视图空间。投影矩阵(projection1
)从变换view spaceto剪辑空间。使用透视分割,你可以从转换剪辑空间到一个标准化的设备坐标。
获取窗口坐标("pixel"坐标)你必须"项目";视口上的NDC (width
,height
是视口的大小):
x = width * (ndc.x+1)/2
y = height * (1-ndc.y)/2