Python實現 Soul 旋轉散點球面效果

2021-10-25 06:37:08 字數 1796 閱讀 7771

其中有乙個效果是這樣的:

這個會轉的散點球面效果就是接下來要說的。

先放一下我做的效果吧。

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=[

xyz]

,ax即

所求\vec, \vec, \vec 分別表示某個座標系x,y,z軸的三個基底 \\ 假設某點p在該系下的座標為(x, y, z) \\ 那麼其在標準座標系下的向量表示應該為 x\vec + y\vec + z\vec \\ 我們也可以使用矩陣乘法來表示: \\ 設a = \begin \vec & \vec & \vec \end, x = \begin x \\ y \\z \end,ax即所求

i,j​,k

分別表示

某個座標

系x,y

,z軸的

三個基底

假設某點

p在該系

下的座標

為(x,

y,z)

那麼其在

標準座標

系下的向

量表示應

該為xi

+yj​

+zk我

們也可以

使用矩陣

乘法來表

示:設a

=[i​

j​​k

​],x

=⎣⎡​

xyz​

⎦⎤​,

ax即所

求 第二種思路中,我們對三個基底i⃗,

j⃗,k

⃗\vec, \vec, \vec

i,j​,k

圍繞旋轉軸向量旋轉後得到新的基底,也就是得到新的座標系,再求 axax

ax就可以得到我們需要的旋轉後的散點座標了。

github,採用第二種方法。

python旋轉 Python實現旋轉矩陣

要求 給乙個n n的陣列,旋轉90度。手動畫個醜圖 image.png 簡單思路 順時針 如圖四個紅框為乙個layer,每次旋轉乙個layer,layer的範圍是 0,len nums 2 在第乙個layer迴圈中,要將四角的元素按一下順序旋轉 0,0 轉到 0,3 轉到 3,3 轉到 3,0 轉到...

KL散度及其python實現

kl散度又是乙個從資訊理論 熵的角度考量距離的乙個量。但是,這裡說他是距離有點不妥,因為距離需要滿足4個條件 1 d x,x 0 反身性 2 d x,y 0 非負性 3 d x,y d y,x 對稱性 4 d x,k d k,y d x,y 三角形法則 但是,很遺憾,我們的kl散度至滿足前面兩條,後...

LeetCode使用Python實現旋轉陣列

給定乙個陣列,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。輸入 1,2,3,4,5,6,7 和 k 3 輸出 5,6,7,1,2,3,4 解釋 向右旋轉 1 步 7,1,2,3,4,5,6 向右旋轉 2 步 6,7,1,2,3,4,5 向右旋轉 3 步 5,6,7,1,2,3,4 輸入 ...