2
$\begingroup$

I have been really struggling past couple of days on how to connect the points of A to B, and create a nice curve line between the points. I want the midpoint of the curve to be elevated, so as to create flightpaths where the midpoint of the curve between point A and B is elevated the most, after which the curve bends down again until it reaches point B.

I have a problem understanding how geonodes work for this seemingly simplistic question, and have tried many things, but I can't figure it out. s enter image description here enter image description here

$\endgroup$
4
  • $\begingroup$ Could you provide an other Blender file with a decimated "BlackMarble_2016_3km_gray_geo" mesh ? I don't know what's going on, but using Blender 3.6.5, just reading then writing your file saves a 35Mb file, that I can not upload to share it with you. If not, I will replace this with a simple grid... $\endgroup$ Commented Jan 26 at 10:14
  • $\begingroup$ Not related to your question: I notice in the console that you have 2 dependency cycles because "BlackMarble" is "shrinkwraped" on "OtherAirports", then "OtherAirports" are "surface deformed" on "BlackMarble". May I recommend to remove those cycles ? $\endgroup$ Commented Jan 26 at 10:22
  • $\begingroup$ Not related to your question: As you commented below, "the sphere is not a perfect sphere on top" because the origin of the plane you are making the sphere from with two SimpleDeform modifiers is not at this plane centre. It is put actually on Schiphol airport. Just by shifting in Z direction all three objects by 52.308 (based on your data), then "Applying" the new "Location" should solve this minor issue. $\endgroup$ Commented Jan 27 at 8:57
  • $\begingroup$ Not really a duplicate, but it reminds me of something that has been built before: i.sstatic.net/kGjTd.gif ..You can find the blend file at this post: blender.stackexchange.com/questions/248064 $\endgroup$
    – quellenform
    Commented Jan 27 at 23:29

2 Answers 2

5
$\begingroup$

enter image description here

Using geometry nodes:

enter image description here

This first part builds a curve and set its point positions on the target airports.

Then it subdivides the curve and associates the center airport position to the points associated to this subdivision.

As it makes doubled segments, convert to mesh and remove doubles.

Second part:

enter image description here

Split edges and come back to curve in order to have one spline by air flight.

So that we can use the spline factor to adjust each point position.

(Blender 4.0)

$\endgroup$
8
  • $\begingroup$ Wow, thank you so much! I wil try to retrofit that to my specific case, and will let you know if it worked. Thanks!! $\endgroup$
    – Stefanos
    Commented Jan 26 at 12:16
  • $\begingroup$ You'll need to know the sphere radius and the airports should be centered to their origin (sphere center). $\endgroup$
    – lemon
    Commented Jan 26 at 12:17
  • $\begingroup$ I tried to apply it to my data and changed it in this blend file <img src="https://blend-exchange.com/embedImage.png?bid=Z224edpV" /> But I dont know where it goes wrong.... Ill note what might make my data different... - The points are imported, and transformed to a sphere using gisplugin - I then "guestimate" how big the sphere must be in order for the points to align just in top of it. You noted i need to know the sphere radius (4250 as dimensions are 8500m each), but I dont know what to do with that info, how to apply it. $\endgroup$
    – Stefanos
    Commented Jan 26 at 14:48
  • $\begingroup$ Shiphol object should be on the sphere (not a vertex only on sphere), or sample it to get the location. Here is an adjusted file. But Blender is not easy which such distances (viewport rendering suffers a bit). <img src="https://blend-exchange.com/embedImage.png?bid=NPMe12Jo" /> $\endgroup$
    – lemon
    Commented Jan 26 at 15:14
  • $\begingroup$ or this one should be better <img src="https://blend-exchange.com/embedImage.png?bid=Vv8W6SqQ" /> $\endgroup$
    – lemon
    Commented Jan 26 at 15:17
3
$\begingroup$

(Using Blender 3.6.5 and Geometry Nodes)

NB: This answer is under work and has yet to be fully documented...

Objective

Build Bezier curves connecting pairs of points on a sphere, controlling mid-point height.

Approach

GN Main graph, controls and results

The GeometryNodes modifier is added to the object made of vertices put at the targetted airports position (named OtherAirports in the demo file).
1. Sphere properties and hub airport (named Schiphol in the demo file) position are recovered from objects specified through the Group Input node (label 7).
2. A single edge per targetted airport (label A) is build to connect it to the hub airport (label H).
3. The perpendicular bisector to those edges crossing the sphere centre is used to shift outward the mid-point. These points are collected as a point cloud.
4. Edges and apex points are combined in broken lines made of three points and two edges.
5. These pairs of segments are converted to Bezier curves, which handles are modified to tune the flightpath shape.
6. Control parameters are:
6.1. Height: Fraction of the circular arc connecting H to A used to shift the apex. A value of 0 puts apices on sphere.
6.2. HubAngle: Additional angle between the curve tangent and the edge connecting H to apex. Positive values increase "take-off" slope.
6.3. ApexWeight: Factor controlling the radius of curvature at apex. 0 is the default value. -1 makes a sharp angle. Positive values yield flatter curves.
6.4. AirportAngle: Additional angle between the curve tangent and the edge connecting apex to A. Positive values increase "landing" slope.

Process data

GN Extract data graph

