javascript - 带轴和 Angular 3D 旋转

标签 javascript actionscript-3 3d matrix rotation

我知道 3D 旋转在 SO 和许多其他网站上都有详细的记录,但尽管阅读了无数的解释,我仍然没有弄清楚我哪里出错了。我的背景是艺术和设计,而不是数学和编程,而且我从来不确定我的攻击 Angular (没有双关语意)是否正确。我没有粘贴我的糟糕代码的拼凑,而是包括一张描述我的问题的图像。我真正想要的是如何解决它的分步措辞分解。伪代码很有用,但如果有人将我指向正确的方向或指出常见的陷阱,我会学到更多。


alt text

红色 = X 轴,绿色 = Y 轴,蓝色 = Z 轴

Magenta vectors = origin --> 一些 X,Y,Z 点

洋红色立方体 = 两个洋红色矢量的端点的平均值(有更好的名称吗?)

白色向量 = 两个洋红色向量的叉积(为显示而扩展,实际向量已归一化)

青色立方体对象 = 旋转失败


我以前使用过 Away3D 和 Papervision;在这些库中,将欧拉 Angular 应用于对象的 rotationX、rotationY 或 rotationZ 属性将局部旋转对象,就好像它在原点一样,而不管其实际位置如何。使用 Three.js,情况并非如此。修改对象的 rotation.x 和 rotation.y 属性会产生奇怪的效果,即对象明显在 Z 轴上倾斜了一点。更令人困惑的是,当物体停留在原点时会发生这种情况。我认为也许使用 Quaternion-->Matrix 或 Axis/Angle-->Matrix 函数可以解决我的问题,但没有骰子。似乎有一个我没有理解的核心概念。

无论如何,我想做的是将立方体定向到叉积向量(白色),以便立方体的顶部朝向该向量的方向。然后我想沿同一轴旋转立方体。我附上的图片显示的结果比我愿意承认的要多。我的代码大致如下所示:

axis = Vector3.cross(a, b)
axis.normalize()
angle = 45 * TO_RADIANS;
quat = AxisAngle2Quaternion(axis, angle)
rot = Quaternion2Matrix(quat)
cube.matrix = rot

提前致谢

凯西


编辑:开始赏金

也许我误解了它应该如何工作。这是另一张图片:

alt text

我是否认为这个洋红色矢量是轴,而橙色箭头表示基于 Angular 围绕该轴旋转?不管怎样,我想根据某个方向向量来定位青色立方体并旋转它。我做错了什么!?

最佳答案

您的方法听起来是正确的,但您没有显示 a、b 向量是什么,我猜,恒定 Angular 只是为了测试。我以前这样做过,所以我挖掘了我的代码,这是我发现的数学...

给定:
originalVec = 指向 Y 轴(立方体顶部/法线方向)的单位向量
targetVec = 白色向量

现在您希望旋转 originalVec 的轴和 Angular 与 targetVec 对齐。最直接的旋转轴垂直于两个输入向量,所以取它们的叉积。该轴不是单位向量,因此也对其进行归一化。旋转的 Angular (以弧度为单位)是点积的反余弦值。

axis = Vector3.cross(originalVec, targetVec)
axis.normalise
angle = inversecos(Vector3.dot(originalVec, targetVec))

quat = AxisAngle2Quaternion(axis, angle)
rot = Quaternion2Matrix(quat)
cube.matrix = rot

我想您不想替换立方体的矩阵,而是想用新的变换组合它...

cube.matrix.multiplyBy(rot)

...但我对此不是 100% 确定。此外,我已经看到 AxisAngle2Quaternion 以度为单位的 Angular 实现。当输入向量平行或相反时,轴为 <0,0,0>,因此应对其进行测试。如果立方体以错误的方式旋转,则叉积矢量参数的顺序错误,我不记得是哪个,只是尝试了它们。嗯。

编辑
我有机会使用 Three.js 并破解其中一个示例来定位立方体。评论显示我添加内容的位置,所有定向数学都发生在 alignCube() 中。
Align and Spin example
向上/向下移动鼠标移动目标线。在线上向左/向右旋转鼠标。

Three.js 中的场景对象似乎都继承自 Object3D,它的 autoUpdateMatrix 属性默认设置为 true。这需要设置为 false,否则将调用 updateMatrix 函数,该函数会根据对象的位置、比例和旋转属性重新计算矩阵。或者,您可以分配不同的 updateMatrix 函数。

如果 Three.js 有一些文档就好了:)

关于javascript - 带轴和 Angular 3D 旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3809788/

相关文章:

javascript - 在 Javascript 和 PHP 中十进制到 RGB

actionscript-3 - AS3 中的 Mixin 或 Trait 实现?

javascript - 在jsfiddle中,运行时错误信息 "error": "key missing: title" mean?是什么意思

android - AS3 延迟定时器执行和启动定时器

flash - 从 Flash (AS3) 发送 POST 变量打开网页

java - 将 JavaFX 节点、组或 Shape3D 转换为网格

iphone - 适用于 iOS 的 3D 对象/增强现实库

3d - 点云XYZ格式规范

javascript - Coin-Slider 无法正确显示按钮(Chrome 除外)

javascript - 如何将 JavaScript 类型数组转换为 JavaScript 数组