前陣子有一個需求效果,是要做許多環繞在球型上的切線。
在經過幾個測試評估後,決定在球心附近產生亂數點,給予方向屬性,然後找出通過此點並垂直球心的的圓切面來取得線段,可以達到最大的調整彈性跟計算效率。
產生參考點
首先就是要產生每個切線的圓心,利用一顆要小許多的球來產生點,讓範圍只在球心附近徘徊,因為不想產生半徑太小的圓切面。
設定參考點屬性
接著幫每個點設定隨機的垂直 up 跟 N,去決定圓切面的方向。
求出圓心
最重點的地方,利用數學公式去找出通過點並垂直球心的圓心。
整理後的公式如下:
vector getCircleCenter(vector p_normal, p_pos){ float a, b, c, x, y, z; assign(a, b, c, p_normal); assign(x, y, z, p_pos); float d = -a*x - b*y - c*z; float t = -( d / (a*a + b*b + c*c) ); return p_normal * t; } // p_normal = 點的N,p_pos = 點的位置,這是圓心為{0, 0, 0}下的簡易公式
有圓心後再依據其方向投射到球面(外殼)的位置找到半徑數值寫在pscale裡面,並用copy circle的方式便可以產生環繞球型的切線。
particle點綴
這邊是點綴效果,讓每個線上都有particle在跑,因為有up跟圓心的數值,可以用cross product輕鬆求出v值的方向做出這個效果。