WebGL/OpenGL:根据设备方向旋转相机

2024-03-08

我有一个 Web 应用程序,我试图在 3D 空间中显示地图图像图块的平面。

我希望无论设备如何旋转,平面始终保持水平,最终效果类似于这个航海罗盘演示 http://people.opera.com/richt/release/demos/orientation/marinecompass/.

现在,我可以通过移动设备的 W3C 设备方向 API 捕获设备方向,并且成功渲染了地图图像图块。

我的问题是我缺乏如何根据设备方向正确旋转相机的基本数学知识。

我正在使用 Three.js 库。我尝试直接通过 alpha/beta/gamma(转换为弧度)设置相机对象的旋转。但它不起作用,因为相机似乎总是根据 openGL/webGL 使用的世界轴而不是根据其本地轴旋转。

我想到了在相机前面旋转一个点 100 个单位,并按照设备方向 API 提供的角度相对于相机位置旋转该点。但我也不知道如何实现这一点。

谁能帮助我实现我想要实现的目标?

EDIT:

错误更正:

对于任何有兴趣实现类似事情的人,我发现 Three.js 对象默认使用本地空间轴,而不是世界空间轴,我错了。虽然官方文档指出,通过设置“object.matrixAutoUpdate = false”,然后修改“object.matrixWorld”并调用“object.updateWorldMatrix()”,您可以在世界轴上手动移动/旋转/缩放对象。然而,当对象有父对象时它不起作用,当对象有父对象时将始终使用局部轴矩阵。


根据 W3C 设备方向事件规范,角度alphabeta and gamma形成一组 Z-X'-Y'' 类型的固有 Tait-Bryan 角。

Three.js 相机也会根据固有角度旋转。但是,应用旋转的默认顺序是:

camera.rotation.order = 'XYZ'.

那么,您需要做的是设置:

camera.rotation.order = 'ZXY'; // or whatever order is appropriate for your device

然后您可以像这样设置相机旋转:

camera.rotation.x = beta * Math.PI / 180;
camera.rotation.y = gamma * Math.PI / 180;
camera.rotation.z = alpha * Math.PI / 180;

免责声明:我不知道您的设备类型。这是基于我对 Three.js 的了解的有根据的猜测。

编辑:更新了 Three.js r.65

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

WebGL/OpenGL:根据设备方向旋转相机 的相关文章

  • THREE.js 导入的模型不应用面部纹理

    我正在尝试导入使用 THREEJS 导出器从搅拌机导出的模型 到目前为止 模型已加载并出现在我的场景中 并且正确应用了材质 汽车应为黄色 玻璃应为透明 但它并没有将我的纹理应用到以 tga 形式保存的汽车上 如果我不将纹理包含在模型所在的服
  • Three.js StereoEffect 显示 2 只眼睛的网格

    我有一个使用 StereoEffect 渲染器的 THREE js 场景 但是 当我向场景添加新网格时 它们会显示在两只眼睛上 而不是为每只眼睛重复显示 我相信 THREE js 应该自动完成 我不必自己复制它们 我尝试复制它们 但这是很多
  • 重复凹凸贴图

    我正在尝试使用 Three js r55 将凹凸贴图应用到平面上 以创建一个模糊的感觉表面 这是我的代码 var mapHeight THREE ImageUtils loadTexture images felt png mapHeigh
  • Three.js:通过触摸和设备方向旋转相机

    我正在使用 Threejs 制作一个 3D 项目 它允许使用计算机设备的鼠标控制相机 还允许使用触摸事件和智能手机的设备方向事件进行控制 举个例子 这个网站 http lacostewinter seeourwork cn en intro
  • 调试 Three.js 中的低 FPS

    我正在处理 Three js WebGL 场景 当我缩小时 我注意到 60 FPS 以便所有观察结果 约 20 000 个三角形 都在视图中 但当我放大时 FPS 非常低 因此只有一个小三角形的子集在视野中 我想弄清楚是什么导致了这种差异
  • 无法让 raycaster.intersectObjects() 从远处返回相交的对象

    我有一个包含几个随机数的散点图Sprite用作数据点的对象 我想检测鼠标指针 光标 和Sprite对象 我用来检测交叉点的设置如下 var projector new THREE Projector window addEventListe
  • Three.js:基于图像的光照(IBL)

    I m searching to add an IBL to my scene and objects But I can t find anything on the web There are some examples with an
  • 在 Three.js 中将贝塞尔曲线转换为平面道路

    我试图根据之前计算得到的一些贝塞尔曲线在 Three js 中绘制一条弯曲的道路 问题是我找不到转换曲线序列的方法 一条从上一条曲线的末尾开始 到一个曲面 我有一个 3D 场景 其中有一些汽车 一条用飞机创建的道路 并且绘制了即将到来的道路
  • 如何计算给定坐标处相机可见矩形的大小? [复制]

    这个问题在这里已经有答案了 我制作了一个小型的 Three js 应用程序 它将一堆圆圈从画布的底部移动到顶部 let renderer scene light circles camera initialize animate funct
  • 在适用于 iOS 的 Google 地图 SDK 上进行 GMSMapView 屏幕截图时出现问题

    我遇到的一个问题是当我尝试截取 GMSMapView Google Maps SDK iOS 任何部分的屏幕截图时 UIGraphicsGetImageFromCurrentImageContext UIImage 输出是不可见的 我最终发
  • WebGL2 FBO 深度附件值

    我只是尝试使用 WebGL2 渲染场景的深度值 如下所示 Texture depthTexture gl createTexture gl bindTexture gl TEXTURE 2D depthTexture gl texImage
  • 在 OpenGL ES 中绘制立方体需要多少个顶点?

    我在不同的在线站点中看到不同数量的顶点来表示 OpenGL ES 中的同一个立方体 例如 这是一个 float vertices width height depth 0 width height depth 1 width height
  • 三.JS Shadow 到对象

    我想添加castShadow and receiveShadow在一个物体上 但是下面的代码有什么问题吗 var mtlLoader new THREE MTLLoader mtlLoader setPath objects Tree mt
  • Cocos2d:CCSpriteBatch 节点是否仅绘制可见属性设置为 true 的精灵?

    CCSpriteBatch 节点是否仅绘制可见属性设置为 true 的精灵 或者它也考虑屏幕尺寸 换句话说 如果节点内的精灵位于屏幕之外 opengl 绘制调用的性能是否会反映这一点 不 不 CCSpriteBatchNode 始终绘制所有
  • Three.js - 将 WebGL 和 CSS3D 与 iFrame 混合

    我准备了一个混合的工作页面WebGL and CSS3D 在SO的一点帮助下here https stackoverflow com questions 24681170 three js properly blending css3d a
  • Three.js canvas.toDataURL 有时为空

    我正在尝试使用 html2canvas js 渲染 THREE js 场景 一些覆盖的 HTML 元素 有用大多数时候 但并非一直如此 在失败的情况下 将渲染 HTML 元素 背景 覆盖层等 但不会渲染其他元素 THREE js 场景表现得
  • (A 框架)本地 gltf 不会加载;无法读取未定义的属性“切片”

    我从A型框架学校 https aframe io aframe school 11其中加载了 gltf 模型 然后我从 Khronos 加载了示例模型 this box https github com KhronosGroup glTF
  • Android中的OpenGL用于视频显示

    是否可以使用 OpenGL 来显示视频并能够在运行时调整视图大小 是的 它的工作原理是通过 glTexSubImage2D 将每个帧作为纹理上传 我已经测试了基于 FFmpeg 的解码器的输出 效果很好
  • 在每一帧上更新整个 VBO 是绘制许多变化的独特三角形的最有效方法吗?

    答复我之前的问题 https stackoverflow com questions 24592099 drawing many unique triangles with a single draw call for better per
  • 三.js环境光意想不到的效果

    在下面的代码中 我渲染了一些立方体并使用点光源和环境光照亮它们 然而 当设置为 0xffffff 时 AmbientLight 会将侧面的颜色更改为白色 无论其指定的颜色如何 奇怪的是 点光源按预期工作 我怎样才能使环境光表现得像点光 因为

随机推荐

  • 本地开发主机的通配符

    我最近在多个项目之间切换 所有这些都在相同的IP上本地运行 但具有不同的域 实际上它总是 local like foo local bar local等等 我可以继续将它们添加到我的 etc hosts文件 但这不是很干净的方式 这就是为什
  • 我无法在 Android AVD Manager 中创建模拟器

    我正在尝试创建一个 Android 模拟器 当我打开 AVD 管理器并尝试创建一个模拟器时 它一直显示 未选择目标 即使我选择了目标 http bit ly 15vr9fk http bit ly 15vr9fk 面临同样的问题 我检查了A
  • 未收到 Microsoft Graph 更改通知

    我想订阅用户删除 以便每当在 Azure AD 中删除用户时 我们的应用程序都可以做出相应的反应 这是我的订阅请求 const now new Date const threeDaysLater new Date now getTime 3
  • unix fork exec 序列真的像听起来那么昂贵吗?

    我正在读关于fork and exec对于考试 我的书说 每当需要在 UNIX 系统中运行一个新的 不同的 进程时 您都会分叉当前进程 然后是execve 然而 它也说 每当fork被调用时 父进程的整个内存映像被复制到新进程 那么我的问题
  • 是否可以通过在基类中添加新的虚函数来破坏代码?

    是否可以通过简单地向基类添加新的虚函数来改变程序的观察到的行为 我的意思是不必对代码进行其他更改 以下程序打印OK 取消注释虚函数B它将开始打印CRASH include
  • 如何使用 JavaScript 创建电子邮件按钮

    我找不到真正符合我的问题的帖子 所以我们开始 我想在我的网站上实现 通过邮件共享 按钮 因此当您单击该按钮时 假设 Outlook 或 Thunderbird 打开 并为您提供在新邮件中共享网站链接的选项 我不太确定 但我认为我无法仅使用
  • 将带孔的多边形转换为多个简单的无孔多边形

    我正在处理IfcFace http www buildingsmart tech org ifc IFC4 Add2 html schema ifctopologyresource lexical ifcface htm 我得到了一个带孔的
  • Xamarin - 异步数据绑定

    我有以下代码 包含大量图像的页面 通过数据绑定动态加载 base OnAppearing if loaded loaded true BindingContext new GalleryViewModel pCode gCode gUrl
  • __func__ 和 __PRETTY_FUNCTION__ 并不总是扩展

    我有一个日志库 它使用宏来跟踪消息 该宏使用预定义的宏 例如 func and PRETTY FUNCTION 指示消息被记录在哪个函数 方法中 我的日志库的宏定义在我的日志库的主头中 位于任何函数之外 由于某种原因 预处理的代码包含 fu
  • Dynamics CRM 2011 中如何拥有多个 javascript 库

    是的 我正在创建一个方法 将帐户添加到 Dynamics CRM 并使用 Ajax POST 到内置 Web 服务 代码如下 var context GetGlobalContext var serverUrl context getSer
  • 将值类型转换为泛型

    我有一个泛型类 我需要将其限制为仅值类型 int float 等 我有一个基于类型测试调用 Parse 方法的方法 例如 class MyClass
  • 如何连接 MySQL 中的结果集?

    我想用逗号作为分隔符字符串来连接 MySQL 中集合中返回的结果 例如 返回的集合包含 COLUMN X john jerry maria joseph gugla 我希望收到的结果为 COLUMN X concat john jerry
  • 静态构造函数和异常

    如果静态构造函数抛出异常且未处理 会发生什么情况 它会一直保留到应用程序域处于活动状态吗 静态构造函数中未处理的异常将被包装在TypeInitializationException 如果您使用的是 NET 2 或更高版本 则未处理的异常将终
  • 错误:ENOENT:没有这样的文件或目录,scandir './commands/'

    当我想使用不和谐时 我收到此错误输出 Error ENOENT no such file or directory scandir commands 90m at Object readdirSync fs js 1021 3 39m at
  • 如果存在重复的模块名称,Python 指定从哪个模块导入?

    相关 从相对路径导入模块 https stackoverflow com questions 279237 import a module from a relative path dirA A py B py dirB B py A py
  • .NET MVC 5 中的 Angular 6 应用程序,角度路由不起作用

    我已将 Angular 6 应用程序嵌入到现有的 NET MVC 5 应用程序中 我在 MVC 应用程序 RouteConfig cs 中添加了一条指向 Home Index 的后备路由 因此 未知 路由将传递到 Angular 应用程序的
  • 什么是 STUN?它是否需要端口转发服务器?

    我对没有基础服务器的 p2p 通信进行了一些研究 并通过了 STUN 据我所知 STUN 是 NAT 打孔 的一种方式 不需要对等方进行端口转发即可连接 这是正确的吗 打孔到底是什么意思 这一切看起来都很脆弱 因为如果不需要端口转发 它就会
  • 自制软件安装时出现 OSX 代理问题

    我尝试对我的问题进行所需的搜索 但没有得到我需要的答案 目标 安装自制程序并使用自制程序 我正在使用的操作系统 OS X El Capitan 以下是我的问题 我是 OS X 和 Homebrew 的新手 我正在尝试使用以下命令从我的家庭网
  • Google App Engine:“没有名为 google.appengine.ext 的模块”

    我在测试我的 main py GAE 应用程序时收到此错误 Traceback most recent call last File main py line 4 in
  • WebGL/OpenGL:根据设备方向旋转相机

    我有一个 Web 应用程序 我试图在 3D 空间中显示地图图像图块的平面 我希望无论设备如何旋转 平面始终保持水平 最终效果类似于这个航海罗盘演示 http people opera com richt release demos orie