所以我开始创建一个应用程序来学习 android 上的 openGL es。首先,我通过一章解释了如何构建一个立方体并使用系统计时器让它旋转。然后我将每一侧映射到一个图像的不同部分。出于开发目的,每一面都带有一个数字纹理。然后我实现了拖动功能,允许用户根据他们的滑动方式向上/向下或向左/向右旋转立方体。
首先是我的问题的一些背景:
我想跟踪哪一侧朝向相机,因为每个面都在它开始的轴上旋转。例如,给定一个具有如下展开布局的立方体。
2
4
3 1 5
6
其中 1 是面向屏幕的一侧,2 是相反(或背面),4 向上,5 向右,6 向下,3 向左。这意味着 3/5 在 x 轴上,4/在 y 轴上为 6,在 z 轴上为 1/2。
这是我的问题:
如果我只围绕 1 个轴旋转(即我只向左/向右或向上/向下直到我去 360),立方体会正确旋转,但如果我只去 90 180 或 270,那么我应该旋转的轴已经切换。发生这种情况是因为上面提到的立方体的每一侧都粘在它开始的轴上。
如果您向右旋转一次,使 5 面向,那么从用户角度看的 z 轴就是立方体的 x 轴。当您开始向左/向右 90 度然后向上/向下 90 度等时,这会变得更加复杂。
我尝试使用从顶部数字顺时针列出的数字数组来跟踪面部,但取决于您来自哪个数字,周围数字的新方向发生了变化。
例如:
我绘制了每个数字周围的数字,因为它从 1 旋转到它面向屏幕,所以
4 2 4 1 4
3 1 5 3 4 5 1 5 2 3 6 5 2 3 1
6 1 6 2 6
和 2 是一个通配符,因为它可以从任何方向得到,所以从 1 开始没有真正的初始数字布局
6
3 2 5
4
所以我的数组将是
sidesOfFace1[] = {4,5,6,3}
sidesOfFace2[] = {6,5,4,3}
sidesOfFace3[] = {4,1,6,2}
sidesOfFace4[] = {2,5,1,3}
sidesOfFace5[] = {4,2,6,1}
sidesOfFace6[] = {1,5,2,3}
并且 MOVE 可以具有值
UP = 1 RIGHT = 2 DOWN = 3 LEFT = 4
然后通过跟踪前一张脸、当前脸和最后一次移动,我试图找出一个公式来获得一个偏移量,这将帮助我选择下一张脸将被赋予移动到新脸的方向。大致我得出了这个解释:
prevface MOVE currFace
1 -> UP(1) -> 4 -> RIGHT(2) -> 5
offset = opposite direction of MOVE - (sidesOfFace.indexOf(prevFace)+1)
So first I get
1) DOWN - sidesOfFace4.indexOf(1)+1 => 3 - 3 = 0
2) LEFT - sidesOfFace5.indexOf(4)+1 => 4 - 1 = 3
1) 这告诉我 4 周围的边与数组边的顺序相同,从顶部开始顺时针方向。所以当用户再次滑动时,我可以知道我们要去哪一边。这对于能够设置立方体的正确旋转是必不可少的,因为随着立方体的转动,它们会随着观察者的变化而变化。
2) 这表明存在偏移,如果我们查看数组,索引 4 应该是 0,但立方体已经旋转,使得 UP 侧现在位于索引 3,RIGHT 为 0,DOWN 为 1,LEFT是 2。
除了需要知道哪一侧面向屏幕以在我的应用程序中使用其他功能外,我还必须知道因为根据哪一侧面向屏幕,我必须沿正确的轴旋转立方体。我正在跟踪 xRot 和 yRot,但这些旋转必须根据相机/用户 View 发生,而不是立方体轴。
例如,我发现:
axis for front face up/down axis right/left axis (as seen by the camera)
1 +z +x +y
2 -z -x -y
4 +y +x +z
6 -y -x -z
5 +x +z +y
3 -x -z -y
这意味着根据面向屏幕的哪一侧,我必须围绕上/下轴进行 xRotations 并围绕右/左轴进行 yRotations。
一位 friend 说了一些关于可能检查离相机最近的 4 个顶点的事情,但由于我使用的是 glRotate 函数,我不确定我可以从哪里获得这些信息。但我仍然需要知道正面的哪一侧有哪些数字,这样我才能自动旋转立方体。
如果您真的坐下来阅读所有这些,我真的很感激,如果您能引导我朝着正确的方向前进。也许一个链接,或者更好的是这个问题的已知解决方案将是惊人的。我已经为此苦苦挣扎了几天,我只是想知道这是否已经是一个有解决方案的问题。
谢谢大家,
艾伦
最佳答案
老实说,我没有完全阅读您帖子的最后 3/4,它看起来比需要的要复杂得多。
但是,如果您只想检测立方体的哪一侧最靠近相机,则只需执行以下操作:
使用未旋转的立方体,为每个方向创建一个向量:
vec3 left(-1, 0, 0)
vec3 right (1, 0, 0)
vec3 up(0, 1, 0)
etc...
然后获取立方体的当前模型 View 矩阵。如果您通过立方体的模型 View 转换法线,您将在眼睛空间中获得结果向量。
vec3 leftInEyeSpace = modelView * left;
vec3 upInEyeSpace = modelView * up;
...
这将是每个向量相对于您的眼睛的方向。
然后定义一个从立方体中心指向相机的向量:
vec3 cubeToCamera= -normalize((modelView * vec4(0,0,0,1)).xyz);
然后你想用你的 'cubeToCamera' 向量获取每个向量的点积。因为点积随着向量之间的角度增加而减小,所以具有最大量级的点积将是最面向相机的点积。
float leftDot = dot(cubeToCamera, leftInEyeSpace)
float rightDot = dot(cubeToCamera, rightInEyeSpace)
...
关于android - 在android opengl es中检测面向相机的立方体的一侧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11270619/