问题标签 [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 回答
714 浏览

opengl - OpenGL - 限制 Arcball 旋转

我在一个窗口中渲染了一个简单的红色矩形,并创建了一个轨迹球以便在任何方向上旋转它。我正在关注 NeHe 的 Arcball Rotation 教程中的代码。

问题是,一旦矩形被渲染并单击鼠标左键,它就会像窗口中的顶部一样旋转。每次移动鼠标时都会发生鼠标单击-拖动-停止更新,这就是它以这种方式旋转的原因。我无法想出一种仅在单击-拖动-停止期间限制旋转的方法。如何限制旋转?我一直在尝试调试这个大约 4-5 天,但没有运气。

我将原始 Arcball.h 和 Arcball.cpp 文件添加到我的项目中,对头文件进行了一次更改;我只是用这一行为 Arcball_t 类创建了一个默认构造函数 -

ArcBall_t() {};

与原始项目相比,唯一的其他变化是我将Update()函数调用放入了我的代码中:

编辑:case WM_MOUSEMOVE:我通过在例程的处理程序中插入检查来解决无法控制的场景旋转问题WndProc()。检查是:if(isClicked == true) { //code },这似乎可以解决问题。它不再像陀螺一样旋转。但是,我仍然无法很好地控制旋转;在点击-拖动-释放持续时间内,它仍然像陀螺一样旋转。

0 投票
1 回答
531 浏览

opengl - GLM:如何在旋转时将点击的点保持在鼠标下方?

我正在尝试使用标准轨迹球旋转围绕其原点旋转网格。每当我单击 3D 对象时,我都会从鼠标投射光线以找到交点。我测量该交点与 3D 对象原点的距离,以创建一个球体,该球体将用作该旋转中的“弧球”(直到释放鼠标)。我在每次旋转开始时这样做的原因是因为我希望单击的点保持在鼠标下方。对象旋转正确,只是旋转的幅度较小,因此单击的点不会保留在鼠标下方。以下示例尝试旋转立方体。我在纹理上绘制了一个黑色矩形来跟踪最初点击的点。这是该问题的视频:

http://youtu.be/x8rsqq1Qdfo

这是根据鼠标位置和点击时计算的球体半径(arcballRadius)获取轨迹球矢量的函数(我担心这个函数没有考虑立方体对象的位置,尽管它恰好是立方体对象位于 (0,0,z):

每当鼠标移动

如何使单击的点保持在鼠标下方?

0 投票
1 回答
437 浏览

c++ - 在 Directx 中使用轨迹球移动物体时如何保持旋转中心静止?

Internet 上有一些关于在 OpenGL 中使用轨迹球的信息,但对于 DirectX 来说并不多。我正在使用 Microsoft DirectX SDK 中的 arcball 函数版本。它通过鼠标移动(fDeltaX 和 fDeltaY)的变化来改变其平移矩阵来移动对象的位置:

问题是旋转中心与物体中心相同,所以旋转中心随物体移动。如何保持旋转中心静止?

为了在屏幕上绘制对象,我使用对象的中心位置创建了一个世界矩阵,然后将其乘以旋转矩阵,然后乘以平移矩阵:

然后我为绘图指定该世界矩阵:

我是否需要一个单独的旋转中心,如果需要,我该如何使用它?或者有什么方法可以补偿移动物体?

我在 Visual Studio 2012 中创建了一个非常简单的程序来显示这个问题。我在 gametutorials.com 上的 Rotating Cube 教程中添加了一个轨迹球,压缩了文件夹,并将它与问题描述和一些屏幕图像一起发布到这里。

我可以通过根据鼠标移动了多少设置一个平移矩阵,然后将其乘以旋转矩阵,然后将它的两个值添加到旋转中心:

然后我必须通过改变轨迹球的平移矩阵来补偿移动旋转中心:

但是,我无法弄清楚如何将对象的移动与旋转中心的相应移动相结合,以便在旋转中心保持静止的同时对象移动。有人知道怎么做这个吗?

0 投票
1 回答
399 浏览

c++ - Arcball camera locked when parallel to up vector

I'm currently in the process of finishing the implementation for a camera that functions in the same way as the camera in Maya. The part I'm stuck in the tumble functionality.

The problem is the following: the tumble feature works fine so long as the position of the camera is not parallel with the up vector (currently defined to be (0, 1, 0)). As soon as the camera becomes parallel with this vector (so it is looking straight up or down), the camera locks in place and will only rotate around the up vector instead of continuing to roll.

This question has already been asked here, unfortunately there is no actual solution to the problem. For reference, I also tried updating the up vector as I rotated the camera, but the resulting behaviour is not what I require (the view rolls as a result of the new orientation).

Here's the code for my camera:

The vector library I'm using is GLM. Here's a quick reference on the custom types used here:

mImpl is a PIMPL that contains the following members:

0 投票
1 回答
1077 浏览

c++ - 弧球相机在 90 度方位角反转

我正在尝试实现一个轨迹球风格的相机。我使用 glm::lookAt 来保持相机指向目标,然后使用方位角/倾角在球体表面周围移动它来旋转视图。

我遇到了一个问题,当方位角接近 90 度时,视图会颠倒过来。

以下是相关代码:

  1. 获取投影并查看矩阵。在主循环中运行

    /li>
  2. 鼠标移动事件,用于相机旋转

    /li>
  3. 计算相机方向向量

    /li>

我很确定这与我计算相机右矢量的方式有关,但我不知道如何补偿。

有没有人遇到过这个?有什么建议么?

0 投票
1 回答
243 浏览

opengl - 视图平面上的 Arcball 实现依赖关系

我有一个完美运行的 Arcball 实现。通常在opengl中,标准相机面向-Z,这意味着XY平面平行于观察平面。

现在,如果我将相机更改为面向 -Y,这意味着 XZ 平行于观察平面,相同的轨迹球实现并不适用。我必须按如下方式更改我的轨迹球实现。'Y' 取代 'Z',反之亦然。

虽然这对我来说确实有意义,但我想知道如果我有一个非常随意的相机会怎样。当我有一个任意相机时,我的对象的旋转是不直观的。

任何帮助表示赞赏!谢谢!

0 投票
1 回答
211 浏览

opengl - 在没有投影矩阵的情况下实现轨迹球旋转轴?

我有一个关于使用 Android Studio 在 opengl es 中实现 arcball 的问题。

在计算完旋转轴后,我应该通过渲染管道将轴反转回对象空间,以便可以在对象空间中应用旋转。

这部分可以写成:

但是,我听说正确的形式应该是:

其中 projMatrix 被丢弃。为什么我们在实现轨迹球时不考虑投影矩阵,尽管对对象进行了投影变换?

0 投票
1 回答
2240 浏览

python - PyOpenGL 将视图坐标转换为 ArcBall 导航的对象坐标

我正在关注本教程以进行 3d 轨迹球导航:

https://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_Arcball

我设法执行了所有步骤并且导航正常工作,但我似乎无法理解教程中的最后一步:

一个额外的技巧是将旋转轴从相机坐标转换为对象坐标。当相机和对象放置不同时,它很有用。例如,如果您在 Y 轴上将对象旋转 90°(“向右转头”),然后用鼠标执行垂直移动,您会在相机 X 轴上进行旋转,但它应该变成对象在 Z 轴上的旋转(平面桶滚动)。通过在对象坐标中转换轴,旋转将尊重用户在相机坐标中的工作 (WYSIWYG)。为了从相机坐标转换到物体坐标,我们采用 MV 矩阵的逆矩阵(来自 MVP 矩阵三元组)。

问题是,当我在旋转变换的第一步轴中转动模型时,它们也没有与我的“相机视图”对齐。当然,我想让我的旋转轴始终与我的相机视图对齐。

有人可以给我一个建议如何解决它吗?在教程中有一个代码,但没有太多解释它实际上在做什么,而且我只会说 Python。

谢谢你,雅各布

我的代码:

0 投票
1 回答
1197 浏览

c++ - glm::perspective() 和 glm::lookAt() 如何协同工作?

我试图弄清楚lookAt 和perspective 函数是如何工作的。

我想更改 glm::lookAt 的值(特别是相机位置的 z 值),我注意到如果该值与 glm::perspective 中近平面的值不同,它会破坏我的对象(它看起来不正常)。然后,我不知道我的问题是否与轨迹球有关(但我不这么认为,因为问题也出现在移动对象之前)或者由于某种原因我应该为相机位置使用相同的值(z 值)在lookAt 函数中和在透视函数中的近平面中。

有什么建议么?

我从https://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_Arcball实现了弧球

主要.cpp:

0 投票
0 回答
192 浏览

c++ - 具有比例和平移的 Arcball 旋转问题

我最近在这里实现了弧球指南:https ://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_Arcball在我的一个项目中,我在缩放和转换对象时遇到了一些问题。

问题:当涉及缩放和平移时,旋转会产生不正确的输出,例如向内弯曲或以特定角度放大对象的某些部分。但是,当我将缩放和平移直接应用于对象的顶点时,旋转会起作用。也就是说,在工作状态下,我对这个对象的模型矩阵是一个单位矩阵。其他任何事情,这都失败了。所以我知道事实上这是这些应用的顺序。我只是不确定什么顺序。以 TRS 顺序应用平移和缩放以及旋转也没有帮助并产生错误的结果。

编辑:修复了平移和缩放问题,但对象不会相对于更改的中心旋转。它相对于旧中心旋转。

相关代码:

对象渲染代码的一部分:

pvm 矩阵在之后立即发送到着色器并渲染对象。

向量计算函数:

MMOVE_FACTOR 为 0.05,R.deltaTime 用于调节渲染时间和鼠标移动,使其感觉更平滑。有问题的对象可以进行任意缩放和平移,以使其出现在场景的不同位置。无论我尝试什么,它都不会产生我想要的结果。例如,我尝试了以下方法:

但这也不能提供好的结果,并且旋转仍然不正确。

编辑2:根据httpdigest的建议,这是最新的代码:

中心是一个 glm::vec3 ,其顶点总和除以顶点数。

上述问题:它不适用于围绕 X 轴的平移。当我旋转它足够我认为它位于与平移值相同的距离时,它会在 Y 轴上正确旋转。另一个问题是它的行为不像轨迹球,但我想这是处理旋转的方式所预期的。不过我可能是错的。