Python实现 Soul 旋转散点球面效果

前言

打算做几个安卓APP练手,第一个方向是社交类的。在应用商店上搜索“社交”,第一个就是Soul,因为它打了广告。。。下载玩了一下,第一个仿做的社交应用就它好了。

其中有一个效果是这样的:
Python实现 Soul 旋转散点球面效果_第1张图片
这个会转的散点球面效果就是接下来要说的。
先放一下我做的效果吧。

python仿Soul旋转球效果

实现

首先,这是一个3D的效果,当然,我们也不可能选择使用3D引擎来做。实际上,渲染的时候我们只需要在2D平面上渲染就行。

我们从交互效果入手。球是围绕着过球心的一条直线旋转的,这条线就是旋转轴,那么怎么确定这条旋转轴呢?我们在屏幕上划一条线,显然,旋转轴垂直我们划出来的这条直线。旋转除了要旋转轴之外,我们还需要一个旋转角,这个我们可以按照划线长度按照一定比例换算成旋转角度。从交互效果中,我们分析了用户交互会提供的两个参数:旋转轴、旋转角度。

那么要实现这个会旋转的散点球面,显然我们首先要生成一堆散点,这些散点分布在球面上,最好能够均匀分布。至于如何均匀分布这些点,可以看看10560 怎样在球面上「均匀」排列许多点?

那么如何根据这两个交互参数旋转我们的球呢?
1、这个球是散点组成的,第一个思路就是旋转这些点。围绕着某个旋转轴旋转点,我们可以把散点换成向量,把旋转轴也换成向量,这样,问题就变成向量围绕另一个向量旋转的问题,我们有罗德里格旋转公式。

2、另外,我们可以这样想,把坐标系旋转,然后求出各个点在原坐标系下的坐标。那么我们怎么描述一个坐标系呢?我们可以通过一组基底向量。比如 i ⃗ , j ⃗ , k ⃗ 分 别 表 示 某 个 坐 标 系 x , y , z 轴 的 三 个 基 底 假 设 某 点 p 在 该 系 下 的 坐 标 为 ( x , y , z ) 那 么 其 在 标 准 坐 标 系 下 的 向 量 表 示 应 该 为 x i ⃗ + y j ⃗ + z k ⃗ 我 们 也 可 以 使 用 矩 阵 乘 法 来 表 示 : 设 A = [ i ⃗ j ⃗ k ⃗ ] , x = [ x y z ] , A x 即 所 求 \vec{i}, \vec{j}, \vec{k} 分别表示某个坐标系x,y,z轴的三个基底 \\ 假设某点p在该系下的坐标为(x, y, z) \\ 那么其在标准坐标系下的向量表示应该为 x\vec{i} + y\vec{j} + z\vec{k} \\ 我们也可以使用矩阵乘法来表示: \\ 设A = \begin{bmatrix} \vec{i} & \vec{j} & \vec{k} \end{bmatrix}, x = \begin{bmatrix} x \\ y \\z \end{bmatrix},Ax即所求 i ,j ,k x,y,zp(x,y,z)xi +yj +zk 使:A=[i j k ],x=xyz,Ax 第二种思路中,我们对三个基底 i ⃗ , j ⃗ , k ⃗ \vec{i}, \vec{j}, \vec{k} i ,j ,k 围绕旋转轴向量旋转后得到新的基底,也就是得到新的坐标系,再求 A x Ax Ax 就可以得到我们需要的旋转后的散点坐标了。

代码

github,采用第二种方法。

你可能感兴趣的:(python,仿APP,python,线性代数)