這張圖的效果是如何實現的?

來源網站http://www.plethora-project.com/


Blender 實現。先放成品:

&<更新&>

這是 40k 個點的:

&

用插件什麼的太無聊了,自己寫程序才是王道。Delaunay triangulation 了解一下?當然這個演算法寫起來挺麻煩,所以我直接找了現成的???????? 有這個以後剩下的都是體力活了。既然是 triangulation,首先要有一坨點,所以步驟大概是這樣的:

  1. 生成一坨隨機的坐標
  2. 用 triangulation 生成三角形
  3. 用三角形生成 mesh
  4. 對 mesh 做合適的變形
  5. Blender 的 cycle 渲染器不能渲染「點」這種東西,所以要把這一坨點變成一坨球體
  6. Blender 也不能直接渲染邊(edge),所以要把邊變成 mesh
  7. 渲染
  8. 後期

首先生成隨機坐標。在一個範圍里隨機生成點有很多方法,其中一些演算法可以讓生成的點看起來比較「均勻」,這樣出來的效果是墜吼的。但是我懶,所以我直接用了隨機數??

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:
print(., 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。

&


費了老鼻子勁兒,做出了一個不怎麼像的,方法僅供參考:

首要問題是把這些點做出來。我之前寫了一個生成隨機地形的文章,調整參數,做出這樣的曲面:

UUZArch:Grasshopper快速生成地形?

zhuanlan.zhihu.com圖標

畫一個參考曲面和一個目標曲面,使用 沿著曲面流動 把這個毛肚一樣的曲面流動過去。

然後把新生成的曲面作為參考物件放入grasshopper,使用divide surface得到曲面上的點。再搭配populate 3d和vector 2pt將這些點隨機移動。

使用gh1.0的新電池3d delauney即可生成連接線

使用cull pattern刪除所有過長的線

曲線生成圓管,創建材質,按照曲線長度控制透明度,最後bake帶材質的圓管和所有點。

調整顯示模式和視圖,即可導出圖片

gh1.0文件下載:

鏈接: https://pan.baidu.com/s/1RXkkGzIFjMB7MKQh1qiZeg

密碼: ubda


「當我看到一隻鳥,它走路像鴨子,游泳像鴨子,叫聲像鴨子,我就稱其為鴨子。」

所以我覺得這是用AE的Plexus插件做的。

https://www.youtube.com/watch?v=AU0pG3X_o-E?

www.youtube.com

https://www.youtube.com/watch?v=KS4fyo3PbUk?

www.youtube.com


這是分層導出的,內部的層後期處理顏色淡一點,外部的顏色深一點以達到立體效果。

這tmd就不是個地形圖,更像是個人或者怪獸的輪廓圖,或者是用這類3d模型倒出來偽裝成的地形圖。


rhino 里grasshopper 參數化,要不就在C4D 中參數化


一個思路步驟,不知道對不對

  1. Processing 3D-Wave,選擇一個角度,輸出圖片
  2. PS 手動設置模糊,加紅背景(也可以直接Processing加)

一些案例:

https://www.openprocessing.org?

www.openprocessing.org


推薦閱讀:

Grasshopper 中 複雜數據 的理解和控制
使用Bongo2.0製作桿件聯動動畫
Grasshopper 有哪些奇技淫巧?
grasshopper中如何在一平面上生成有一定規律的隨機點?
VisualARQ 2 在線課程第二章

TAG:AdobePhotoshop | Rhino | 建築表現 | Grasshopper | 建築軟體 |