[Challenge] How to model an oloid?

Post here for help on using FreeCAD's graphical user interface (GUI).
Forum rules
and Helpful information
IMPORTANT: Please click here and read this first, before asking for help

Also, be nice to others! Read the FreeCAD code of conduct!
User avatar
NormandC
Veteran
Posts: 18587
Joined: Sat Feb 06, 2010 9:52 pm
Location: Québec, Canada

[Challenge] How to model an oloid?

Post by NormandC »

Here's a shout to the experts in weird geometries. :) (this kind of stuff is not my forte)

Someone on another forum was asking how to model an oloid.

https://en.wikipedia.org/wiki/Oloid

Image

Here's the best I could come up with by creating a face between wires (EDIT: could have used a Part Loft between sketches, would have been parametric) then mirroring on two planes and creating a shell then a solid. But it's not a true oloid.
FC_fake_oloid_normandc_01.png
FC_fake_oloid_normandc_01.png (33.51 KiB) Viewed 3530 times
P.S. I'm sure someone will reply that this can be done easily in OpenSCAD with the convex hull function but the goal here is to make it in FreeCAD with GUI tools if possible.
Attachments
oloid_normandc1.FCStd
(157.87 KiB) Downloaded 89 times
Last edited by NormandC on Fri Sep 30, 2016 2:59 am, edited 1 time in total.
User avatar
NormandC
Veteran
Posts: 18587
Joined: Sat Feb 06, 2010 9:52 pm
Location: Québec, Canada

Re: [Challenge] How to model an oloid?

Post by NormandC »

It's like four oblique circular cones gathered together, but there's some blending of faces involved.

I'm wondering if the OCC kernel allows to make something like that...

And I was supposed to turn in early... :roll:
Attachments
oloid_normandc2.FCStd
(14.69 KiB) Downloaded 94 times
Jee-Bee
Veteran
Posts: 2566
Joined: Tue Jun 16, 2015 10:32 am
Location: Netherlands

Re: [Challenge] How to model an oloid?

Post by Jee-Bee »

intersting shape!!
User avatar
easyw-fc
Veteran
Posts: 3630
Joined: Thu Jul 09, 2015 9:34 am

Re: [Challenge] How to model an oloid?

Post by easyw-fc »

NormandC wrote: Someone on another forum was asking how to model an oloid.

https://en.wikipedia.org/wiki/Oloid

Image
P.S. I'm sure someone will reply that this can be done easily in OpenSCAD with the convex hull function but the goal here is to make it in FreeCAD with GUI tools if possible.
I'm wondering if it could be done by FreeCAD CADQuery ...
wmayer
Founder
Posts: 20243
Joined: Thu Feb 19, 2009 10:32 am
Contact:

Re: [Challenge] How to model an oloid?

Post by wmayer »

The German wikipedia article is a bit more informative since it gives some construction tips. You start with two arcs of circle with an angle of 240 degree. Since you have to make a ruled surface that starts in the middle of one arc it's best to split both arcs in two arcs so that you have altogether four.

Afterwards for each section you make a ruled surface so that you have four of them and join them together. Unfortunately, the shape is not fully correct because the article says that the shape is the convex hull and thus of course must be convex. However, you can clearly see (if you look along the X axis) that the shape is not convex.

The problem here is the way how the ruled surface is created. The article says that the line out of which you create the ruled surface has constant length but the OCC function to create the surface doesn't allow to define constraints. Maybe OCC offers a lower level function that allows this.

In the English article this site is referenced which contains C++ code to create a mesh and some meshes of different resolutions. When you load one with the lowest resolution and switch two wireframe mode you get an idea how the ruled surface should be parametrized.
Attachments
oloid_wmayer1.FCStd
(20.26 KiB) Downloaded 122 times
User avatar
looo
Veteran
Posts: 3941
Joined: Mon Nov 11, 2013 5:29 pm

Re: [Challenge] How to model an oloid?

Post by looo »

something to read :D
http://www.geometrie.tuwien.ac.at/stachel/jgg0113.pdf

this looks good, but I don't think it's a real oloid:
https://www.youtube.com/watch?v=OPCNxHy3Tg0
wmayer
Founder
Posts: 20243
Joined: Thu Feb 19, 2009 10:32 am
Contact:

Re: [Challenge] How to model an oloid?

Post by wmayer »

Now it looks like a correct oloid. When splitting the arcs at 90 degree and adding a second one with 30 degree then later the ruled surface function seems to create correct surfaces.
Attachments
oloid_wmayer2.FCStd
(23.45 KiB) Downloaded 234 times
keithsloan52
Veteran
Posts: 2756
Joined: Mon Feb 27, 2012 5:31 pm

Re: [Challenge] How to model an oloid?

Post by keithsloan52 »

I found an OpenSCAD version of an oloid at http://www.thingiverse.com/thing:44326 Still seems quite complex looking at the scad file
oloid_v1-0.scad
(1.39 KiB) Downloaded 108 times
and of course if one loads onto FreeCAD you just get a mesh https://www.dropbox.com/sh/zrm51sctaew0 ... KNVEa?dl=0 ( File too large so used Dropbox ) So I think its FreeCAD 2 OpenSCAD 1
ulrich1a
Veteran
Posts: 1957
Joined: Sun Jul 07, 2013 12:08 pm

Re: [Challenge] How to model an oloid?

Post by ulrich1a »

wmayer wrote:Now it looks like a correct oloid.
Yes it looks really good. I made a shell and a solid from it. So I got a volume of 654000.0000338121 mm3. But according to the German wikipedia, it should have a volume of

Code: Select all

>>> 60**3*3.0524
659318.4
So it seems more difficult to get the real thing.

I think, one has to calculate paths for the ruled surface, where it is possible to move each path in a linear way to create the rules of the surface. But this is a real mathematical challenge.

Ulrich
User avatar
looo
Veteran
Posts: 3941
Joined: Mon Nov 11, 2013 5:29 pm

Re: [Challenge] How to model an oloid?

Post by looo »

Although the task isn't about using python I had to try it.
even with python it's not so easy to create a nice face of the oloid. (the interpolation isn't very good at one edge. math is from the pdf posted above.

Code: Select all

from numpy import sin, cos, sqrt, array, linspace, pi
import FreeCAD as App
import Part

num_points = 100

t = linspace(0, pi * 2. / 3., num_points )
A = array([sin(t), -0.5 - cos(t), 0 * t]).T
B = array([t * 0., 0.5 - cos(t) / (1. + cos(t)), sqrt(1. + 2 * cos(t))/ (1. + cos(t))]).T
D = Part.BSplineSurface()
D.interpolate([[App.Vector(*v) for v in A], [App.Vector(*v) for v in B]])
Part.show(D.toShape())
Post Reply