想象一个立方体,它有 6 面不同颜色的墙。立方体围绕其中心点以随机方向旋转。当用户单击或点击屏幕时,旋转会立即停止。立方体被卡住在一个随机位置。在用户释放鼠标按钮或将手指从屏幕上移开后,立方体应该“拉直”,这意味着它应该围绕某个轴旋转尽可能小的角度,刚好足以在“屏幕平面”中呈现最明显的立方体墙所有边缘都平行于屏幕边缘的方式。
假设我们可以访问由旋转矩阵或四元数(以更方便的为准)给出的“卡住”位置,是否有一种方法可以找到最接近的“直线”旋转?
最佳答案
查看矩阵顶部 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 符号来决定您是沿着轴正方向还是负方向看将该测试用于反向面部去除——如果假设相机向后移动到无穷远,那么任何一张脸都是可见的,那张脸就是真正在前面的那张脸。
这还建议了一个您可能更喜欢的替代测试:进行变换,最接近垂直的面是可见的和最大的。这与 Lambert 光照模型背后的逻辑相同,首先考虑的是面部大小一致。该测试的优点是您可以使用遮挡查询直接在 GPU 上进行,假设没有遮挡它们中的一部分实际上被遮挡了。
关于ios - 将 3D 随机立方体旋转四舍五入到最近的 90 度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23553677/