c++ - OpenGL正交相机缩放无法正常工作
问题描述
我为我的场景实现了一个小的 2d 相机。问题是,如果我尝试缩放相机,一些如何向左和向下移动而不是放大(每个对象向上和向右移动)。我不确定我做错了什么。
相机.cpp:
void Camera2D::zoom(float zoomFactor)
{
scale = glm::scale(scale, glm::vec3(zoomFactor, zoomFactor, 0));
updateMatrix();
}
void Camera2D::updateMatrix()
{
translate = glm::translate(glm::mat4(1.f) , glm::vec3(-400, -300, 0));//zoom from center of
screen
view = translate * scale;
translate = glm::translate(glm::mat4(1.f), glm::vec3(0, 0, 0));
view = translate * scale;
}
我将 mvp 矩阵发送到着色器,如下所示:投影 * 视图 * 模型。缩放系数仅为 1.001。
解决方案
我假设您使用正交投影,左下角是 (0, 0),右上角是 (800, 300)。
所以视图的中心是 (400, 300)。
如果要围绕正交投影的中心缩放视图,则必须:
- 将中心转换为原点。这意味着平移 (-400, -300)。
- 缩放(比例)
- 将原点翻译回中心。这是 (400, 300) 的翻译。
void Camera2D::updateMatrix()
{
glm::vec3 center(400.0f, 300.0f, 0.0f);
glm::mat4 view = glm::translate(glm::mat4(1.0f), center) *
scale *
glm::translate(glm::mat4(1.0f), -center);
}
推荐阅读
- c - 尝试在循环语句内的开关中获取多个输入时出错
- python - 有人可以解释一下 __init 或 __init__ 有什么区别(一个之前只有两个下划线,另一个有四个下划线)?
- inno-setup - 威瑞信时间戳服务器是否已关闭?
- pytorch - 如何从 Transformer 中减少 Helsinki-NLP/opus-mt-es-en(翻译模型)的推理时间
- reactjs - 列表中的每个孩子都应该有一个唯一的“关键”道具。如何知道使用单词“key”而不是“key2”
- python - Python3 Playsound Tkinter 代码未按预期顺序运行
- android - Android:Livedata Observer 永远不会被调用,recylerview 列表永远不会提交,navgraphviewmodel
- python - 在 Python 中模拟多个给定多个概率的最快方法?
- java - AAPT:错误:找不到属性 startIconDrawable
- php - 在 Woocommerce 中的特定国家/地区的购物车和结帐总额后显示文本