Search - User list
Full Version: 3d line fitting for local point cloud
Root » Technical Discussion » 3d line fitting for local point cloud
ben-andersen
Sorry if this has come up before. I searched, but did find a previous thread on the topic.

I'm looking for a VOP or instructions for building a VOP network (or something) to provide the unit vector/slope of a best fit line for a local point cloud.

Basically, a linear regression for a set of local points, on a per point basis.

Is there something like this already? If not, could someone help me build it? My math isn't strong enough to build it myself. I found this: http://en.m.wikipedi…Line_Regression [en.m.wikipedi]

If it was even just boiled down into pseudo code, I could probably build the network, but I just don't know how to translate calculus or linear algebra into simple algebra to turn it into code. Any help would be appreciated :-)

Thanks!
animatrix_
I needed the exact thing back when H13 was released. Thanks to SESI for adding numpy, I wrote a Best Fit Line SOP pretty quickly. It works great, but be wary of using it on millions of points as numpy's svd consumes a lot of memory for some reason. I don't think it's a bug though.

I should upload it on Orbolt so it's a one click solution. Here is the code:

import numpy as np

node = hou.pwd()
geo = node.geometry()

p =
for pt in geo.points ( ):
p.append ( pt.position ( ) )

c = np.mean ( p, axis = 0, dtype = np.float64 )
u, s, v = np.linalg.svd ( p - c, full_matrices = False )

geo.addAttrib ( hou.attribType.Global, “bNormal”, v )
geo.addAttrib ( hou.attribType.Global, “bCenter”, c )

Paste it inside a Python SOP, and then reference the normal and center attributes anywhere you want.

I also have one to calculate the Best Fit Plane on Orbolt if you ever need that:
https://www.orbolt.com/asset/animatrix::bestFitPlane::1.00 [orbolt.com]

This one is written in VEX and can run through millions of points without any issues or performance penalties and hardly uses any memory. It uses a different technique though, which is why the difference.

Just recently I used it to have a boat react to the waves of a sea. Using Align SOP is very jittery, especially if the sea is not calm. Getting the Best Fit Plane of the sea bbox'ed by the boat and reorienting the boat worked really well. Just an unusual usage I thought I would mention in the hopes that SESI might add similar functionality to H14. They are very welcome to add mines too if they are feeling tired
ben-andersen
This is terrific. Thanks so much! I'll try it out when I get home in a few days :-)

The plane looks like what I need, but does it provide multiple local planes, if the point cloud search radius is smaller than the entire cloud? Is that what those smaller planes in one of your images are?

Thanks again. I really appreciate it.
animatrix_
Actually I am not using point cloud functions It uses all points in the input. So if you specify a subset of those using the Group parameter, then it will find the best fit plane of only those points.
edward
The BlendPose CHOP has an SVD linear solver, set the Interpolant to Hyperplane.

EDIT: The solver is probably about the same as numpy though.
Michael Battcock
edward
The BlendPose CHOP has an SVD linear solver, set the Interpolant to Hyperplane.

EDIT: The solver is probably about the same as numpy though.

I know this is an old post but I don't understand what the inputs should be for the blendPose chop, can you explain how to use it?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB