這張圖的效果是如何實現的?
來源網站http://www.plethora-project.com/
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:
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.comhttps://www.youtube.com/watch?v=KS4fyo3PbUk?www.youtube.com這是分層導出的,內部的層後期處理顏色淡一點,外部的顏色深一點以達到立體效果。這tmd就不是個地形圖,更像是個人或者怪獸的輪廓圖,或者是用這類3d模型倒出來偽裝成的地形圖。
rhino 里grasshopper 參數化,要不就在C4D 中參數化
一個思路步驟,不知道對不對
- Processing 3D-Wave,選擇一個角度,輸出圖片
- PS 手動設置模糊,加紅背景(也可以直接Processing加)
一些案例:
https://www.openprocessing.org?www.openprocessing.org推薦閱讀:
※Grasshopper 中 複雜數據 的理解和控制
※使用Bongo2.0製作桿件聯動動畫
※Grasshopper 有哪些奇技淫巧?
※grasshopper中如何在一平面上生成有一定規律的隨機點?
※VisualARQ 2 在線課程第二章
TAG:AdobePhotoshop | Rhino | 建築表現 | Grasshopper | 建築軟體 |