问题标签 [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 投票
1 回答
570 浏览

c++ - 用于旋转网格的 OpenGL ArcBall

我正在使用旧版 OpenGL 来绘制网格。我现在正在尝试实现一个轨迹球类来用鼠标旋转对象。但是,当我移动鼠标时,对象要么不旋转,要么旋转角度太大。

这是单击鼠标时调用的方法:

此方法旨在简单地将鼠标坐标映射到屏幕中心,并将它们映射到边界球体,从而产生一个起始向量

这是鼠标移动时调用的方法:

此方法再次将鼠标坐标映射到屏幕中间,然后计算新向量并根据这两个向量计算旋转轴和角度。

然后我用

应用旋转

0 投票
1 回答
1094 浏览

c++ - Arcball 相机:如何获得正确、方向和向上

我正在尝试实现一个跟随移动物体的相机。我已经实现了这些功能:

我想将此功能(和音高版本)用于跟随移动 3d 模型的相机。现在,它在 center_point 为 (0,1,0) 时有效。我认为我的位置正确,但向上向量显然并不总是(0,1,0)。

我怎样才能让我的相机起立、查看和正确的矢量?然后,如果我以这种方式更新相机的眼睛位置,当另一个对象(以 center_position 参数为中心)移动时,我的相机将如何移动?

这个想法是每次我用 centered_value = 移动对象的中心输入鼠标时更新它。然后将 gluLookAt 与我的相机的视图、眼睛和向上值一起使用(以及将是眼睛+视图的 lookAt)。

0 投票
0 回答
178 浏览

c# - OpenGL - 无法围绕正确的轴和原点获得累积旋转

我在几年前使用 OpenTK 和 C# 编写的现有项目中实现了 Arcball 旋转,并陷入了最后的障碍。

这是“旧式”非着色器 OpenGL。我确信 Arcball 旋转工作正常,问题只是应用生成的矩阵。它应该是相当简单的,但它不是那样工作的。

我将 Arcball 旋转作为四元数(qCurrent),然后将其转换为矩阵。然后我尝试了几种方法:

  1. 只需将其作为附加旋转应用于现有场景:

    /li>

这将围绕正确的原点(相机目标)应用正确的旋转,但相对于世界坐标系,而不是观察者。这是有道理的,因为我有效地以错误的顺序应用了旋转。

  1. 依次应用旋转,轨迹球首先旋转,这意味着从头开始。这里, rtn_complete 是一个矩阵,在 Arcball 旋转之前存储了初始化的模型视图矩阵:

    /li>

然后...

这适用于观看者的正确旋转,但围绕错误的旋转中心。这是一个距离相机目标很远的点。

显然,这种方法需要在旋转的任一侧进行向前/向后平移,但我已经尝试了几乎所有可能的组合,但它们都不起作用。

相机和目标位置如下:-

camera.camer’ = (-51.3, -67.9, 37.7),和

camera.cameratarget = (0.0, 0.6, 7.3)

当我添加如下翻译(以及无数其他排列)时,我仍然让场景围绕错误的原点旋转。

我的感觉是问题的根源很可能是使用 LookAt 应用的翻译,我在进行上述转换时没有考虑到这一点。

但是,当我检查 rtn_complete 矩阵(它是 LookAt 之后的模型视图矩阵)时,第四列不包含翻译。矩阵如下所示:

我本来希望在这里看到翻译。

编辑1:

终于找到了。我对使用 Matrix4.LookAt() 产生的翻译的怀疑是正确的。

我列出用于调试的矩阵的方式导致了转置,所以我可以看到翻译,但我错过了它,但它在第四行而不是第四列。平移为 (0.38, -0.72, -92.8) 在 Arcball 旋转的任一侧应用此平移会导致最初的预期旋转行为。

编辑2:

解决了上述问题后,我已经非常接近了,但是当我在场景中的其他地方移动时仍然不太正确。我再次遇到了几个问题,可以同时解决一个或另一个,但不能同时解决。

由于 Matrix4.LookAt,我分离出了​​ rtn_complete 矩阵的平移和旋转分量(分别为 'rtn_complete_trans' 和 'rtn_complete_rot')。

如果我这样做,旋转就在:

但是每次初始化视图时都会出现不需要的翻译。如果我旋转、释放并重复几次,对象会逐渐移出屏幕。

如果我更改第二个摄像机平移的位置,则不再发生这种不需要的移位,但旋转中心关闭:

谁能解释一下?

0 投票
1 回答
409 浏览

c++ - OpenGL:Arcball 相机旋转问题

我需要实现轨迹球相机。我得到了类似的东西,但它的工作原理非常弯曲(角度急剧变化,向右/向左转动时,相机强烈地向上/向下抬起)。

这是我的源代码,你能告诉我哪里出错了:

0 投票
1 回答
84 浏览

java - 数学 java 处理弧球四元数三角,浮点舍入错误

每次调用 rollforward() 时,我正在修改一个轨迹球类以旋转 1 度。我在阅读代码时遇到困难,但我相信我需要编写 XY_to_sphere() where 的替代方法;令点 1 = v1,点 2 = v2,这样

轨迹球角度公式

<-更新编辑->

我尝试简单地添加一个度数((sin(PI / 180)*半径)/ 2转换为y轴;(在rollforward()中)

在 100 次滚动后,它偏离了几度(这可能是一个浮点舍入错误,我会尝试找到它,但我将不得不学习一些东西)这是 200 次完整旋转时的差异(应该是顶部立方体)

在此处输入图像描述

(新问题)当它完全旋转时它会消失大约 1 度,我不知道为什么。(已解决!我在测试时将半径设置为 1,谢谢@laancelot)

我不确定我最初的想法是否会更好,上面的解决方案会更好

现在我将尝试设置它,使其在达到 360 度后重置以规避浮点错误

</-更新编辑->

轨迹球类

我的代码,使用 w 键滚动立方体(循环自动旋转一圈)