LibGDX 移动旋转相机

2023-12-10

我在使用 LibGDX 构建的应用程序中遇到了一种情况,我需要相机能够旋转,并且可以由用户移动,并且能够缩放。我的相机移动和缩放相机的控件工作得很好,但是,当相机旋转时,相机会根据该旋转移动。例如,如果相机向左旋转 45 度,并且用户向右拖动以移动相机,则相机将朝右上方移动,因为那是相机右侧现在指向的位置。相反,我需要相机始终相对于屏幕/用户输入移动,无论其旋转如何。

对于这个问题,我确实有一个解决方案,那就是简单地使用“世界坐标”来定位相机,而不是基于我现在尝试使用的“窗口坐标”。但这会造成非常不愉快的用户体验,因为它使相机相当不稳定,并导致我的变焦系统出现问题。我认为我可以通过大量调整来解决这些问题,但是,因为使用窗口坐标已经更加平滑,所以我真的更愿意走这条路。

我怀疑这个看似简单的问题有一个优雅的解决方案,我可以对矩阵或类似的东西进行简单的计算,但是我对 OpenGL 的知识仍然很缺乏,我似乎无法弄清楚到底需要发生什么要解决这个问题。来自更熟悉 OpenGL 和所有这些矩阵的人的任何想法将不胜感激!

===编辑===

这里用来保存值的对象本质上只是我自己的 Vector2 版本,应用程序的不同部分需要它。我不太记得那里0.7f的确切原因,但大概只是为了降低运动的灵敏度,如果我删除它,问题仍然存在。

camera.position.set(cameraStartPosition.getX() - ((zoomCurrentPosition.getX() - zoomStartPosition.getX()) * 0.7f), cameraStartPosition.getY() + ((zoomCurrentPosition.getY() - zoomStartPosition.getY())  * 0.7f), 0);

cameraStartPosition - 当用户开始移动相机时相机的 X 和 Y 坐标。

ZoomStartPosition - 开始缩放的初始触摸的 X 和 Y 坐标

ZoomCurrentPosition - 当前控制缩放的触摸所在的 X 和 Y 坐标

其中的 x 和 y 值直接取自 touchDown 和 touchDragged 方法。如果我将设置这些内容的代码放在以下代码之后,则会产生我在原始帖子中提到的问题,它会按照应有的方式移动,但非常不稳定。

    Vector3 vector = new Vector3(x, y, 0);
    camera.unproject(vector);
    x = (int) vector.x;
    y = CanvasAnywhereMain.HEIGHT - (int) vector.y;

今天我在对轨道相机进行编程时遇到了类似的问题。我将尝试向您描述我是如何处理这个问题的。

我希望我的轨道相机能够同时绕 X 轴和 Y 轴旋转,但它不起作用。我只能分别绕这个轴旋转。

对我来说,诀窍是:

Vector3 target = Vector3.zero
Vector3 right = new Vector().set(camera.direction).crs(camera.up).nor();

// This angles usualy comes from touchDragged event in your input processor
// class implementing the InputProcessor, where you do your calculations
deltaAngleX = 1.1f;
deltaAngleY = 1.9f;

// Rotate around X axis
camera.rotateAround(target, right, deltaAngleX);

// Rotate around Y
camera.updateRotation(Vector3.Y, deltaAngleY);

当您绕 Y 轴旋转时,一切都很好,因为 Y 轴不会根据您的 X 旋转而改变。你总是想围绕世界 Y 轴旋转,而不是任何局部 Y 轴。

但是当您绕 X 旋转时,您不能使用 Vector3.X,因为该轴不会相对于您的相机位置和方向。所以我们需要计算相机的“局部 Y”轴。为此,我们需要知道两个向量的叉积是什么。请参见wiki 上的叉积 and libgdx 类参考上的 crs()

以下代码片段将返回新的 Vector3,它将指向相对于当前相机的右轴。请注意,nor() 调用的存在是因为我们想要标准化该向量。

长话短说:

Vector3 right = new Vector().set(direction).crs(up).nor();

