2014-05-08 44 views
0

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

有没有办法找到这个最接近的'直线'旋转,假设我们可以通过旋转矩阵或四元数(取其更方便)给出'冻结'位置?看着一个矩阵顶部的3x3部分

+0

如果同时沿着多轴旋转并不是一个硬性要求,我会使用随机的90°补间旋转连续立方体,然后在点击时不会产生更多的补间,之后最后一个补间将立即终止立方体想。 – opyate

回答

2

的方法之一是,它只是一个基础向量作为说明,如果你要申请一个到一个点:

[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,一世)。

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

然后,您可以使用(A,B,C)和(D,E,F)的叉积的z符号来决定您是沿着轴正向还是负向查看相同的逻辑您可以使用该测试来进行反面删除 - 如果相机假设向后移动到无穷大,那么无论哪个面部都可以看到,这是真正面临的问题。

这也表明您可能更喜欢的替代测试:做转换,最接近垂线的面是可见和最大的。这与兰伯特照明模型背后的逻辑是一致的,事实上,首先考虑的面部大小统一。该测试的优势在于,您可以使用遮挡查询在GPU上直接进行测试,假设没有其中的一部分实际上是闭塞的。

+0

谢谢@Tommy!你引导我到最后的解决方案:-)。和所有的“直线”旋转矩阵一样,每行/列中总是只有一个-1或1,我最终使用下面的算法:(1)找到(C,F,I)中最大的幅度,并保存价值的代价到一个新的'停车'矩阵。(2)找到剩余的4个矩阵元素(A,B,D,E,G,H中没有那些高于步骤(1)中选择的元素的2)的最大量级,并将该值的符号保存为新的“停车“矩阵。 (3)将剩余值的符号保存到新的“停车”矩阵中。 (4)将0保存到所有其他值。 – Voyteck

0

简单的解决方案。

1)找到所需要的壁,并构造从立方体中心向量到壁的中心,让它成为DIR1

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

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

4)通过从“3)”

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

+0

感谢@minorlogic。这肯定会将所需的墙带到屏幕上,但它并没有回答基本问题“_how to find_ ** required wall **?”。此外,我不确定是否与前壁垂直的墙壁会平行于屏幕边缘定位它们的位置(我恐怕它们将处于随机角度,但我没有检查它)。 – Voyteck

+0

它也很简单。从立方体的中心到墙的中心构建6个矢量。比从立方体的中心到相机建立矢量。估计第一个向量和第二个向量之间的6个角度,并选择角度最小的墙。 – minorlogic