相机 (2)旋转

2023-10-27

1.1 LookAt矩阵

用这3个轴外加一个平移向量来创建一个矩阵,并且你可以用这个矩阵乘以任何向量来将其变换到那个坐标空间
在这里插入图片描述

R是右向量
U是上向量
D是方向向量
P是摄像机位置向量

glm::LookAt函数需要一个位置、目标和上向量以得到观察矩阵。

glm::mat4 view;
view = glm::lookAt(glm::vec3(0.0f, 0.0f, 3.0f), 
           glm::vec3(0.0f, 0.0f, 0.0f), 
           glm::vec3(0.0f, 1.0f, 0.0f));

随时间旋转

float radius = 10.0f;
float camX = sin(glfwGetTime()) * radius;
float camZ = cos(glfwGetTime()) * radius;
glm::mat4 view;
view = glm::lookAt(glm::vec3(camX, 0.0, camZ), glm::vec3(0.0, 0.0, 0.0), glm::vec3(0.0, 1.0, 0.0));

1.2 自由移动

定义摄像机变量

glm::vec3 cameraPos   = glm::vec3(0.0f, 0.0f,  3.0f);
glm::vec3 cameraFront = glm::vec3(0.0f, 0.0f, -1.0f);
glm::vec3 cameraUp    = glm::vec3(0.0f, 1.0f,  0.0f);

view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp);

void processInput(GLFWwindow *window)
{
    ...
    float cameraSpeed = 0.05f; // adjust accordingly
    if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS)
        cameraPos += cameraSpeed * cameraFront;
    if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS)
        cameraPos -= cameraSpeed * cameraFront;
    if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS)
        cameraPos -= glm::normalize(glm::cross(cameraFront, cameraUp)) * cameraSpeed;
    if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS)
        cameraPos += glm::normalize(glm::cross(cameraFront, cameraUp)) * cameraSpeed;
}
  • 移动速度
float deltaTime = 0.0f; // 当前帧与上一帧的时间差
float lastFrame = 0.0f; // 上一帧的时间

在每一帧中我们计算出新的deltaTime以备后用。

float currentFrame = glfwGetTime();
deltaTime = currentFrame - lastFrame;
lastFrame = currentFrame;

