【问题标题】:Arcball Implementation for Papervision3DPapervision3D 的 Arcball 实现
【发布时间】:2010-12-02 09:39:43
【问题描述】:

是否有 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 个对象(即立方体)。

【问题讨论】:

  • 你们这些混蛋!由于赏金,没有人敢评价任何其他评论:P

标签: flash actionscript-3 papervision3d arcball


【解决方案1】:

Dave K 之前提到的页面有许多轨迹球示例,here 符合轨迹球的典型物理特性。但是,您可能希望稍微扩大搜索范围并寻找四元数和纸质视觉。

如果您不熟悉 quaternions,它们是 4 维向量空间的一个元素,也是您正在寻找的轨迹球效果背后的基础。这个tutorial 将帮助您快速了解相当容易理解的四元数数学。

四元数由 Papervision 本地处理,因此教程并不难找到。快速浏览一下 google 产生了以下结果。

Quaternions in Papervision3D

papervision3d 上的conversation 和可怕的万向节锁

最后,list 讨论该主题的 wordpress 博客(并非所有 Flash 相关)

【讨论】:

  • 我不需要四元数知识或轨迹球示例,我可以在睡梦中实现轨迹球。我需要知道的是为什么它不适用于立方体等 pv3d 对象......或者显示如何使其适用于 pv3d 对象的示例。
  • 我想我只是不确定你在寻找什么。您曾要求提供许多人提供的 PV3D 轨迹球示例,我相信 pv3d.org/tag/quaternion 有很多示例。除此之外,如果没有某种示例,我不知道如何为您提供帮助,到目前为止,我从您的问题中所知道的只是您的实现不起作用并且变得很奇怪。我想我想表达的是,据我所知,这可能是您的实现错误,或者您可能遇到了极端情况,但如果没有更多细节,这很难说。
  • @godel - 您在评论中提供的链接不包含任何轨迹球示例。它包含四元数的例子。我的问题很明确,我想要一个带有立方体的 pv3d 场景,该场景可以通过使用基于四元数的轨迹球来旋转。至于我的实现是错误的还是我的实现应用到 pv3d,好吧,这就是我想要弄清楚的。我相信我的实现没问题,因为它适用于 DirectX。但是,在 pv3d 中,它似乎只“附加”到立方体的一个面上。 FWIW,我不相信您的回答值得一票,现在您是否提供了一个可行的示例...
  • @roygbiv - 不用担心,只是想帮忙。
【解决方案2】:

【讨论】:

  • 这有点有趣,但绝对不是轨迹球。
【解决方案3】:

完全不确定这是否是你想要的,但这个项目基本上是一个 Flash 实现,有一些针对 papervision3D 的元素:

http://code.google.com/p/spinnyglobe/

特别是:

http://code.google.com/p/spinnyglobe/source/browse/trunk/flash/org/makerlab/ArcBall.as?r=122

【讨论】:

  • 谢谢。我自己找到了相同的链接,它是一个标准的四元数实现,就像我自己的一样。然而,它也遇到了同样的问题,它不像人们期望的那样在标准 pv3d 对象(如立方体)上工作。事实上,我相信上述链接的当前版本完全消除了轨迹球模块。
  • 他们正在使用他们的 rotater 模块而不是 arcball 模块。
【解决方案4】:

这就是你要找的东西:Dragging an object to rotate

这是有趣的部分:

    var currentMousePoint:Point = new Point(viewport.containerSprite.mouseX, viewport.containerSprite.mouseY);

    if(isMouseDown)
    {
        var difference:Point = currentMousePoint.subtract(previousMousePoint);
        var vector:Number3D = new Number3D(difference.x, difference.y, 0);

        var rotationAxis:Number3D = Number3D.cross(vector, FORWARD);
        rotationAxis.normalize();

        var distance:Number = Point.distance(currentMousePoint, previousMousePoint);
        var rotationMatrix:Matrix3D = Matrix3D.rotationMatrix(rotationAxis.x, -rotationAxis.y, rotationAxis.z, distance/250);

        sphere.transform.calculateMultiply3x3(rotationMatrix, sphere.transform);
    }

    previousMousePoint = currentMousePoint;

【讨论】:

  • 这与@roygbiv 提供的链接不同。在您的情况下,当您以圆周运动(例如顺时针)拖动和移动时,球体将缓慢旋转。
猜你喜欢
  • 2017-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
相关资源
最近更新 更多