将3D随机立方体旋转舍入到最高90度

时间:2014-05-08 22:29:13

标签: ios opengl 3d rotation quaternions

想象一个立方体,每个墙有不同颜色的6个墙。立方体围绕其中心点随机旋转。当用户点击或点击屏幕时,旋转立即停止。立方体在随机位置冻结。在用户释放鼠标按钮或从屏幕向上移动手指之后,立方体应该“伸直”,这意味着它应该围绕某个轴旋转尽可能小的角度,刚好足以在“屏幕平面”中呈现最明显的立方体墙壁所有边缘平行于屏幕边缘的方式。

有没有办法找到这个最接近的“直线”旋转,假设我们可以通过旋转矩阵或四元数(以更方便的方式)给出“冻结”位置?

2 个答案:

答案 0 :(得分:2)

查看矩阵的顶部3x3部分的一种方法是,它只是对基础向量的描述,如果你要将一个应用于一个点:

[A D G] [x]   [A*x + D*y + G*z]       [A]       [D]       [G]
[B E H] [y] = [B*x + E*y + H*z] = x * [B] + y * [E] + z * [H]
[C F I] [z]   [C*x + F*y + I*z]       [C]       [F]       [I]

即。如果你应用那个矩阵然后输入x轴将最终沿(A,B,C)运行,输入y轴将最终沿(D,E,F)运行,输入z轴将最终运行( G,H,I)。

我认为你要问的是"哪个轴沿输出z的变化最小,即最接近垂直于屏幕"?因此,您可以通过查找具有最小幅度的(C,F,I)值来确定。

然后,您可以使用(A,B,C)和(D,E,F)的叉积的z符号来判断您是否通过相同的逻辑正面或负面地沿着轴观察允许您使用该测试进行反面移除 - 如果相机被假想地向后移动到无限远,那么无论哪个面都是可见的是真正在前面的那个。

这也暗示了您可能更喜欢的替代测试:变换和最接近垂直的面是可见的和最大的。兰伯特照明模型背后的逻辑是相同的,事实上,这些面具有统一的大小,这是第一个考虑的因素。该测试的优势在于你可以使用遮挡直接在GPU上完成查询,假设它们实际上都没有被遮挡。

答案 1 :(得分:0)

简单的解决方案。

1)找到所需的墙,并从立方体中心到墙的中心构造矢量,让它成为dir1

2)从立方体中心到相机的矢量,让它成为dir2

3)在这些向量之间构建四元数“rotation_arc”。 http://www.euclideanspace.com/maths/algebra/vectors/angleBetween/index.htm

4)通过四元数从“3)”

旋转立方体

找到墙:从立方体中心到墙的中心构建6个向量。比从立方体中心到相机构建矢量。估计第一个矢量和第二个矢量之间的6个角度,选择最小角度的墙壁。