void processInput(GLFWwindow *window)
{
  float cameraSpeed = 2.5f * deltaTime;
  ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

相机 (2)旋转 的相关文章

  • 【CocosCreator入门】CocosCreator组件

    Cocos Creator是一款流行的游戏开发引擎 具有丰富的组件和工具 其中TiledMap组件可以帮助开发者快速创建 加载和渲染地图 目录 一 组件介绍 二 组件属性 三 脚本控制 3 1加载地图 3 2渲染地图 四 详细说明 五 关闭
  • 广西高等教育学会高校教育技术委员会莅临瑞云科技考察交流

    2023年3月18日上午11点整 广西高等教育学会高校教育技术专业委员会组织了一批来自广西各院校的专家老师 来到深圳市瑞云科技股份有限公司 以下简称瑞云科技 参观考察 瑞云科技是一家专注为视觉行业提供垂直云计算服务的公司 用户超20万 遍及
  • unity(界面操作)如何打开模型网格

    就一个简单的操作 想不到网上的文章写的这么不清楚 找了半天才找到 误人子弟 我干脆自己写一个 如何在unity看到下面这个模型网格 如图点击
  • GAMES101回顾 -- 光线追踪

    Ray Tracing 光线追踪 实现步骤 发射光线 Ray Generation 光线追踪算法从观察者的视点 如相机位置 发射一条主光线 这条光线的起点是相机位置 方向是从相机位置经过像素位置的射线 光线求交 Ray Object Int
  • Turbo跨平台开源渲染引擎

    Turbo跨平台开源渲染引擎 基于Vulkan开发的跨平台渲染引擎 欢迎来参观 使用 提意见 o o Turbo开源引擎地址 Turbo开源引擎开发记录视频
  • 【OpenGL】笔记五、纹理

    1 流程 1 1 单个纹理 纹理是一个2D图片 甚至也有1D和3D的纹理 它可以用来添加物体的细节 为了能够使用纹理图片 我们需要一个叫做stb image h的头文件库来加载不同格式的图片作为纹理 全部文件 得到该头文件后 加入项目 并且
  • Untiy shader 初学 淡入淡出效果

    Properties MainTex Texture 2D white Range Range Range 0 1 0 FadeRange FadeRange Range 3 100 3 SubShader Tags RenderType
  • Unreal Engine(虚幻引擎)渲染 – 正确使用方法

    我们已经讨论过 Unreal Engine 虚幻引擎 中可用的很多神奇工具 包括最近抢先体验的 Unreal Engine 5 多亏了 Epic 世界各地的开发人员和团队都可以轻松进行游戏开发 Epic 对电影和游戏界的最大贡献可能就是 U
  • BRDF详解(包括:irradiance,radiance,intensity,立体角)

    BRDF BRDF是双向反射分布函数 Bidirectional Reflectance Distribution Function BRDF 用来定义给定入射方向上的辐射照度 irradiance 如何影响给定出射方向上的辐射率 radi
  • Hello Vulkan(五)

    上一期技术分享中 我们讲述了如何关于Vulkan的Data Buffers使用及VMA内存管理器使用 自己创建或使用VMA在显存里创建Buffers 并在CPU进行读取或写入 本期将继续分享关于Vulkan的技术 内容是非常有趣的部分 即
  • 【OpenGL】笔记二十二、面剔除

    1 流程 渲染一个立方体的时候 我们会对它的六个面的点先进行一遍深度测试 如果没有通过的话就是被遮挡了 就不着色 但是仔细想 一个立方体至少会有三个面被遮挡 我们明明知道这一点 却还是要对被遮挡的每个面上的点进行深度测试 这是不是有点浪费时
  • 灯光 (1)平行光(Directional Light)

    1 平行光 Directional Light 定义一个光线方向向量而不是位置向量来模拟一个定向光 着色器的计算基本保持不变 但这次我们将直接使用光的direction向量而不是通过position来计算lightDir向量 struct
  • Dx11--用dx11绘制棱台,并用键盘和鼠标进行旋转缩放操作

    目录 一 索引缓冲区 前言 创建缓冲区 缓冲区的描述 二 常量缓冲区 前言 准备工作 正式初始化 画面更新及其效果 画面更新 效果 三 键盘和鼠标的创建 1 鼠标的创建 2 键盘的创建 3 更新画面 4 消息回调函数 处理键盘鼠标信息 效果
  • 新手LearnOpenGL纹理不显示的部分解决方法

    项目场景 在LearnOpenGL学习中遇到的一些问题 照着写但是纹理加载不出来或者两张纹理只加载一张 问题描述 lt 纹理加载不出来 gt 1 文件路径是否正确 是否输出texture load fail等提示 设置了成功检查才会有提示
  • Vulkan-程序结构

    程序结构 一般来说 完整的Vulkan程序包含 创建Vulkan实例 获取物理设备列表创建逻辑设备 创建命令缓冲 获取设备中支持图形工作的队列 初始化交换链 创建深度缓冲 创建渲染通道 创建帧缓冲 创建绘制对象 初始化渲染管线 创建栅栏和初
  • 水墨Shader解析

    Chinese Ink wash Painting II Shader 简介 本文尝试对Chinese Ink wash Painting II 来源 https www shadertoy com view DdSyDW 的代码部分进行解
  • OpenGL 超级宝典笔记 —— 纹理高级(三)

    纹理组合器 OpenGL 的纹理组合器可以控制多重纹理的片段是如何组合的 一般情况下 我们可以简单的为每个纹理单元设置一个纹理环境模式 GL REPLACE GL DECAL GL ADD 和 GL MODULATE 把每个纹理应用的结果添
  • GLSL (3)输入和输出

    1 in和out 着色器使用in和out两个关键字设定输入和输出 只要一个输出变量与下一个着色器阶段的输入匹配 它就会传递下去 既是一个着色器向另一个着色器发送数据 我们必须在发送方着色器中声明一个输出 在接收方着色器中声明一个类似的输入
  • NeRF学习笔记(含公式、图解和过程)

    NeRF学习笔记 关注公众号 不定期分享NeRF相关文献 引言 NeRF Representing Scenes as Neural Radiance Fields for View Synthesis作为2020年ECCV的一篇论文 在用
  • 蒙特卡洛积分、重要性采样、低差异序列

    渲染公式 渲染的目标在于计算周围环境的光线有多少从表面像素点反射到相机视口中 要计算总的反射光 每个入射方向的贡献 必须将他们在半球上相加 为入射光线 与法线 的夹角 为方便计算可以使用法线向量和入射向量 单位化 的乘积表示 对于基于图像的

随机推荐

  • Python函数常见return返回值类型

    Python函数常见return返回值类型Python函数return返回值类型主要包括 class int class str class tuple class list class dict class bool class None
  • 小明和小强的故事 漫画版

    转载于 https blog 51cto com loofeer 676484
  • 发送arp请求报文

    1 报文格式 2 代码如下 include
  • Python爬虫入门教程(非常详细)

    初学Python之爬虫的简单入门 一 什么是爬虫 1 简单介绍爬虫 爬虫的全称为网络爬虫 简称爬虫 别名有网络机器人 网络蜘蛛等等 网络爬虫是一种自动获取网页内容的程序 为搜索引擎提供了重要的数据支撑 搜索引擎通过网络爬虫技术 将互联网中丰
  • C# 计算两个日期之间的所有日期

    用一个for循环就可以解决 int year Begin Convert ToInt32 this dateBegin Value ToString yyyy int month Begin Convert ToInt32 this dat
  • 解决英文版windows10安装软件中文显示乱码问题

    实验室买了台Thorlabs的设备 配了一台笔记本 带的操作系统是美版的windows10 为了提高笔记本的利用率嘛就在这台笔记本安装了一些中文软件 结果问题就出现了 安装完某些中文软件 能正常打开也能正常操作就是显示的中文乱码 在网上找了
  • [SPSS]系统聚类和kmeans聚类的spss实现——基于多维度对中国各城市聚类

    一 系统聚类 选中系统聚类并把变量移入变量框内 聚类选择按照个案聚类 在Display栏中选择Statistics和Plots复选框 这样在结果输出窗口中可以同时得到聚类结果统计量和统计图 选中绘图中的谱系图 单击保存选项卡 方案范围选择2
  • 教你用go 配置管理神器Viper解析docker-compose文件

    什么是Viper Viper 是一个完整的 Go 应用程序配置解决方案 包括 12 Factor 应用程序 它被设计为在应用程序中工作 并且可以处理所有类型的配置需求和格式 它支持 设置默认值 从 JSON TOML YAML HCL en
  • 后台程序 报错内容:java.sql.SQLException: Java heap space

    原因有以下可能 1 查询没有通过参数 而是直接查询出所有的记录 2 是由于mysql单个字段存储的内容过大导致堆内存溢出 3 JVM启动时 JVM堆会自动设置heap size值 值太小导致
  • 内核LED驱动框架讲解以及led设备注册示例代码

    1 驱动框架介绍 1 内核中驱动部分维护者针对每个种类的驱动设计一套成熟的 标准的 典型的驱动实现 然后把不同厂家的同类硬件驱动中相同的部分抽出来自己实现好 再把不同部分留出接口给具体的驱动开发工程师来实现 这就叫驱动框架 2 内核维护者在
  • 涉密服务器 远程,一种具有远程定位功能的涉密移动存储系统及其实现方法专利_专利查询 - 天眼查...

    1 一种具有远程定位功能的涉密移动存储系统 其特征在于 该系统包括定位管理服 务器和移动存储介质 移动存储介质内设置有移动供电模块 定位通信模块 数据销毁模块 和数据存储模块 移动供电模块分别电连接定位通信模块 数据销毁模块和数据存储模块
  • adworld-pwn-level2

    必要知识点 32位系统函数调用使用堆栈传参 其调用时栈的结构如下 返回地址 gt 参数n gt 参数n 1 gt gt 参数1 将elf文件扔到IDA中 跟进到vulnerable函数 里面有输入函数 可以用来做栈溢出 再看到有system
  • 物联网LoRa系列-19:LoRa终端--射频芯片SX1261 SX1262的6种操作模式及其设置

    本文根据SX1261 2芯片手册 阐述SX161 2射频芯片的8种操作模式及其设置 目录 一 MCU与射频芯片之间的操作接口 二 SX1261 2射频芯片的6种工作模式的含义 三 SX1261 2射频芯片工作模式的设置 四 SX1261 2
  • 数组对象找重复值

    对象内容 let empListData lastName lin phone 154393456 lastName lin phone 154393456 lastName lin phone 154393456 找重方法 let new
  • linux-kali利用BeEF 执行 XSS 攻击

    一 配置靶机环境 1 登录win7靶机 2 访问https www xp cn 下载phpstudy软件 下载最新版的就可以 phpstudy软件可以用来进行站点搭建 3 解压后开始安装phpstudy 4 点击启动Apache服务与MyS
  • 关于 QML Tumbler 自定义日历在响应onWheel事件后,其他原有mouse事件无法响应

    程序是在QWidget窗体上嵌套QML 响应触屏和非触屏上面的一些鼠标滚动 滑动功能 在Tumbler下面的MouseArea中 onWheel响应了鼠标滚轮事件后 原来的其他鼠标事件没响应 help 求指点 工程上传到了百度云 链接 ht
  • 修改JAVA环境变量切换JAVA版本不生效问题

    最近因为项目原因 需要在java8和java11环境来回切换 windows切换环境变量没有Linux简单 通过shell脚本操作也会受到环境变量配置的影响 在修改环境变量来切换java版本时也会时不时出现没有生效的问题 一般出现这种问题
  • 2022年浙江省中职组“网络空间安全”赛项模块B--Linux渗透测试

    2022年中职组浙江省 网络空间安全 赛项 B 2 Linux渗透测试 漏洞原理解析 一 竞赛时间 420分钟 共计7小时 吃饭一小时 二 竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第 阶段 单兵模式系统渗透测试 任务一 Wi
  • 万一 Github不让用了,Gitee同步指南请收好

    大家好 我是秋风 最近很多开源项目让一个本该纯粹的地方混入了政治色彩 例如 Node 还有 React 这些超明星级的项目 目前来看 React 的issues 已经沦陷了 大家都在反对一个原本纯粹的地方为什么会有了政治 如果说开源项目涉及
  • 相机 (2)旋转

    1 1 LookAt矩阵 用这3个轴外加一个平移向量来创建一个矩阵 并且你可以用这个矩阵乘以任何向量来将其变换到那个坐标空间 R是右向量 U是上向量 D是方向向量 P是摄像机位置向量 glm LookAt函数需要一个位置 目标和上向量以得到