Hi, MeshOutline in Rhino, takes surfaces, Polysurfaces as well as Meshes.
While Coding, Rhino.MeshOutline ,however, seems to be friendly with meshes only.
I would rather not to convert polysurfaces to mesh in order to apply Rhino.MeshOutline on them.
Any Ideas?
This is an Example:
Call Main()
Sub Main()
Dim strPol,strExt
strPol = Rhino.AddPolygon(Rhino.WorldXYPlane, 10, 5)
strExt = Rhino.ExtrudeCurveStraight(strPol, array(0, 0, 10))
Rhino.CapPlanarHoles strExt
Rhino.MeshOutline strExt
End Sub
Option Explicit
Call Main()
Sub Main()
Dim strPol, strExt, blnResult, arrOutline
strPol = Rhino.AddPolygon(Rhino.WorldXYPlane, 10, 5)
strExt = Rhino.ExtrudeCurveStraight(strPol, Array(0, 0, 10))
Rhino.CapPlanarHoles strExt
Rhino.SelectObject strExt
blnResult = Rhino.Command("_MeshOutline", vbFalse)
If blnResult Then
arrOutLine = Rhino.LastCreatedObjects(vbFalse)
End If
End Sub
In case of a single outline result the outline is the first object in the resulting array:
@Clive, you could control this by scaling the outlines using the camera location as scale origin. To get closer to the camera, scale with values smaller than 1.0 eg:
Option Explicit
Call Main()
Sub Main()
Dim strPol, strExt, blnResult, arrOutline
Dim strView, arrCamera, arrScale
strPol = Rhino.AddPolygon(Rhino.WorldXYPlane, 10, 5)
strExt = Rhino.ExtrudeCurveStraight(strPol, Array(0, 0, 10))
Rhino.CapPlanarHoles strExt
Rhino.SelectObject strExt
blnResult = Rhino.Command("_MeshOutline", vbFalse)
If blnResult Then
arrOutLine = Rhino.LastCreatedObjects(vbFalse)
strView = Rhino.CurrentView()
arrCamera = Rhino.ViewCamera(strView)
arrScale = Array(0.5, 0.5, 0.5)
Rhino.ScaleObjects arrOutline, arrCamera, arrScale, vbFalse
End If
End Sub
@clement
Thanks
I have already tried that method.
What I mean is:
to define a camera,
To set CPlane to View
Rhino.Command("_MeshOutline", vbFalse)
Since there is not always a fixed distance between camera and its corresponding Cplane, I wanted to code it in a way so that the meshoutline always gets projected on the Cplane regardless of the arrScale.
The outlines formed in this image took the following scale factors: arrScale = Array (.5,.5,.5) arrScale = Array (1,1,1) arrScale = Array (2,2,2) arrScale = Array (4,4,4)
I initially assumed that the arrScale = Array (1,1,1) would project the outline on the Cplane.
@Clive, a scale of 1 will not scale at all. I think that a projection would result in a deviation from the original outline judging from the view, as the projecton does not factor the perspective distorsion.
But you could try to compute which scale from the camera position is required to end in a pre-defined CPlane, eg. intersect an infinite line from the camera position to the camera target with your desired CPlane to get a point. Then scale from one of the meshoutline points to the resulting point (the camera position is the origin of the scale).
The Issue is still confusing to me guys,
There should be a procedure that provides the exact location where the MeshOutline forms.
If you randomly applied MeshOutline over a Polysurface, from different angles,
the results would scatter in the space, randomly closer or farther away from the viewpoint.
How Come?
I think it is just created in a plane perpendicular to the camera and target in the current view with no respect to the distance from the camera. It just respects that the plane is parallel to the screen plane.
To create it in a predefined plane, you can provide one in a script and use my suggestion above to either scale the resulting outlines (this ensures that the results remains to end in a plane parallel to the screenplane) or “project” the points of the mesh outlines in any other plane by intersecting rays. The example below does this, it just uses the current views CPlane and then removes the old meshoutline.
Absolutely,
Prior to your code, I managed another method:
Scale the Outline beyond the desired CPlane, with the camera position as the origin of the scale.
2.Extrude the result back to the camera point.
3.The Intersection between the extrusion and the CPlane provides the result.
This is simulating the behavior of light and embodying the shadows.
By the way your code helped a lot,
Thanks