如何在openGL中计算运动

2023-12-01

我在使用 JOGL 计算所需的运动时遇到问题。书中的例子莫名其妙地使用了sin() and cos() of System.timeInMillis().

stack.translate(Math.sin(amt)*4.0f, Math.sin(amt) * 1.0f, Math.cos(amt)*2.0f);

这一切都工作得很好,问题是我想知道他们从哪里得到这些数字以及如何计算一个平滑下落的立方体。

int pos = 1;
stack.translate(0.0, --pos, 0.0);

可以解决这个问题,但它是有限的。是否有任何资源指导如何使用这些神秘的sin() and cos()以非常具体的方式控制运动的功能?

我现在正在研究相关问题。我需要的只是某种参考,我真的不知道该怎么称呼这种东西来研究;流体动力学? 3D 三角图形运动? 3D 牛顿物理学?


这个方程并不神秘……它只是一个椭圆(扭曲的圆)的参数方程……让我通过它的推导来解释一下:

  1. 2D xy 平面圆:

    x=x0+r*cos(t)
    y=y0+r*sin(t)
    

    where (x0,y0)是圆心,r是圆半径并且t=<0.0,2.0*Pi>是角度参数,确定您想要的圆的哪个点。

  2. 2D xy 平面轴对齐椭圆

    x=x0+rx*cos(t)
    y=y0+ry*sin(t)
    

    我们只是每个轴使用不同的半径。所以rx,ry也是半轴。

  3. 3D椭圆

    如果我们旋转我们的#2椭圆成3D我们可以得到任何椭圆。为了方便起见,我们可以沿着一个轴旋转,这会将一个椭圆坐标一分为二......所以如果我重写你的方程:

    x=sin(t)*4
    y=sin(t)
    z=cos(t)*2
    

    意思是z是椭圆的起始轴(角度0前轴x) and x,y轴是前者的旋转部分y轴。椭圆的中心是(0,0,0)并且有半轴2.0 and sqrt(1^2+4^2).

现在如果我们改变t然后系统时间缩放到某个速度

t = amt  = 2.0*Pi*system_time/T

Where T是你的运动期。

现在,当您使用绝对平移时,您可以将对象移动到沿椭圆的位置。如果使用相对平移,则速度由该椭圆驱动,从而产生更复杂的轨迹。如果您想要真正的物理用途,这只是假运动模拟牛顿·达朗贝尔物理学并通过改变加速度来驱动你的物体。

如果您想制作人类驱动的对象,请查看此处的最后一个链接:

  • 理解 4x4 齐次变换矩阵

对于行星运动,请参见:

  • 是否有可能在尺寸和质量方面进行真实的 n 体太阳系模拟?

所以要回答你的第二个问题,请使用牛顿·达朗贝尔 and 矢量数学。我假设3D。所以要让你的立方体有位置速度和加速度。

// init do this just once
pos=(0,0,0); // [m] start position
vel=(0,0,0); // [m/s] start velocity
acc=(0,-9.81,0); // [m/s^2] acceleration on object (gravity in -y direction)

// on some timer or before render ...
vel+=acc*dt;
pos+=vel*dt;
cube.translate(pos); // absolute translation of your cube

where dt [s]是自上次计算以来经过的时间,因此对于计时器来说,它是其间隔(以秒为单位)。您可以使用任何单位,但所有单位必须兼容pos,vel,acc.

您可以添加摩擦力,例如:

acc+=k*vel*|vel|; // acc += k*vel^2

where k是空气中的摩擦系数(在液体中则为k*vel^3)远小于1.0.

为了驱动你的物体,你可以使用驱动力......

acc += F/m;

where F是驱动力的总和,m是物体的质量。

所有这些也可以用于角度(方向),因为它有相似之处

alpha   -> pos
omega   -> vel
epsilon -> acc

并使用对象的绝对旋转alpha.

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