Crs 从两个向量(在我们的例子中为camera.direction 和camera.up)创建叉积向量。

我不明白为什么在 Vector3 中没有暴露正确的成员变量或者为什么不存在正确的向量计算方法,但这无论如何都会解决问题

只需编辑很少的代码,您就可以围绕您需要的轴移动播放器、相机或世界上的任何物体。您只需要了解基本的向量运算,因此我建议您仔细阅读它们

最后说明:

您必须首先绕 X 轴旋转,因为绕 Y 旋转会更改您的局部 X 轴,需要重新计算(正确的向量)。

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

LibGDX 移动旋转相机 的相关文章

  • 使用 gl_FragColor 与 vec4 颜色?

    似乎有很多不明确的地方gl FragColor被弃用 例如 它缺失在GLSL 4 40 规范 https www khronos org registry OpenGL specs gl GLSLangSpec 4 40 pdf 但它包含在
  • Camera中添加Camera的Zoom控件

    我正在制作一个相机应用程序 其中我使用 Surface View 作为相机和所有其他东西 我从以下链接中获取了指南 http www brighthub com mobile google android articles 43414 as
  • iOS心率检测算法

    我正在尝试在我正在开发的应用程序中实现心跳记录功能 首选方法是使用 iPhone 的摄像头 在灯亮的情况下 让用户将手指放在镜头上 然后检测视频源中与用户心脏相对应的波动 我通过以下堆栈溢出问题找到了一个非常好的起点here https s
  • R 将向量重塑为多列

    假设我在 R 中有一个向量 如下所示 d lt seq 1 100 我想将这个向量重塑为 10x10 矩阵 这样我就可以得到以下数据 1 2 3 10 1 2 3 10 11 12 13 20 21 22 23 30 91 92 93 10
  • 之前对 GL.Color3 的调用使我的纹理使用了错误的颜色

    制作 2D OpenGL 游戏 渲染帧时 我需要首先绘制一些计算的四边形几何体 然后绘制一些纹理精灵 当我的渲染方法主体仅绘制精灵时 一切正常 但是 当我尝试在精灵之前绘制几何四边形时 精灵的纹理会更改为之前使用的最后一个 GL Color
  • Numpy:查找两个 3-D 数组之间的欧几里德距离

    给定两个维度为 2 2 2 的 3 D 数组 A 0 0 92 92 0 92 0 92 B 0 0 92 0 0 92 92 92 如何有效地找到 A 和 B 中每个向量的欧几里得距离 我尝试过 for 循环 但速度很慢 而且我正在按 g
  • 哪个数字代表 shape 返回的元组中的行和列?

    gt gt gt A np matrix np zeros 2 3 gt gt gt A shape 2 3 gt gt gt A matrix 0 0 0 0 0 0 矩阵有吗A有两行三个零或两列三个零 A shape将返回一个元组 m
  • 缓存友好的矩阵移位功能

    我想将二维方阵的第一行移到最后一行 所以如果我有一个像A这样的矩阵 我想要得到B 我可以使用两个简单的 for 循环来做到这一点 例如 void shift int M int N int A M N int i j temp for i
  • 如何在 OpenGL 中绘制镜像某些东西的镜子?

    根据我的理解 要在 OpenGL 中进行镜像 您基本上需要绘制场景 然后将所有内容翻转并再次绘制 只是使其通过镜子可见 从而在镜子中创建完美翻转的图像 但我看到的问题是 执行此操作时 唯一可以看到其他镜子的镜子是在前一个镜子之后渲染的镜子
  • 如何在 unity3d C# 中让相机跟随物体?

    我有一个名为 Ball 的对象 我向它添加了键盘交互性 WASD 来移动球 我需要摄像机留在后面并跟随球 但我遇到了错误 using UnityEngine using System Collections public class bal
  • 开启TK onRenderFrame和onUpdateFrame的区别?

    我目前正在使用 OpenTK 框架和 OpenGL 用 C 编写 Jump n Run 游戏 Open TK 提供预设功能 例如GameWindow Run or GameWindow onUpdateFrame onRenderFrame
  • 如何使用OpenGL数组纹理?

    我正在尝试在OpenGL中使用精灵表 通过数组纹理实现它这就是我加载纹理的方式 QImage image image load C QtProjects project images spritesheet png png const un
  • 新显卡上的 nvoglv32.dll 中的绘制调用崩溃

    几天前 由于一些硬件更改 我设置了计算机并安装了新的 Windows 8 副本 其中 我将显卡从 Radeon HD 7870 更改为 Nvidia GTX 660 再次设置 Visual Studio 11 后 我从 Github 下载了
  • OpenGL 新手: glutMouseFunc

    我试图在单击鼠标后更改球体位置 但在使用 glutMouseFunc 中的 x 和 y 时它不起作用 以下是代码 include stdafx h include
  • 如何使用 MPI_Scatterv 将矩阵的行发送到所有进程?

    我正在使用 MPI 接口 我想分割一个矩阵 按行 并将各个部分分配给每个进程 例如 我有这个7x7的方阵M M 0 00 1 00 2 00 3 00 4 00 5 00 6 00 7 00 8 00 9 00 10 00 11 00 12
  • R 中的快速 QR 分解

    我有大量矩阵 需要对其执行 QR 分解并存储生成的 Q 矩阵 进行归一化 以便 R 矩阵在其对角线上具有正数 除了使用之外还有其他方法吗qr 功能 这是工作示例 system time Parameters for the matrix t
  • 在 OpenGL 中设置 MVP 矩阵

    我正在尝试学习 OpenGL 的基础知识 但我在设置变换矩阵时遇到问题 我制作了模型 视图和投影矩阵 但将它们发送到我的顶点着色器时遇到问题 这是代码 Set up MVP glm mat4 model glm mat4 GLint uni
  • 在旋转时从错误的资源文件夹中提取可绘制对象

    在这里拉我的头发 因此 我正在使用一个具有多种类型的可绘制对象的应用程序 并且它们的结构如下 res Portrait resources drawable mdpi drawable hdpi drawable xhdpi Landsca
  • Android 相机未保存在特定文件夹 [MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA]

    当我在 Intent 中使用 MediaStore INTENT ACTION STILL IMAGE CAMERA 时遇到问题 相机正常启动 但它不会将文件保存在我的特定文件夹 photo 中 但是当我使用 MediaStore ACTI
  • 在游戏视图下添加 admob

    我一直试图将 admob 放在我的游戏视图下 这是我的代码 public class HoodStarGame extends AndroidApplication Override public void onCreate Bundle

