(a 10.000 point cube by a one million point cube)
Generating and managing big 3d data sets inside nuke using python is quite easy using the BakedPointCloud node.
A quick rundown of the node:
set cut_paste_input [stack 0]
version 7.0 v6
BakedPointCloud {
inputs 0
serializeKnob ""
serializePoints "2 1 0 0 2 0 0 "
serializeNormals "2 1 0 0 -1 0 0 "
serializeColors "2 0.0290033 0.0490741 0.100975 0.0290033 0.0490741 0.100975 "
name BakedPointCloud1
label Group1
selected true
xpos 725
ypos 967
}
This is a example of the BakedPointCloud created by the point cloud generator.
We can use this to generate 3D points on the fly (sadly not animated!)
Lets desect it:
set cut_paste_input [stack 0]
version 7.0 v6
BakedPointCloud {
inputs 0
serializeKnob ""
serializePoints "2 1 0 0 2 0 0 " #This part is where the points are stored, first we get the point count, followed by X Y and Z for each point. In this case we have 2 points at 1,0,0 and 2,0,0
serializeNormals "2 1 0 0 -1 0 0 " #This is the normals, and this might not seem interesting at first since its just points, however this can be used for sending off particles into a desired direction.
serializeColors "2 0.0290033 0.0490741 0.100975 0.0290033 0.0490741 0.100975 " #This is the colors, sadly the particle emitter won't sample them
name BakedPointCloud1
label Group1
selected true
xpos 725
ypos 967
}
To sum up, lets say we want to create a single point at position 100,20,-45.2
set cut_paste_input [stack 0]
version 7.0 v6
BakedPointCloud {
inputs 0
serializeKnob ""
serializePoints "1 100 20 45.2 "
serializeNormals "1 1 1 0 "
serializeColors "1 1 0 0"
name BakedPointCloud1
label Group1
selected true
xpos 725
ypos 967
}
I have created this code for generating pointclouds, this example will generate a cube of a million points.
'''================================================================================
; Function: PointClouder(points):
; Description: Generate a pointcloud from a series of specified points
; Parameter(s): points - A list a points formated [[X,Y,Z,VEL_X,VEL_Y,VEL_Z,COL_R,COL_G,COL_B][...]]
; Return: myNode - The pointcloud node created by the function
;
; Note(s): by Mads Hagbarth Lund 2013
;=================================================================================='''
def PointClouder(points):
pc_Points=pc_Velocities=pc_Colors = str(len(points))+ " " #Get the ammount of points
pc_Points = pc_Points + " ".join(str(i) for i in chain1(*points)) #Convert the points from list to clean text
pc_Velocities = pc_Velocities + " ".join(str(i) for i in chain2(*points))
pc_Colors = pc_Colors + " ".join(str(i) for i in chain3(*points))
myNode = nuke.createNode("BakedPointCloud") #Create a empty PointCloud node
myNode.knob("serializePoints").fromScript(pc_Points) #Append the data
myNode.knob("serializeNormals").fromScript(pc_Velocities)
myNode.knob("serializeColors").fromScript(pc_Colors)
return myNode
def chain1(*iterables):
for it in iterables:
for element in it[0:3]:
yield element
def chain2(*iterables):
for it in iterables:
for element in it[3:6]:
yield element
def chain3(*iterables):
for it in iterables:
for element in it[6:9]:
yield element
#Example 2
import random
MyTestPointCloud = []
index = 0
for x in range(0,1000000):
MyTestPointCloud.append([random.uniform(0, 600),random.uniform(0, 600),random.uniform(0, 600),4,5,6,random.uniform(0, 1),random.uniform(0, 1),random.uniform(0, 1)])
PointClouder(MyTestPointCloud)