C++ 四元模型的模型视图矩阵

C++ 四元模型的模型视图矩阵,c++,opengl,matrix,graphics,3d,C++,Opengl,Matrix,Graphics,3d,对于我的图形项目,我正在尝试实现一个小地图。与我的普通对象不同,我认为我可以在OpenGL的默认相机坐标系中指定顶点坐标。 所以我的顶点位于(-1,1,0),(1,1,0),(-1,-1,0)和(1,-1,0)。我不使用投影矩阵来计算gl\u位置。如果不使用模型视图矩阵,则带有这4个顶点的四边形将填充整个屏幕(如预期的那样)。现在,我想将这个四边形缩放到100x100像素,并将其放置在视口的右上角,距离视口的边界40 我尝试按如下方式设置模型视图矩阵: // Move to upper righ

对于我的图形项目,我正在尝试实现一个小地图。与我的普通对象不同,我认为我可以在OpenGL的默认相机坐标系中指定顶点坐标。 所以我的顶点位于
(-1,1,0)
(1,1,0)
(-1,-1,0)
(1,-1,0)
。我不使用投影矩阵来计算
gl\u位置
。如果不使用模型视图矩阵,则带有这4个顶点的四边形将填充整个屏幕(如预期的那样)。现在,我想将这个四边形缩放到
100x100
像素,并将其放置在视口的右上角,距离视口的边界
40

我尝试按如下方式设置模型视图矩阵:

// Move to upper right corner - targetDistance
translate(vec3((viewportWidth - targetDistance) / viewportWidth, (viewportHeight - targetDistance) / viewportHeight), 0.0)
// Move upper right corner to origin
* translate(vec3(-0.5*targetWidth / viewportWidth,-0.5*targetHeight / viewportWidth, 0.0)
// Scale to desired size
* scale(vec3(targetWidth / viewportWidth, targetHeight / viewportHeight, 0.0)
相应的CPP代码如下所示(使用glm)


不幸的是,这不起作用。小地图被正确缩放并放在右上角,但与边界没有距离(甚至没有负距离)

我建议使用更简单的方法,而不是摆弄顶点坐标变换?只需将视口本身移动到所需的角和窗口大小:

glViewport(
    lower_left_corner_in_the_window_in_pixels,
    lower_right_corner_in_the_window_in_pixels,
    width_in_pixels,
    height_in_pixels )

如果您最初的想法是“我该怎么做?我在调整大小(重塑)功能中设置了视口”,那么您就做错了。对
glViewport
的所有调用都属于绘图过程,也就是说,应该在依赖于正在设置的视口的OpenGL调用完成之前放置在绘图代码中。

谢谢,这就是我所做的。但是,我在执行此操作之前获取当前视口,并在渲染后恢复它,否则我将不得不到处传递窗口坐标。@某人:传递窗口坐标有什么问题?保存和恢复视口会引入另一个副作用/副通道。一般来说,您希望将节目中的副作用和频道数量降至最低;OpenGL本身已经有大量的副作用/通道,所以最好不要再引入另一个。如果程序允许,那么通过显式传递和设置参数覆盖副作用来堵塞副通道是一件好事。
glViewport(
    lower_left_corner_in_the_window_in_pixels,
    lower_right_corner_in_the_window_in_pixels,
    width_in_pixels,
    height_in_pixels )