ow..
It's basically using a 3d framework to define points on the framework and then interpolate curves through them.
Right now Im assuming that I merely translated something incorrectly early in the script that lead to most of the definition issues later on...?? It also seems I am not using the append function correctly... :(
If anybody well versed could take a look it would be awesome... :)
The code I've used is below and the erros I get are attached here:
Private Sub RunScript(ByVal ptSetA As List(Of Point3d), ByVal ptSetB As List(Of Point3d), ByVal divU As Integer, ByVal divV As Integer, ByRef A As Object, ByRef B As Object) Dim n As Integer = 0 Dim ptListA As New List(Of list(Of Point3d)) Dim ptListB As New List(Of list(Of Point3d)) For i As Integer = 0 To divU Dim ptRowA As New List(Of Point3d) Dim ptRowB As New list(Of point3d) For j As Integer = 0 To divV Dim ptA As New Point3d(ptSetA(n)) Dim ptB As New point3d(ptSetB(n)) ptRowA.Add(ptA) ptRowB.Add(ptB) n = n + 1 Next ptListA.Add(ptRowA) ptListB.Add(ptRowB) Next Dim intcvListA As New List(Of NurbsCurve) For i As Integer = 0 To divU - 1 Step 2 For j As Integer = 0 To divV - 1 Step 1 Dim pt01A As New point3d((ptListA(i)(j) + ptListA(i)(j + 1)) / 2) Dim pt01A As New point3d((ptListA(i + 1)(j) + ptListB(i + 1)(j)) / 2) Dim pt01A As New point3d((ptListA(i + 2)(j) + ptListA(i + 2)(j + 1)) / 2) Dim pt01A As New point3d((ptListA(i + 1)(j) + ptListA(i + 1)(j + 1)) / 2) Dim dis01A As Double = pt01A.DistanceTo(pt04A) Dim dis02A As Double = pt03A.DistanceTo(pt04A) Dim vt01A As New Vector3d((pt04A - pt01A) / dis01A) Dim vt02A As New Vector3d((pt03A - pt04A) / dis02A) Dim pt01B As New point3d((ptListB(i)(j) + ptListB(i)(j + 1)) / 2) Dim pt01B As New point3d((ptListA(i + 1)(j) + ptListB(i + 1)(j)) / 2) Dim pt01B As New point3d((ptListB(i + 2)(j) + ptListB(i + 2)(j + 1)) / 2) Dim pt01B As New point3d((ptListB(i + 1)(j) + ptListB(i + 1)(j + 1)) / 2) Dim dis01B As Double = pt01B.DistanceTo(pt04B) Dim dis02B As Double = pt03B.DistanceTo(pt04B) Dim vt01B As New Vector3d((pt04B - pt01B) / dis01B) Dim vt02B As New Vector3d((pt03B - pt04B) / dis02B) Dim ptArrA As New List(Of Point3d) ptArrA.Append(pt01A) ptArrA.Append(pt02A) ptArrA.Append(pt03A) Dim intcvA As New NurbsCurve() intcvA = CreateInterpolatedCurve(ptArrA, 3) intcvListA.Add(intcvA) Dim ptArrB As New List(Of Point3d) ptArrB.Append(pt01B) ptArrB.Append(pt02B) ptArrB.Append(pt03B) Dim intcvB As New NurbsCurve() intcvB = CreateInterpolatedCurve(ptArrB, 3) intcvListB.Add(intcvB) Next Next A = intcvListA…
t file** - ply file with just x,y,z locations. I got it from a 3d scanner. Here is how first few lines of file looks like - ply format ascii 1.0 comment VCGLIB generated element vertex 6183 property float x property float y property float z end_header -32.3271 -43.9859 11.5124 -32.0631 -43.983 11.4945 12.9266 -44.4913 28.2031 13.1701 -44.4918 28.2568 13.4138 -44.4892 28.2531 13.6581 -44.4834 28.1941 13.9012 -44.4851 28.2684 ... ... ... In case you need the data - please email me on **nisha.m234@gmail.com**. **Algorithm:** I am trying to find principal curvatures for extracting the ridges and valleys. The steps I am following is: 1. Take a point x 2. Find its k nearest neighbors. I used k from 3 to 20. 3. average the k nearest neighbors => gives (_x, _y, _z) 4. compute covariance matrix 5. Now I take eigen values and eigen vectors of this covariance matrix 6. I get u, v and n here from eigen vectors. u is a vector corresponding to largest eigen value v corresponding to 2nd largest n is 3rd smallest vector corresponding to smallest eigen value 7. Then for transforming the point(x,y,z) I compute matrix T T = [ui ] [u ] [x - _x] [vi ] = [v ] x [y - _y] [ni ] [n ] [z - _z] 8. for each i of the k nearest neighbors:<br> [ n1 ] [u1*u1 u1*v1 v1*v1] [ a ]<br> [ n2 ] = [u2*u2 u2*v2 v2*v2] [ b ] <br> [... ] [ ... ... ... ] [ c ] <br> [ nk ] [uk*uk uk*vk vk*vk]<br> Solve this for a, b and c with least squares 9. this equations will give me a,b,c 10. now I compute eigen values of matrix [a b b a ] 11. This will give me 2 eigen values. one is Kmin and another Kmax. **My Problem:** The output is no where close to finding the correct Ridges and Valleys. I am totally Stuck and frustrated. I am not sure where exactly I am getting it wrong. I think the normal's are not computed correctly. But I am not sure. I am very new to graphics programming and so this maths, normals, shaders go way above my head. Any help will be appreciated. **PLEASE PLEASE HELP!!** **Resources:** I am using Visual Studio 2010 + Eigen Library + ANN Library. **Other Options used** I tried using MeshLab. I used ball pivoting triangles remeshing in MeshLab and then applied the polkadot3d shader. If correctly identifies the ridges and valleys. But I am not able to code it. **My Function:** //the function outputs to ply file void getEigen() { int nPts; // actual number of data points ANNpointArray dataPts; // data points ANNpoint queryPt; // query point ANNidxArray nnIdx;// near neighbor indices ANNdistArray dists; // near neighbor distances ANNkd_tree* kdTree; // search structure //for k = 25 and esp = 2, seems to got few ridges queryPt = annAllocPt(dim); // allocate query point dataPts = annAllocPts(maxPts, dim); // allocate data points nnIdx = new ANNidx[k]; // allocate near neigh indices dists = new ANNdist[k]; // allocate near neighbor dists nPts = 0; // read data points ifstream dataStream; dataStream.open(inputFile, ios::in);// open data file dataIn = &dataStream; ifstream queryStream; queryStream.open("input/query.
pts", ios::in);// open data file queryIn = &queryStream; while (nPts < maxPts && readPt(*dataIn, dataPts[nPts])) nPts++; kdTree = new ANNkd_tree( // build search structure dataPts, // the data points nPts, // number of points dim); // dimension of space while (readPt(*queryIn, queryPt)) // read query points { kdTree->annkSearch( // search queryPt, // query point k, // number of near neighbors nnIdx, // nearest neighbors (returned) dists, // distance (returned) eps); // error bound double x = queryPt[0]; double y = queryPt[1]; double z = queryPt[2]; double _x = 0.0; double _y = 0.0; double _z = 0.0; #pragma region Compute covariance matrix for (int i = 0; i < k; i++) { _x += dataPts[nnIdx[i]][0]; _y += dataPts[nnIdx[i]][1]; _z += dataPts[nnIdx[i]][2]; } _x = _x/k; _y = _y/k; _z = _z/k; double A[3][3] = {0,0,0,0,0,0,0,0,0}; for (int i = 0; i < k; i++) { double X = dataPts[nnIdx[i]][0]; double Y = dataPts[nnIdx[i]][1]; double Z = dataPts[nnIdx[i]][2]; A[0][0] += (X-_x) * (X-_x); A[0][1] += (X-_x) * (Y-_y); A[0][2] += (X-_x) * (Z-_z); A[1][0] += (Y-_y) * (X-_x); A[1][1] += (Y-_y) * (Y-_y); A[1][2] += (Y-_y) * (Z-_z); A[2][0] += (Z-_z) * (X-_x); A[2][1] += (Z-_z) * (Y-_y); A[2][2] += (Z-_z) * (Z-_z); } MatrixXd C(3,3); C <<A[0][0]/k, A[0][1]/k, A[0][2]/k, A[1][0]/k, A[1][1]/k, A[1][2]/k, A[2][0]/k, A[2][1]/k, A[2][2]/k; #pragma endregion EigenSolver<MatrixXd> es(C); MatrixXd Eval = es.eigenvalues().real().asDiagonal(); MatrixXd Evec = es.eigenvectors().real(); MatrixXd u,v,n; double a = Eval.row(0).col(0).value(); double b = Eval.row(1).col(1).value(); double c = Eval.row(2).col(2).value(); #pragma region SET U V N if(a>b && a>c) { u = Evec.row(0); if(b>c) { v = Eval.row(1); n = Eval.row(2);} else { v = Eval.row(2); n = Eval.row(1);} } else if(b>a && b>c) { u = Evec.row(1); if(a>c) { v = Eval.row(0); n = Eval.row(2);} else { v = Eval.row(2); n = Eval.row(0);} } else { u = Eval.row(2); if(a>b) { v = Eval.row(0); n = Eval.row(1);} else { v = Eval.row(1); n = Eval.row(0);} } #pragma endregion MatrixXd O(3,3); O <<u, v, n; MatrixXd UV(k,3); VectorXd N(k,1); for( int i=0; i<k; i++) { double x = dataPts[nnIdx[i]][0];; double y = dataPts[nnIdx[i]][1];; double z = dataPts[nnIdx[i]][2];; MatrixXd X(3,1); X << x-_x, y-_y, z-_z; MatrixXd T = O * X; double ui = T.row(0).col(0).value(); double vi = T.row(1).col(0).value(); double ni = T.row(2).col(0).value(); UV.row(i) << ui * ui, ui * vi, vi * vi; N.row(i) << ni; } Vector3d S = UV.colPivHouseholderQr().solve(N); MatrixXd II(2,2); II << S.row(0).value(), S.row(1).value(), S.row(1).value(), S.row(2).value(); EigenSolver<MatrixXd> es2(II); MatrixXd Eval2 = es2.eigenvalues().real().asDiagonal(); MatrixXd Evec2 = es2.eigenvectors().real(); double kmin, kmax; if(Eval2.row(0).col(0).value() < Eval2.row(1).col(1).value()) { kmin = Eval2.row(0).col(0).value(); kmax = Eval2.row(1).col(1).value(); } else { kmax = Eval2.row(0).col(0).value(); kmin = Eval2.row(1).col(1).value(); } double thresh = 0.0020078; if (kmin < thresh && kmax > thresh ) cout << x << " " << y << " " << z << " " << 255 << " " << 0 << " " << 0 << endl; else cout << x << " " << y << " " << z << " " << 255 << " " << 255 << " " << 255 << endl; } delete [] nnIdx; delete [] dists; delete kdTree; annClose(); } Thanks, NISHA…
ake a network of lines (i.e. a graph) and make a Plankton Mesh, from which you can use Cytoskeleton to make a solid mesh (and then smooth it with Weaverbird).
Works with ngons (polygons with 3 or more sides). Other examples I found only worked with tris and quads.
Works on open or closed surfaces
While these examples start with a surface, you could start with a network of lines and make a patch surface
This is meant for 2D networks/surfaces. I haven't attempted filling a 3D volume. My guess is this wouldn't work as it would require a non-manifold mesh that Plankton wouldn't handle.
Note similar results could be achieved with the following:
TSplines
MeshDual (dual of a tri mesh, not as much freedom/control)
Working backwards, here is the GhPython script from Will Pearson that builds a Plankton Mesh from vertices and faces. The vertices are a list of 3D coordinates, the faces are a tree a lists, with each list containing the indices of vertices that form a closed loop. From Will, "Plankton only handles manifold meshes, i.e. meshes which have a front and a back. This orientation is determined by the "right-hand rule" i.e. if the vertices of a face are ordered counter-clockwise then the face normal will be out of the page/screen."
# V: list of Point3d # F: tree of int
import Grasshopper appdata = Grasshopper.Folders.DefaultAssemblyFolder
import clr clr.AddReferenceToFileAndPath(appdata + "Plankton.dll")
import Plankton
pmesh = Plankton.PlanktonMesh()
for pt in V: pmesh.Vertices.Add(pt.X, pt.Y, pt.Z)
for face in F.Branches: face = list(face)[:-1] pmesh.Faces.AddFace(face)
These vertices and faces are precisely the output from Starling. Starling takes in a list of Polylines which form the (properly oriented) face loops.
The polyline face loops can be generated...
Directly from Panels on a surface using LunchBox
Using any network of lines/curves on a surface (curves will need to be converted to polylines before Starling)
The latter was achieved using the Surface Split command, then converting the face edges (converted to curves) into polyline loops to represent faces.
…
hope this number will grow in future. Currently available features are:
1) Creation of 2d or 3d context for any kind of building related analysis: automatically generate the 2d/3d surrounding buildings for the location where you would like to perform visibility, solar radiation, cfd or any other type of analysis. You need some other plugin for the last three, like Ladybug. It only creates the context=surroundings! The "automatic generation" process also includes creation of the local topography (terrain) along with buildings.
2) Identification of certain 2d or 3d elements in the created context. For example: selection of all hotels, parks, hospitals, restaurants, residential buildings etc.
3) Performing direct terrain analysis (hillshading, slope, ruggedness, roughness, water flow...)
4) Creation of terrain shading masks and horizon files for further solar and photovoltaics analysis.
Gismo will be very grateful if he could get any suggestions, improvements, bug reports and testing in the following period. In case you are willing to provide any of these, the requirements, installation steps and .gh example files can be found here, here and here.
Thank you in advance !!…
Added by djordje to Gismo at 9:10am on January 29, 2017
Introduzione a Grasshopper", il primo manuale su Grasshopper.
.
I corsi PLUG IT nascono dalla volontà di promuovere le nuove tecnologie digitali di supporto alla progettazione e condividere il know-how maturato attraverso ricerca, collaborazione con i più importanti studi di architettura e pubblicazioni internazionali.
.
Verranno introdotte le nozioni base di Grasshopper approfondendo le metodologie della progettazione parametrica e le tecniche di modellazione algoritmica per la generazione di forme complesse. Il corso è rivolto a studenti e professionisti con esperienza minima nella modellazione 3D e si articolerà in lezioni teoriche ed esercitazioni.
. Argomenti trattati:
- Introduzione alla progettazione parametrica: teoria, esempi, casi studio - Grasshopper: concetti base, logica algoritmica, interfaccia grafica - Nozioni fondamentali: componenti, connessioni, data flow
- Funzioni matematiche e logiche, serie, gestione dei dati - Analisi e definizione di curve e superfici
- Definizione di griglie e pattern complessi - Trasformazioni geometriche, paneling - Attrattori, image sampler
- Data tree: gestione di dati complessi - Digital fabrication: teoria ed esempi - Nesting: scomposizione di oggetti tridimensionali in sezioni piane per macchine CNC
.
Verrà rilasciato un attestato finale.
.
Ulteriori info e programma completo su: www.arturotedeschi.com e su www.edizionilepenseur.it…
ns about them.
It's a direction for Kangaroo I very much intend to continue developing - and I am still getting to grips with the possibilities and experimenting with how different optimization and fairing forces work in combination with one another, so I would value your input and experience.
For those interested in some background reading material -
[1] http://www.cs.caltech.edu/~mmeyer/Research/FairMesh/implicitFairing.pdf
[2] http://mesh.brown.edu/taubin/pdfs/taubin-eg00star.pdf
[3] http://www.pmp-book.org/download/slides/Smoothing.pdf
[4] http://graphics.stanford.edu/courses/cs468-05-fall/slides/daniel_willmore_flow_fall_05.pdf
[5] http://www.evolute.at/technology/scientific-publications.html
[6] http://www.math.tu-berlin.de/~bobenko/recentpapers.html
[7] http://spacesymmetrystructure.wordpress.com/2011/05/18/pseudo-physical-materials/
[8] http://www.evolute.at/technology/scientific-publications/34.html
[9] http://www.evolute.at/software/forum/topic.html?id=18
At the moment the Laplacian smoothing is uniformly weighted, which tends to even out the edge lengths as well as smoothing the form, which is sometimes desirable, and sometimes not. It also tends to significantly shrink meshes when the edges are not fixed.
I plan to try some of the other weighting possibilities, such as Fujiwara or cotangent weighting (see [1] and [3]), as well as other fairing approaches, such as Taubin smoothing [2], Willmore flow[4], and so on. This also has applications in the simulation of bending of thin shells.
Planar quad panels are often desirable, but I'm finding that planarization forces alone are sometimes unstable, or cause undesirable crumpling, so need to be combined with some sort of fairing/smoothing, but the different types have quite different effects, and the balance is sometimes tricky.
There's also the whole issue of meshes which are circular (I posted a demo of circularization on the examples page), or conical (this one still isn't working quite right yet), and their relationship with principal curvature grids and placement of irregular vertices, all of which is rather different when the whole form is up for change, rather than having a fixed target surface [7].
I'm also trying to get to grips with ways of making surfaces of planar hexagons, which need to become concave in regions of negative Gaussian curvature (see this discussion)
and I hope to release soon a component for calculating CP meshes, as described in [8], which I think could have many exciting construction implications.
While there are a number of well developed smoothing algorithms, their main area of application so far seems to be in processing and improving 3D scan data, so using them in design in this way is somewhat new territory. There can be structural, fabrication or performance reasons for certain types of smoothness, but of course the aesthetic reasons are also often important, and I think there are some interesting discussions to be had here about the aesthetics of smoothness.
Anyway, that's enough rambling from me, hopefully something there triggers some discussion - I'm really keen to hear about how all of you envision these tools might be used and developed.
…
ally to describe a process of repeating objects in a self-similar way. Simply stated, the definition of a recursive function includes the function itself. Fractals are among the canonical examples of recursion in mathematics and programming. A loop can simply be a way to apply the same operation to a list of elements, but it is an iterative loop if the results from one step are used in the calculation of the next step. In design research controlling recursion becomes a new strategy to define new forms and spaces.
BRIEF
In this workshop we will be exploring iterative strategies through parametric design. Main tool for the course will be grasshopper3d and its add-on Anemone. Anemone is a simple but effective plug-in for Grasshopper that enables for loops in a simple and linear way. We will explore several strategies such iterative growth, L systems, fractals, recursive subdivisions and more. Our course will focus on how those methods can affect three-dimensional geometries, generating unexpected conformations.
TOPICS
intro to rhinointro to grasshopperadvanced grasshopperdata managementintro to loopscellular automatal-systemsagent based modelling
SCHEDULE
Day 1 / friday 16:00Tour Green Fab LabBasics of 3D modeling in RhinocerosBasics of GrasshopperOpen Lecture by Jan Pernecky, founder of rese arch
Day 2 / saturday 10 am- 18 pmRecursive iterative methodsAdvanced Topics of looping
Day 3 / sunday 10 am – 18 pmRecursive iterative methodsFinal presentation session
REQUIREMENTS
The workshop is open to all participants, no previous knowledge of Rhinoceros and Grasshopper is required (although an introductory knowledge is welcome). Participants should bring their own laptop with a pre-installed software. The software package needed has no additional cost for the participant (Rhino can be downloaded as evaluation version, Grasshopper and plugins are free). These softwares are subject to frequent updates, so a download link to the version used in the workshop will be sent to the participants a few days before the workshop.…
Added by Aldo Sollazzo at 11:10am on October 6, 2015
instead of ballooning outwards, just puffing upwards.
THIS WILL WORK! Creating the mesh springs is only three seconds for 200X200 and the Unary Force is still milliseconds. Only Kangaroo takes an initiation time then cycles rapidly (0.5 seconds each) and it only takes a few cycles, maybe a dozen or two.
There is considerable 3D aliasing from the 2D mesh crudeness.
Now, to best Laurent's scheme, let's double down to 400X400. First I disable Kangaroo, and the timer. The preparation takes...FOREVER....and...ever...4.6 minutes to cull the points is all, a trivial step there is likely a better strategy for than finding the ones on the inside then using those to cull duplicates from the whole collection. The springs only took 12 seconds and the forces again milliseconds.
Kangaroo, to initialize takes...after hitting the reset button to start it...over 15 minutes and counting...well 400X400 is 160K vertices and Rhino tends to bog down at 30K points...but it was done in 30 minutes. Then I enable the timer and each cycle takes...uh...it's not in any error mode but nothing is happening past a very faint first automatic cycle that shows in the mesh...yet no CPU power is being used by Rhino...well...it's simply not running...ah, well, there's just a dummy delay of another 5 minutes and then the cycles take 2.7 seconds...what a stupid delay that was not using CPU power.
Now that it's cycling, can I change the stiffness in real time, usually I can...well, no, I seem to be back in the 5 minute delay, but not the 30 minutes interface-locking one...still waiting. Here is a 1/4 scale height model of the above output:
Time's up, life goes on. The aliasing and slow speed make it unworkable except for little logos or something. Some math and parallel processing are needed?
…
Added by Nik Willmore at 5:51pm on February 21, 2016
this was about some boring building I wouldn't respond ... but here we are talking sardines.
Here's my take on that matter:
1. The 4 C# first create/use a nurbs, then define some random planes (and transformations) and then (a) either they place some humble stripes or ... er ... (b) sardines as instance definitions (NOTE: Load Rhino file first).
2. All important decisions are the ones in yellow groups.
3. You control what you get via this (priority on stripes or sardines? that's the 1M Q):
4. If you decide for sardines (the right thing to do) then you must ENABLE the Sardiniser(C)(tm)(US patent pending) as follows:
5. The vodkaFactor on that Sardiniser C# adds some spice in the sardine placement (it does that by altering the priority on the "composite" transformation in use: first randomly rotate then planeToPlane .... or the other thing?).
6. Only the finest Da Morgada sardines are used in this definition:
7. Spot the WARNING in the filter related with what sardine to choose > do it wrong and no hard disk on your workstation > no risk no fun > sorry Amigos, he he.
8. 1M question for you all: why placing sardines (it's real-time you know) is WAY faster than creating these humble stripes?
9. Although the sardines are placed in real time as regards your CPU ... the critical factor is your GPU (display mode: rendered).
10.Still WIP (dancing sardines in the next update).
have some sardine fun, best, Lord of SardineLand…
r ideal surface so they add up where lots of points or lines cluster and create rather unintuitive bulges form a 3D modeler's perspective, here done with Millipede's Geometry Wrapper:
I've learned to do marching tetrahedra or cubes in Python to create the surface as needed from a implicit ( f(x,y,z) = 0 ) mathematical equation based on raw trigonometry but am not yet sure how to define an equation for Rhino user created input items like this or find a way to make marching cubes accept such input let alone one that doesn't treat each geometry item as an electric charge with so little decay.
This would afford an old school "organic" modeling paradigm that T-Splines replaced, but the T-Spines pipe command can't do nearby lines right either, which just makes overlapping junk. Metaballs and lines are not as elegant in that there is a real "dumb clay" aspect to the result that affords little natural structure beyond just smoothing, but still, if it works at all that beats T-Splines, and then I can feed the crude mesh result into Kangaroo MeshMachine to afford surface tension relaxation that will add elegant form to it.
I need both quick hacks and some help on how to deeply approach the mathematics of the required isosurface, now that I can think in Python better than ever.
I got a hint the other day here, about using a different power of fall-off but am not sure how to do the overall task mathematically:
"and just as with point based potentials, one can use different power laws for the distance, function, resulting it different amounts of rounding at the junctions. Below is with a 1/d^3 law for comparision with the above 1/d" - Daniel Piker
http://www.grasshopper3d.com/forum/topics/meshes?commentId=2985220%3AComment%3A1324050
He also included this link about bulging:
http://paulbourke.net/geometry/implicitsurf/
Am I supposed to create an actual implicit equation for my assigned points and lines and use that with marching cubes to surface it? If so, how do I define that equation, at all, and then how to control bulging too?
…