问题标签 [arcball]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
1307 浏览

flash - Papervision3D 的 Arcball 实现

Papervision3D 是否有轨迹球实现?

有许多用于 Flash/ActionScript 的轨迹球实现,但没有专门用于 Papervision3D。

下面是一个用于 flash 的轨迹球实现示例:

http://www.unitzeroone.com/blog/2009/09/08/source-better-flash-10-3d-interaction-arcball/

我已经开始基于 DirectX ArcBall 类编写自己的实现。

但是,它不能正常工作,我不知道为什么。

从立方体的初始位置,我可以按预期单击并拖动轨迹球。

但是,如果我开始在四元数中累积轴/角度,当立方体旋转足够多时,方向会反转。不应该有旋转方向的反转或任何其他奇怪的行为。

我搜索了互联网,没有发现任何与 Papervision3D 和 arcballs 直接相关的内容。(也许有另一个 3D Flash 引擎的轨迹球实现?)

在这件事上的任何帮助将不胜感激。

** 编辑 ** 为 Papervision3D 的有效轨迹球实现添加了 500 点赏金(场景中必须至少有 1 个对象(即)立方体)。

0 投票
2 回答
3662 浏览

opengl - 如何在opengl中使用四元数围绕屏幕中心旋转?

我正在尝试实现轨迹球/轨迹球旋转,但旋转中心有问题。无论如何,我希望中心成为我屏幕的中心。

让我解释一下我到目前为止所做的事情。

我创建了一个四元数(旋转轴:vector_start x vector_end,角度:vector_start * vector_end)

从那个四元数中,我创建了一个旋转矩阵,以便将它与 glMultMatrixf(matrix) 一起使用并获得所需的旋转。

问题是,虽然我的模型似乎是轨迹球旋转,但它应该始终围绕其本地原点旋转。无论其本地原点位于何处,如何使其围绕屏幕中心旋转?

我想该问题的解决方案可能是在屏幕中心平移整个旋转轴,然后应用旋转,但这可能吗?我在这里想念什么吗?

0 投票
1 回答
1282 浏览

c++ - 弧球旋转 90 度

我已经通过四元数成功实现了 Arcball 旋转,但是当相机的方向向量平行于向上向量时,我对该怎么做感到困惑。目前我只是在方向向量和上向量的点积超过 0.99 时限制沿 x 轴(间距)的旋转。例如,在 Maya(或使用轨迹球旋转的 Max、XSI)中,您可以非常流畅地旋转一整圈。我希望有一个类似于 Maya 旋转的解决方案。

谢谢

0 投票
1 回答
741 浏览

opengl - 在 opengl 中为 arcball 获取正确的屏幕映射

我正在尝试实现一个轨迹球界面,似乎在旋转 90 度后模型停止在该特定方向上旋转,我怀疑将屏幕上的点击映射到轨迹球有问题,但这可能是错误的数学和/或错误的转换累积,任何帮助将不胜感激,这是问题的相关代码,当对向量进行操作时,^ 运算符表示叉积,* 运算符表示内积

0 投票
2 回答
1016 浏览

iphone - OpenGL ES 轨迹球变换问题

我已经使用 Objective C++ 将我一直在使用的 arcball 类从 vb.net 移植到了 iPhone,但现在我遇到了问题。当我旋转我的对象时,一切都很好。平移视图后,我的旋转中心不再像以前那样位于对象原点的中心。理想情况下,我希望能够设置旋转点在对象参考框架中的位置。我不确定我需要在轨迹球例程中的哪个位置进行更改才能执行此操作。我基于我的实现可以在以下链接中找到:

http://www.codeproject.com/KB/openGL/Tao_Arcball.aspx

我对它的行为方式进行了一些小的修改并将其转换为触摸界面,但就我遇到的问题而言,它的行为方式仍然与此实现相同。

这些链接解释了四元数和矩阵旋转背后的更多数学:

http://www.j3d.org/matrix_faq/matrfaq_latest.html http://www.gamedev.net/reference/articles/article1095.asp http://en.wikipedia.org/wiki/Quaternion_rotation

我想必须修改的代码的主要部分如下(在 vb.net 中):

编辑:

我几乎想出了如何做到这一点。我已经到了可以为我的 Arcball 设置旋转中心的地步,但现在我遇到了另一个问题。当我应用变换围绕指定的中心点进行旋转时,有两个问题:

  1. 模型跳转到不同的位置。我想将模型保持在完全相同的位置和方向。

  2. 该模型围绕新的中心点进行缩放,但我希望模型围绕用户用两根手指触摸的平均点进行缩放。

对于 2 号,我想我知道该怎么做,但我需要弄清楚 1 号才能使 2 号正常工作。对于数字 2,我可以将平均触摸点投影到与近平面平行但穿过零件原点的平面,然后将其作为我的旋转中心,直到用户抬起手指。对 1 号有什么想法吗?我用于更改旋转中心的代码如下:

仅供参考,OpenGL 以相反的顺序应用矩阵变换,因为它的堆栈是如何工作的。所以在我的代码中,底线将首先执行,然后从那里开始。它有效地移动模型,使其旋转中心位于原点,然后旋转/缩放,然后将模型平移到需要平移的位置。

我相信我遇到的问题是我需要在平移时添加 centerOfRotation,但问题是一旦模型旋转,需要以某种方式将 centerOfRotation 点转换为不同的模型空间。在我旋转模型之前它工作正常,但是一旦引入旋转,一切都会爆炸。

0 投票
1 回答
279 浏览

java - 轨迹球在常规执行中如何改变中心?

我已经使用以下两个教程在 java 中成功实现了轨迹球:

  1. http://nehe.gamedev.net/tutorial/arcball_rotation/19003
  2. http://www.java-tips.org/other-api-tips/jogl/arcball-rotation-nehe-tutorial-jogl-port.html

该轨迹球以屏幕中心为中心。现在,我希望将它放在屏幕上的任意位置。如何将中心逻辑合并到现有代码中?由于引入中心,鼠标坐标的规范化如何变化?

0 投票
2 回答
4774 浏览

ios - 带四元数的 Arcball 旋转(使用 iOS GLKit)

我正在寻找一个简单的实现,用于在带有四元数的 3D 模型上进行轨迹球旋转,特别是在 iOS 上使用 GLKit。到目前为止,我已经检查了以下来源:

我也一直试图从这里这里理解源代码和数学。我可以旋转我的对象,但它总是以特定角度跳跃,所以我担心万向节锁定在起作用。我正在使用手势识别器来控制旋转(平移手势影响滚动和偏航,旋转手势影响俯仰)。我附上了我的四元数处理代码以及模型视图矩阵转换。

变量:

  • GLKQuaternion rotationE;

四元数处理:

Modelview 矩阵变换(内部绘制循环):

非常感谢任何帮助,但我确实希望使其尽可能简单并坚持使用 GLKit。

0 投票
2 回答
2236 浏览

c++ - Opengl:保持 Arcball 相机向上矢量与 y 轴对齐

我本质上是在尝试模仿相机在 Maya 中的旋转方式。Maya 中的轨迹球始终与 y 轴对齐。因此,无论向上矢量指向何处,它仍然会沿 y 轴旋转或与向上矢量对齐。

我已经能够使用 C++ 和 Qt 在 OpenGL 中实现 arcball。但我不知道如何保持它的向上矢量对齐。我有时可以通过下面的代码使其保持一致:

这一直有效,直到位置为 90 度,然后正确的向量发生变化,一切都被反转了。

因此,我一直在保持总旋转(以四元数为单位)并通过它旋转原始位置(上、右、pos)。这最能保持一切连贯,但现在我根本无法将向上向量与 y 轴对齐。下面是旋转的功能。

QQuaternion q 是从鼠标拖动得出的轴角对生成的。我相信这是正确完成的。旋转本身很好,只是没有保持方向对齐。

我注意到在我选择的实现中,在角落中拖动会围绕我的视图方向进行旋转,并且我总是可以重新对齐向上矢量以拉直到世界的 y 轴方向。因此,如果我能计算出要滚动多少,我可能每次都可以旋转两次,以确保一切都是笔直的。但是,我不知道该怎么做。

0 投票
1 回答
3041 浏览

c++ - 带有 Qt 和 OpenGL 的轨迹球控件

我正在尝试使用 Open GL 和 Qt 实现轨迹球/轨迹球控制器。但是,我对 OpenGL 还是很陌生。我有一个可怕的,可怕的,可怕的时间让事情正常工作。

我从以下视频开始:https ://www.youtube.com/watch?v=3IQV65ApWGs

我正在为我的窗口使用 Qt,使用他们的 QtWidget 类。

基本上,我在原点周围有一个立方体。我想用鼠标围绕立方体旋转相机。现在,当我拖动相机时,当立方体围绕球体运行时,相机似乎保持不动。与我需要的相反。

我希望你们能提供帮助。我觉得我已经在这里尝试了几乎所有东西。

首先我的鼠标处理:

现在与轨迹球相关的数学:

这是我渲染所有内容的部分:

无效 GLWidget::paintGL() { QMatrix4x4 模型视图;

我究竟做错了什么?我的方法不合理吗?

更新所以我修复了一些鼠标处理。现在我的问题是立方体围绕球体表面旋转,而不是相机。这是因为我使用的是lookat 命令吗?

此外,当我转动立方体时,它被背景颜色遮挡。这是投影问题吗?

0 投票
1 回答
510 浏览

opengl - 组成四元数

我目前正在处理一个必须通过拖动鼠标来旋转的 3D 场景。为此,我使用了 ArcBall 实现。

使用的框架立即将生成的四元数转换为旋转矩阵。任何后续旋转也将转换为矩阵。这些矩阵依次相乘。

我想通过简单地乘以旋转四元数来优化它。现在场景似乎无法控制地旋转,而原始版本工作正常(ish)。

我的四元数乘法代码:

乘法是这样完成的(结果被归一化以获得良好的度量):

最后,旋转应用为:

有谁知道我做错了什么?