Reading Lidar data into nuke.

October 20, 2013

Nuke Lidar Reader

 

Did some testing with my pointclouder python script i wrote for Nuke, attatching it to a CSV reader i loaded in some examples posted on the Nuke user forums: http://forums.thefoundry.co.uk/phpBB2/viewtopic.php?t=6982&postdays=0&postorder=asc&start=0 , sadly the data did only include luminance and not color data, but it still gives quite a good readout.

5 million points is a bit much to work with but filtering off 80% of the points still give a great result.

Nuke Point Cloud for big datasets

October 20, 2013

Nuke Million Points

(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)

Binocular view (image based lighting part 1)

March 19, 2013

This is a little snippit of “R&D” work i did on “Alle for To“.

I was tasked with doing a Binocular look across a handfull of scenes, i had allready done a Binocular look for “Over Kanten” (Look here, 14 sec into the video: http://vimeo.com/39554851 ), but the director wanted a more significant look, that should blend with the scene in terms of light and feel.

So i created a procedual Nuke script that took light, color and movement of the scene and used it to make the Binocular look. Here was the final result:

 

Creating the overall look.

Here is one of the  Binoculars i studied for my look.

IMG_6034

Looking through the Binocular with a camera all the sides go almost black and only a slight reflection is gathering along the edges, which was the look i went for in “Over Kanten”, so to make it blend even more i decided to go for a camera through the optics section. With this section alone you get alot more light across the edges and these edges are much more defined. A fun fact with looking through a Binocular with a camera is that the rolling shutter gets much much more apparent.

IMG_6035

The lensdistortion on the optics are not too bad. Here are a look at the distortion offset.

Skærmbillede 2013-03-19 kl. 22.26.23

 

Image based Lighting

After creating the final look, i cut the Binocular into 3 sections. One front for catching highlights, one mid for catching general lights, and one back for a refracted “rainbow” light. Each of these was mapped to catch light from diffrent parts of the eye pieces as seen in the example below:

Binocular “sway”

This is very much a personal preference but i just don’t like having the Binocular view slapped stiff ontop of the plate. You could add some shake to it but it usually looks fake when doing long or quick pans.

So i ended up writing my own little formula to get the Binocular to “sway” behind the camera of the plate. Using a motion vector averaged from 0 to -5 frames from the current frame you get this silky smooth movement chasing after the plate camera, making it look like Binocular is catching up to your head movement. This also ment that i could easily pop this camera into any scene without having to do manual keyframes.

 

Interactive Lighting

March 17, 2013

I had an idea about “real life AOV’s”, an attempt to do relight of real footage in post.

By using direct colored lights i was able to fully control the light of the scene in post with just a single video take. Sadly the limitation of this is that it only works in black and white. =(

Realtime Relighting from Hagbarth on Vimeo.

Motionblur-less Tracking Marker.

March 17, 2013

After dealing with some very problematic 3d tracking on some high motion blur footage, i got the idea of making a motion-blur less tracking marker.

The idea is very simple.
*High-frequency LED diodes attached to a small computer
*A Camera with a genlock option
*Making a small piece of code that translates the genlock timing into pulses, with intensity that are multiplied by the shutter speed (to compensate for brightness loss)

And wolla, a Motionblur-less Tracking Marker that always display as a perfect dot in your motionblur hell.

Here is a example, 5 led\’s, 1 being genlocked:

genlockmarker2