如何在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中计算运动 的相关文章

  • 优化 HTML 属性压缩顺序

    我在某处读到 按一定顺序组织 HTML 属性可以提高 HTML 文档的压缩率 我想我是从 Google 或 Yahoo 推荐的更快网站上读到这篇文章的 如果我没记错的话 建议是将最常见的属性放在第一位 例如id等 然后将其余的按字母顺序排列
  • 为什么我的 Project Euler Problem 12 算法这么慢?

    我已经在 Scala 中为 PE P12 创建了解决方案 但速度非常非常慢 有人可以告诉我为什么吗 如何优化这个 calculateDevisors 简单的方法和calculateNumberOfDivisors 除数函数具有相同的速度 i
  • 为贝塞尔曲线中的每个点绘制切线

    我设法绘制了一条贝塞尔曲线 如下所示 glColor3f 0 1 0 glBegin GL LINE STRIP for int i 3 i lt nPt i 3 glColor3f 0 0 0 for float k 0 k lt NLI
  • 寻找下一个素数的最佳方法(Java)

    我被要求编写一个程序以最佳方式找到下一个素数 我编写了这段代码 但找不到最佳答案 有什么建议么 public static int nextPrime int input input now find if the number is pr
  • 识别鼠标移动的算法

    我想知道是否有任何研究 算法可以指定鼠标在识别 等字符时的偏差量使用鼠标绘制 某种光学字符识别 但可能是一个更简单的版本 是否有某种算法可以让我说用户绘制的问号确实是一个问号 而不是其他具有一定准确性的东西 就像 Windows 平板电脑软
  • Retina 显示屏中具有 QOpenGLWIdget 的 Qt MainWindow 显示错误大小

    我有一个 Qt 应用程序MainWindow 我嵌入一个QOpenGLWidget在里面 一切正常 直到我开始使用 Apple Retina 显示屏并在高 DPI 模式下运行我的应用程序 我的QOpenGLWidget只是它应该具有的大小的
  • 为什么《破解编码面试》这个例子的时间复杂度是O(k c^k)?

    该问题来自 破解编码面试 第 6 版 问题 V1 11 以下代码打印长度为 k 的所有字符串 其中字符 是按排序顺序排列的 它通过生成所有长度的字符串来做到这一点 k 然后检查每个是否已排序 什么是运行时间 package QVI 11 P
  • 直观地执行不同的排序算法[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 运行时间为 O(n) 且就地排序的排序算法

    有没有运行时间为O n 并且还分类到位 在某些情况下 最好的情况是 O n 但这可能是因为项目集合已经排序 你正在看 O nlogn 一些较好的平均值 话虽如此 排序算法的 Wiki 还是相当不错的 有一个表格比较了流行的算法 说明了它们的
  • 在 3d 网格中转发(绘制)线

    我需要类似 Bresenham 算法的东西 但是 对于 3d 网格空间来说不完全是这样 我需要 3d 单元网格 边缘尺寸 1 0 从 S 点开始 前进到 K 点 接触 该线接触的所有单元格 即使只有边缘 点被触摸我需要触摸所有 8 个单元
  • 线段树java实现[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 你知道 二进制 的良好实现吗线段树 http en wikipedia org wiki Segmen
  • 关于Marching Cubes算法的澄清

    关于Marching Cubes 我对其算法和实现有一些疑问 我已经阅读了 Marching Cubes 的 Paul Bourke 优秀文章以及网站上可用的源代码 但是 我在理解以及如何以自己的方式实现算法方面仍然遇到了一些问题 问题如下
  • 检查有效的 IMEI

    有人知道如何检查有效的 IMEI 吗 我找到了一个可以检查此页面的功能 http www dotnetfunda com articles article597 imeivalidator in vbnet aspx http www do
  • Python Pandas:沿一列比较两个数据帧,并返回另一个数据帧中两个数据帧的行内容

    我正在处理两个 csv 文件并作为数据框 df1 和 df2 导入 df1 有 50000 行 df2 有 150000 行 我想将 df2 的 时间 与 df1 求时间差并返回所有列的值 对应相似的行 保存在df3中 时间同步 例如 35
  • 什么是“朴素”算法,什么是“封闭式”解决方案?

    我有一些关于描述算法时使用的术语语义的问题 首先 朴素 算法是什么意思 这与给定问题的其他解决方案有何不同 解决方案还可以采取哪些其他形式 其次 我听到很多人提到 封闭式 解决方案 我也不知道这意味着什么 但在尝试解决递归关系时经常会出现
  • 如何在 C# 中以编程方式创建柔和的颜色?

    根据所需的颜色数量均匀分布地生成它们 如果指定的计数为 8 则看起来像这样 List
  • Python 旅行商贪婪算法 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 因此 我为旅行推销员问题创建了一种排序 并按 x 坐标和 y 坐标进行排序 我正在尝试实施贪婪搜索 但无法做到 此外 每
  • 如何在C中实现带连分数的自然对数?

    这里我有一个小问题 根据这个公式创建一些东西 这就是我所拥有的 但它不起作用 弗兰基 我真的不明白它应该如何工作 我尝试用一 些错误的指令对其进行编码 N 是迭代次数和分数部分 我认为它会以某种方式导致递归 但不知道如何 谢谢你的帮助 do
  • 3D 图形批处理

    很多网站 文章都说 批量 批 批 有人可以解释一下着色器中的 批处理 代表什么吗 即 是否 改变纹理 更改任意着色器变量 意味着某些东西不能 批处理 最简单的总结方法就是尝试尽可能少地调用 API 来绘制您需要绘制的内容 使用顶点数组或 V
  • 求先递增后递减列表的最大值和最小值

    我尝试用谷歌搜索这个问题 但没有取得太大成功 我确信这个问题或类似问题有一个技术名称 但我似乎找不到答案 给定一个列表L整数 即严格递增 然后严格递减 找到该列表的最大值和最小值 例如 L可能 1 2 3 4 5 4 3 2 or 2 4

随机推荐