1. The centre of the sphere (labelled C) is computed as the middle of its bounding box.
2. The hub airport position (labelled H) is recovered with a Sample Index node set in Point domain. It is assumed that the hub is at Index 0. This procedure is robust if there is more than one vertex in the input object, and if the vertex is moved from the origin.
3. The sphere radius is computed as the distance between points C and H.

Build direct paths

GN Direct paths graph

Direct paths are segments connecting the targetted airports (labelled A) to the hub airport (labelled H).
1. Using an Instance on Points node, a single edge is put at every vertex A of the Airport mesh provided by the Group Input node. As the Mesh Line Start Location is (0,0,0), the position of the Index 1 vertex of an edge (labelled V1) is equal to the position of the associated point A. The Offset parameter is irrelevant, as the position of the Index 2 vertex (labelled V2) will be edited afterwards.
2. Through a Realize Instances node, instances are made independent edges.
3. The position of the vertex V2 of every edge is set equal to the position of point H, provided by the Group Input node.
4. Because it is downstream the Realize Instances node, the Set Position node modifies the Point domain. So the Index tested to define the Selection mask is a Point index, not an Instance index.
5. Through a Capture Attribute node set in Edge domain, the index of vertex V2 is recovered to be compared to the actual point Index. Its value is provided by an Edge Vertices node.

Compute apices

GN Apex graph

Apex is the highest point of a flightpath.
1. A point per direct path edge is created using a Mesh to Points node set in Edges domain. The procedure to compute its position follows. These points are collected in a Point Cloud. It is to notice that an edge and the associated point are sharing the same Index, but in different domains.
2. The mid-point position of an edge [AH] (labelled I) is computed from its two end vertices, which position is recovered with an Edge Vertices node.
3. The perpendicular bisector of [AH] is computed by subtracting the sphere centre position (labelled C) to the mid-point I position, because points A and H are laying on the sphere. So $\vec{CI}$ is perpendicular to $\vec{AH}$.
4. This vector is normalized to be scaled afterwards by the apex height. This height is a function of the length of the circular arc connecting A and H. Let $\Delta \theta$ be the angle between $\vec{CI}$ and $\vec{CH}$, and $R$ the sphere radius. The length of this arc is then $2 R \Delta \theta$.
5. $\Delta \theta$ is such that $\cos{(\Delta \theta)} = \|\vec{CI}\|/R$.
6. The distance between point C and the apex is defined as $(\kappa \Delta \theta + 1) \times R$. The $\kappa$ parameter is user-defined, and its value is recovered through the Group Input node. For $\kappa=0$, the apex is on the sphere ; for $\kappa=2$, the apex height is equal to the distance between A and H along the sphere.
7. The apex position is defined from point C, by adding the vector computed at step 4. So by construction, points C, A, H and the apex are coplanar.

Build over paths

GN complete paths graph

Over paths are made by combining direct paths end points and apices in sets of two edges.
1. A Mesh Line with two edges sharing one central vertex is duplicated as many times as the number of direct paths. Start Location and Offset parameters are irrelevant, as vertices position will be set afterwards. It is to notice that the Duplicate Elements node is set in Instance domain. This way, duplicated edges remain connected. Whereas in Edge domain, this connection is lost as two vertices are created at the junction. So the three vertices of copy number $i$ are with indexes $3i$, $3i+1$ and $3i+2$.
2. Through a Realize Instances node, instances are made independent sets of edges. Subsequent Set position nodes are thus in Point domain.
3. Point H is copied as the first vertex of the $i^\mathrm{th}$ copy.
3.1. Its index matches the selection mask $3i$.
3.2. Point H position is recovered with a Sample Index node set in Edge domain, looking for the $i^\mathrm{th}$ direct path. As point H was recorded at second position by the DirectPath node group, its coordinates are provided by the socket Position 2 of the connected Edge Vertices node.
4. The apex (labelled T) is copied as the second vertex of the $i^\mathrm{th}$ copy.
4.1. Its index matches the selection mask $3i+1$.
4.2. Point T position is recovered with a Sample Index node set in Point domain, looking for the $i^\mathrm{th}$ apex.
5. Point A is copied as the third and last vertex of the $i^\mathrm{th}$ copy.
5.1. Its index matches the selection mask $3i+2$.
5.2. Its position is recovered as for point H, but from the socket Position 1.
6. The normal to the plane defined by (H,T,A) is computed as $\vec{TA} \wedge \vec{HT}$. It is stored in an attribute named normal, to be used to rotate the Bezier curves handles.

Build and adjust flightpaths

GN convert to Bezier curves graph

1. .
2. .
3. .

Resources

$\endgroup$
2
  • $\begingroup$ Hi! First of all thank you for your extensive response @StefLAncien ! <img src="https://blend-exchange.com/embedImage.png?bid=Wk25995V" /> I made a new file, where i didnt apply so many subdivisions on the sphere (I know the sphere isnt a perfect sphere on top, but ill figure that out another moment). . Your image looks good, thats what I want. My real file will consist of many, many more points on the otherairports data, so thats why geonodes setup is neccesary. I tried a setup in the file above but I just cannot figure out how to $\endgroup$
    – Stefanos
    Commented Jan 26 at 12:08
  • $\begingroup$ I deleted a comment with a follow up question, as it seems a separate question instead of relevant to this thread ;) Thanks again! Many respect! $\endgroup$
    – Stefanos
    Commented Feb 2 at 12:05

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .