第一人称视角的一种解决方案

    a模型在以b模型为基准点,实现b模型旋转,其a模型还是会在a模型原来相对的一个点上。比如说,a模型在b模型左上方的某个位置,如果b模型绕摸个轴旋转了某个度数,其a模型还是相对与b模型在左上方某个位置。一次类推,可以位移缩放等。

  现在就来简单的介绍一下这中情况在Android开发中的实现的具体的策略。

  1.OpenGL ES在定点着色器中有一个步骤是模型的顶点需要左乘MVP矩阵,这一步骤中涉及到了三种坐标系的转换,从模型坐标系-->摄像机坐标系--->投影坐标系。从中可以看到矩阵的作用是将某个顶点所在的坐标系转化到另外一个坐标系。那么我们的解决上面的这个问题的思路就是从这里来的。

  2.我们知道,在创建一个模型的时候,我们人为的规定这个模型的某个地方为坐标系原点,然后我们计算这个模型上的各个顶点的位置,并且按照索引法或者三角形绘制的方法绘制出来这个模型,显示到屏幕上。不知道有没有人注意到一点,构建一个模型的时候,其模型上某个顶点的位置是相对与自己规定的某个原点的,这个原点在这个模型坐标系中其是0,0,0,而在世界坐标系中,其是有一个坐标位置的x、y、z,我们初始化一个矩阵来构建一个此模型的矩阵,矩阵左乘这个顶点的其次坐标,可以看到是在构造模型时顶点的坐标来加上此原点在世界坐标系中的坐标。看懂的人现在应该就有了解决上面问题的一个大的轮廓了。看不明白的,可以多看几遍上面所说的理论。

  3. 我们不妨把a模型所在的位置当作b模型上的一个顶点,其具体操作便是,我们使用a模型在世界坐标系下的坐标位置减去b模型在世界坐标系下的坐标位置(特殊的说明一下,在OpenGL中如果不加特殊的说明,我们自己设定的某个模型的位置的数据全部都是世界坐标系的坐标),现在我们得到的这个结果是上面步骤二中所说的某个顶点相对与其自身模型坐标系的坐标点,然后我们以b模型为ab混合模型的圆心初始化一个矩阵,并把位移、缩放,旋转等信息存放到矩阵中(注意,其位移、缩放、旋转等信息全部都是b模型的),然后我们用这个矩阵左乘刚才计算出来的a相对与b的坐标(齐次一下),然后得到最终的结果便是,b模型旋转,位移,缩放了多少以后,a相对与b模型还在b没有变化的位置。

总结一下,这种思路是根据OpenGL ES坐标系转化而来的一种组装多个模型为一个模型的一种算法,当然这种算法也可以实现将摄像机绑定到人的脑袋上实现第一人称视角,各位读者可以根据需要来判定是否用这种算法。

原文地址:https://www.cnblogs.com/SmileSFL/p/5791007.html