随机推荐

  • VHDL——连接开关和LED

    我有 Xilinx Spartan6 和下一个 VHDL 代码 library ieee use ieee std logic 1164 all use ieee numeric std all entity Switches Leds i
  • android,UTF8 - 如何确保 UTF8 用于共享首选项

    如何确保共享首选项菜单使用 UTF8 我有一个 android 首选项菜单 允许用户设置他们的名字等 我需要知道如何将共享首选项中存储的数据转换为 UTF8 格式 首选项菜单使用 utf8 编码以 xml 格式布置在 res xml 文件夹
  • 具有相同方法名称但不同限定符的 Spring bean 无法加载

    我有两个 Spring Configuration 类定义如下 Configuration public class ClsA Bean Qualifier ClasA public String getSomething return s
  • 如何在烧瓶响应中返回图像?

    举个例子 这个网址 http example com get image type 1 应该返回一个响应image gifMIME 类型 我有两个静态 gif images 如果类型是 1 它应该返回ok gif 否则返回error gif
  • ASP.NET MVC6 中的实体框架7对同一个表的多个外键

    您好 我有同样的问题 这里有一篇旧文章 那里提供的解决方案在带有 EF7 的 MVC 6 中对我不起作用很简单 public class Match Key public int MatchId get set public DateTim
  • Pytorch - 运行时错误:尝试再次向后浏览图表,但缓冲区已被释放

    我一直遇到这个错误 运行时错误 尝试再次向后浏览图形 但缓冲区已被释放 第一次向后调用时指定retain graph True 我在 Pytorch 论坛中搜索过 但仍然找不到我在自定义损失函数中做错了什么 我的模型是 nn GRU 这是我
  • Tor Stem - 前往俄罗斯,有爱情联系问题

    我正在尝试获取带着爱去俄罗斯教程来自 Stem 项目的工作 from io import StringIO import socket import urllib3 import time import socks SocksiPy mod
  • 让方法运行或引发异常的 Python 装饰器

    我需要一个装饰器 它接受一个参数并检查 基于一些简单的逻辑 是否应该允许该方法运行或引发异常 class One obj trend trend myDecorator self trend def click button self cl
  • 在 Sankey 工具提示中显示边缘信息

    我正在使用 networkD3 包中的 sankeyNetwork 来创建可视化 我想为每条边分配一个名称 ID 以便它出现在工具提示中 这可以通过 sankeyNetwork 或 networkD3 包中的任何其他函数来完成吗 这在技术上
  • php、jquery 只有第一个 id 工作正常

    我在 php 中有以下代码 代码经过编辑以便于理解 while row mysql fetch array biznis div div img src social images avatar empty avatar full jpg
  • 如何将所有网络流量重定向到特定页面?

    有没有办法将我网站的所有流量重定向到特定页面 我的免费主机确实支持 PHP 不确定这是否适合于此 谢谢 如果您的主机基于 Apache 并支持模组重写 用那个 例如 WordPress 典型的重写 将对不存在的文件 文件夹的请求重定向到in
  • std::数组的向量

    以下声明通过编译检查 int arr 3 vector
  • 如何将 Perlin 噪声值标准化到范围 [0, 1]?

    我正在使用 numpy 数组来保存柏林噪声值 有人告诉我 二维数组中的柏林噪声值分别在 0 7 0 7 范围内 但这似乎并非如此 至少对于凯斯曼来说不是 noise 库 当我调整八度 持久性和空白度的参数时 我会使用不同的库 但我找不到任何
  • Powerpoint VBA - 更改配色方案

    我需要通过 VBA 代码将演示文稿的配色方案更改为 Office 2007 2010 我怎样才能做到这一点 我尝试了类似下面的方法 但似乎不起作用 ActivePresentation ColorSchemes Add ActivePres
  • 如何在 laravel 5.3 中显示当前日期的日期名称?

    我想在 laravel 5 3 中打印当前日期的名称 我可以通过以下方式获取当前日期 上面的代码打印 25 但我希望它打印星期四 我应该怎么做 Try this
  • 有没有办法在密码文本模式下设置 ASP.NET 文本框密码字符?

    我希望当用户输入文本时 它应该显示 而不是一个简单的星号 有没有办法 在win forms的TextBox中有一个属性PasswordChar 它在web中有何相似之处 不 这是特定于浏览器的 也许你可以用 javascript 来伪造这个
  • 如何在 Delphi XE 中国际化我的应用程序?

    我正在使用 Delphi 中包含的翻译管理器 xe8 但在旧版本中应该相同 我转到 Projet gt 语言 gt 添加 选择英语 然后我翻译文本 这里是按钮 我全部更新并编译 我得到了 exe 和 enu 文件 它是法语的 当我转到 Pr
  • matlab中的KNN算法

    我正在研究拇指识别系统 我需要实现 KNN 算法来对我的图像进行分类 根据this 它只有 2 个测量值 通过这些测量值计算找到最近邻居的距离 但在我的例子中 我有 400 张 25 X 42 的图像 其中 200 个用于训练 200 个用
  • Spring Boot REST · @Constraint 用于删除?

    我正在开发一个使用 Spring Boot REST HATEOAS Hibernate 和 PostgreSQL 的系统后端 为了验证 我开始使用以下类extend org springframework validation Valid
  • LibGDX 移动旋转相机

    我在使用 LibGDX 构建的应用程序中遇到了一种情况 我需要相机能够旋转 并且可以由用户移动 并且能够缩放 我的相机移动和缩放相机的控件工作得很好 但是 当相机旋转时 相机会根据该旋转移动 例如 如果相机向左旋转 45 度 并且用户向右拖