如何在openGL中计算运动 的相关文章

  • 寻找将集合映射到整数的双射函数

    对于任意两个序列 a b 其中 a a1 a2 an 且 b b1 b2 bn 0a b具有相同的元素 而不关心它们的顺序 例如 如果 a 1 1 2 3 b 2 1 3 1 c 3 2 1 3 则 f a f b f a f b 我知道有
  • 在 C++ 中通过引用传递 std 算法谓词

    我正在尝试从 a 中删除元素std list并保留已删除元素的一些统计信息 为此 我使用列表中的remove if 函数 并且我有一个谓词 我想使用这个谓词来收集统计数据 这是谓词的代码 class TestPredicate privat
  • 为什么拥有单独的投影矩阵但结合模型和视图矩阵会有好处?

    当您学习 3D 编程时 您会被告知用 3 个变换矩阵来思考是最简单的 模型矩阵 该矩阵对于每个模型都是独立的 它根据需要旋转和缩放对象 最后将其移动到 3D 世界中的最终位置 模型矩阵将模型坐标转换为世界坐标 视图矩阵 对于大量对象 如果不
  • 带路径压缩算法的加权 Quick-Union

    有一种 带路径压缩的加权快速联合 算法 代码 public class WeightedQU private int id private int iz public WeightedQU int N id new int N iz new
  • 快速约会算法

    我在一家咨询公司工作 大部分时间都在客户所在地 正因为如此 我很少见到同事 为了更好地了解彼此 我们将安排一个晚宴 会有很多小桌子 方便人们聊天 为了在聚会期间与尽可能多的不同的人交谈 每个人都必须每隔一段时间 比如每小时 换一张桌子 如何
  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • 如何有效地找到距给定点最远的点(从一组点中)?

    我正在寻找一种算法或数据结构来解决以下问题 给你一组点 S 然后你会得到另一个点形式的 Q 查询 对于每个查询 找到集合中距离给定点最远的点 集合中最多有 10 5 个点和 10 5 个查询 所有点的坐标都在 0 到 10 5 范围内 我想
  • 直接选择排序与交换选择排序

    有什么区别直接选择排序 vs 交换选择排序 今天我陷入了一场争论 我的教授在他的讲义中使用了这两个术语 维基百科和任何教科书或网站都会为您提供的选择排序就是他所说的 交换选择排序 我以前从未听说过 交换选择排序 这个术语 仅 选择排序 并且
  • 具有 2 个属性的背包算法。如何在 3d 数组中实现它?

    当有超过 1 个属性时 我无法理解背包问题 当有 1 个属性时 我必须编写一个使用具有 2 个属性的背包算法的程序 老师告诉我们 它必须在 3d 数组中完成 错误的实现将导致 O 2 n 处理时间 我无法想象这样的数组会是什么样子 假设这是
  • 从一种数字系统转换为另一种数字系统后会有多少位数字

    主要问题 有多少位数字 让我解释 我有一个二进制数 11000000 十进制数是192 转换为十进制后 它有多少位 以十进制表示 在我的示例中 它是 3 位数字 但是 这不是问题 我在互联网上搜索并找到了一种用于整数部分的算法和一种用于小数
  • 在 O(n) 时间内排序?

    我被这个问题困扰了 2周 知道如何处理它吗 令 L 为 n 个不同整数的列表 假设 L 的 x 的元素在 1 750 范围内 设计线性排序算法对 L 的元素进行排序 我已经尝试过插入排序 但我不确定我的方法是否正确 Construct an
  • 以 O(1) 计算汉明权重 [重复]

    这个问题在这里已经有答案了 在二进制表示中 汉明权重是 1 的数量 我偶然发现了网络并找到了一个 O 1 的答案 v v v gt gt 1 0x55555555 v v 0x33333333 v gt gt 2 0x33333333 in
  • 解开 Knuth 的结:如何重构意大利面条式代码?

    这个问题的灵感来自如何将流程图转化为实施 https stackoverflow com questions 36647765它询问如何通过算法消除goto代码中的语句 这answer https stackoverflow com a 3
  • 在 2D 纹理上绘制的红色矩形在绘制后立即消失

    跟随我的另一个问题 https stackoverflow com questions 18477291 render an outlined red rectangle on top a 2d texture in opengl 1847
  • 如何用约束标记一大组“传递群”?

    在 NealB解决方案之后进行编辑 与以下解决方案相比 NealB的解决方案非常非常快任何另一个 https stackoverflow com q 18033115 answers and 提出了关于 添加约束以提高性能 的新问题 Nea
  • 有没有时间复杂度为O(N)的排序算法?

    大多数排序算法的复杂度为 O NN 或 O NlogN 来实现结果 但是 对于特定的输入集 有些算法的复杂度为 O N 我想知道是否有一种排序算法在所有情况下都具有 O N 的复杂度 如果您只能比较 检查两个项目是否为 正在排序的值 那么您
  • 选择一组数字以达到最小总数的算法

    给定 一组数字n 1 n 2 n 3 n x 还有一个数字M 我想找到最好的组合 n a n b n c n gt M 该组合应达到达到或超过 M 所需的最小值 没有其他组合可以提供更好的结果 将在 PHP 中执行此操作 因此可以使用 PH
  • gldrawarrays 不绘制任何东西

    我正在尝试用 VBO 绘制一个三角形 我在窗口上没有看到任何像素 我也没有看到任何 GL ERROR 这是我尝试运行的代码 include
  • 即使手动设置显示环境变量后,WSL Ubuntu 也会显示“错误:无法打开显示”

    我在 WSL Ubuntu 上使用 g 我使用 git 克隆了 GLFW 存储库 使用了ccmake命令配置并生成二进制文件 然后使用make在 build 目录中最终创建 a文件 我安装了所有OpenGL相关的库 usr ld 我不记得我
  • 列出所有 k 元组,其条目总和为 n,忽略旋转

    有没有一种有效的算法来查找所有序列k总和为的非负整数n 同时避免旋转 如果可能的话 完全避免 顺序很重要 但对于我正在解决的问题来说 轮换是多余的 例如 与k 3 和n 3 我想要得到一个如下所示的列表 3 0 0 2 1 0 2 0 1

随机推荐