這張圖的效果是如何實現的?
費了老鼻子勁兒,做出了一個不怎麼像的,方法僅供參考:
首要問題是把這些點做出來。我之前寫了一個生成隨機地形的文章,調整引數,做出這樣的曲面:
UUZArch:Grasshopper快速生成地形
畫一個參考曲面和一個目標曲面,使用 沿著曲面流動 把這個毛肚一樣的曲面流動過去。
然後把新生成的曲面作為參考物件放入grasshopper,使用divide surface得到曲面上的點。再搭配populate 3d和vector 2pt將這些點隨機移動。
使用gh1。0的新電池3d delauney即可生成連線線
使用cull pattern刪除所有過長的線
曲線生成圓管,建立材質,按照曲線長度控制透明度,最後bake帶材質的圓管和所有點。
調整顯示模式和檢視,即可匯出圖片
gh1。0檔案下載:
連結:
https://
pan。baidu。com/s/1RXkkGz
IFjMB7MKQh1qiZeg
密碼: ubda
“當我看到一隻鳥,它走路像鴨子,游泳像鴨子,叫聲像鴨子,我就稱其為鴨子。”
所以我覺得這是用AE的Plexus外掛做的。
https://www。
youtube。com/watch?
v=AU0pG3X_o-E
https://www。
youtube。com/watch?
v=KS4fyo3PbUk
Blender 實現。先放成品:
<更新>
這是 40k 個點的:
更新>
用外掛什麼的太無聊了,自己寫程式才是王道。Delaunay triangulation 瞭解一下?當然這個演算法寫起來挺麻煩,所以我直接找了現成的⋯⋯⋯⋯⋯⋯⋯⋯ 有這個以後剩下的都是體力活了。既然是 triangulation,首先要有一坨點,所以步驟大概是這樣的:
生成一坨隨機的座標
用 triangulation 生成三角形
用三角形生成 mesh
對 mesh 做合適的變形
Blender 的 cycle 渲染器不能渲染「點」這種東西,所以要把這一坨點變成一坨球體
Blender 也不能直接渲染邊(edge),所以要把邊變成 mesh
渲染
後期
首先生成隨機座標。在一個範圍裡隨機生成點有很多方法,其中一些演算法可以讓生成的點看起來比較「均勻」,這樣出來的效果是墜吼的。但是我懶,所以我直接用了隨機數⋯⋯
class
Point2D
(
object
):
def
__init__
(
self
,
x
=
0
,
y
=
0
):
self
。
x
=
x
self
。
y
=
y
def
toVert
(
self
,
z
=
0
):
return
(
self
。
x
,
self
。
y
,
z
)
def
genRandomPoints
(
count
,
xrange
,
yrange
):
for
i
in
range
(
count
):
yield
Point2D
(
random
。
uniform
(
*
xrange
),
random
。
uniform
(
*
yrange
))
然後生成三角形並生成 mesh
def
createMesh
(
points
):
me
=
bpy
。
data
。
meshes
。
new
(
“TheMesh”
)
ob
=
bpy
。
data
。
objects
。
new
(
“TheObject”
,
me
)
ob
。
location
=
Vector
((
0
,
0
,
0
))
ob
。
show_name
=
True
# Link object to scene and make active
scn
=
bpy
。
context
。
scene
scn
。
objects
。
link
(
ob
)
scn
。
objects
。
active
=
ob
ob
。
select
=
True
# Create mesh from given verts, faces。
verts
=
tuple
(
point
。
toVert
()
for
point
in
points
)
faces
=
computeDelaunayTriangulation
(
points
)
me
。
from_pydata
(
verts
,
[],
faces
)
# Update mesh with new data
me
。
update
()
return
ob
createMesh
(
tuple
(
genRandomPoints
(
10000
,
(
-
4
,
4
),
(
-
2
,
2
))))
我這裡只用了 10000 個點。本來計劃只是試一下,成品應該用 40000 個點的,但是最後我懶得再搞一次了⋯⋯ 出來的效果是這樣的:
這個 mesh 還是平平的一坨,不好看,所以要加置換和變形
然後就可以放小球了。
def
createBallsFromMesh
(
mesh
):
Verts
=
mesh
。
vertices
bpy
。
ops
。
object
。
select_all
(
action
=
‘DESELECT’
)
bpy
。
ops
。
mesh
。
primitive_uv_sphere_add
(
segments
=
4
,
ring_count
=
4
,
size
=
0。002
,
location
=
(
0
,
0
,
0
))
RefBall
=
bpy
。
context
。
object
Balls
=
[]
i
=
0
for
Vert
in
Verts
:
if
i
%
100
==
0
:
(
‘。’
,
end
=
“”
,
flush
=
True
)
Ball
=
RefBall
。
copy
()
Ball
。
data
=
RefBall
。
data
。
copy
()
bpy
。
context
。
scene
。
objects
。
link
(
Ball
)
Ball
。
location
=
Vert
。
co
。
to_tuple
()
Balls
。
append
(
Ball
)
i
+=
1
return
Balls
Balls
=
createBallsFromMesh
(
bpy
。
context
。
selected_objects
[
0
]
。
data
)
bpy
。
ops
。
object
。
select_all
(
action
=
‘DESELECT’
)
for
Ball
in
Balls
:
Ball
。
select
=
True
bpy
。
context
。
scene
。
objects
。
active
=
Balls
[
0
]
bpy
。
ops
。
object
。
join
()
這裡有個坑。新增小球的時候不要用 10000 次 primitive_uv_sphere_add(),而是要建一個樣本然後 copy 10000 次。(思考題:這是為什麼呢?)
球長這樣:
接下來就沒 Python 什麼事了(當然你完全可以寫個 Python 讓整個過程全自動,但是我懶啊⋯⋯)。在 mesh 上加個 Wireframe 修改器,把 mesh 和球的材質都設成自發光,然後就可以渲染了。
直接渲染出來效果是比較愣的,還需要後期一下。大概這樣:
然後加字出圖就可以了。
整個流程有很多可以玩的地方:
隨機生成座標的演算法對最終效果影響很大,有很多 non-trivial 的演算法可選。
可以生成更密的 mesh。
可以生成多個 mesh 放在一起。
後期的時候有各種效果可以玩,比如這種殺馬特效果:
<更新>
玩了點別的花樣,高斯分佈的點,按距離隨機生成 edge:
Blender 原始檔:
https://
drive。google。com/open?
id=11RbB4x1lXi3c7944thgkpEOIbCG43DGM
,注意裡面有兩個 scenes。
更新>
這個事情其實蠻尷尬的。。。看到前面有那麼多前輩做出瞭如此用心的回答。。。
只是因為標籤裡有Grasshopper,我不清楚是不是題主表示一定要用GH實現,但是事實是我覺得這個東西真的是用Plexus做的。。。。。
一個AE外掛。5分鐘輕鬆出圖。。。
這回答都太牛X了!