Hello all!
I’m thinking, that, for Twinmotion, one of the biggest disadvantages is not having the assets pop as blocks in Rhino once placed. Enscape has this feature and it makes the manipulation of assets much more easy. Especially when using Grasshopper to bake those blocks in large quantities in different arrangements and so on.
As a small business I would gladly switch from Enscape to Twinmotion, but this disadvantage keeps me away.
Is this a thing that can be implemented by, or toghether with, McNeel & Associates?
Thank you!
Hi @Bogdan_Chipara
Are you talking about models from Twinmotion? What does pop as blocks mean?
If you mean you would like to see twin motion assets pop up as blocks in Rhino that would be amazing but I think the content is proprietary to twinmotion.
I the past I thought it would be great if we could interact with a csv file and have twin parse that and place the assets like trees, foliage etc. I did make a request but nothing came of it. I wanted to have a 3d point in Rhino that we could name with a twin motion asset or marker then Twin could parse the csv file when we link to twin and those assets would show up in the proper place in twinmotion. Or better would be to just have twin parse the points or markers (could be boxes) without needing a csv file.
RM
1 Like
Yes, that’s exactly what I mean.
The way Enscape does it. Inside the block a lowpoly represetation of the actual geometry.
Hi @Bogdan_Chipara
That would be awesome but I don’t think Twinmotion is going to allow that due to their content being proprietary. I don’t think McNeel can do anything about it.
We need to make a firm plan and present it to twinmotion developers.
If we could at least tag rhino points with data and have that bring in assets in twin that would be a huge game changer.
This way we would already have a lists of assets and would be great for listing plants and ground cover. In excel one could even do a take of document with costs. One could really do a lot if we could do this, of course it would be best to have a low poly blocks but then we would either still have to insert that in twin first or have a huge library of their assets available in Rhino.
With the point tagging idea we could at least know and place in rhino the twin assets we need without doing it in twin first and we wouldn’t need a library of low poly models, though that would be the best route.
RM
.
Like I said, the content of the block is a lowpoly representation of the actual content geometry from Twinmotion.
The user does not have access to the real geometry and textures from Rhino.
Like in Enscape.
We can make one, but how do we get in contact with them?
Hi @Bogdan_Chipara
Yea that makes sense but Twinmotion will have to implement it.
The reason I spoke of csv files is that Twin has a parser for materials so you can automate materials creation from rhino to Twinmotion instead of doing them manually. I requested that it extend to assets from Twinmotion. Take a look and get back to me if you want to coordinate a request.
Here are the links to Twinmotion support and requests.
Epic Developer Community Forums
Twinmotion 2023.1 Substitution Table Overview | Epic Developer Community
RM
Here’s a typical case of 4600 Enscape plants placed to follow the planters of some buildings.
Using Grasshopper I can pick the top surface of each planter, then place the Enscape blocks on this surface, and randomly rotate them to get rid of repetition.
Afther this I can split those blocks into different groups, to have different plants.
If the buildings change in shape I can just rebake the blocks and I’m done.
Enscape does this using blocks with lowpoly meshes inside as placeholders, acting like proxy objects.
I love Enscape but 95euro/month is very unfriendly for small businesses.
Hi @Bogdan_Chipara
Yes that’s very cool would be awesome to have in Twinmotion.
Back in the day I was doing this via a 2d drawing I made of different foliage types in rhino. I would place the foliage 2d drawing in a plan view and export a csv file that was auto-read by a command script that auto inserted the 3dmodel depending on the count of the 2d drawings in the plan.
It’s all still a similar process so if Twin could give us access to their data base of assets we could wrap it however we wanted. The only drawback to the enscape method is you have to place your plants/assets in enscape first or am I misunderstanding?
RM
Here’s my workflow:
- I go trough the Enscape library and select my favorite plants. Save them in a Rhino file as a small library.
-
Select, let’s say, 5 different bushes to plant the planters of my building.
-
Starting from the curves in the middle of the planter i orient a single bush on randomly rotated planes once every meter.
- I bake the bushes in one flat group. And then use this small code to split the group in 5 randomized groups:
#shuffles selected objects and divides them into n nr of groups
#-RunPythonScript (C:\RhinoPythonScripts\DivideIntoRandom.py)
# requirements: requests
import rhinoscriptsyntax as rs
from random import shuffle, randint
x = rs.GetObjects(message='Select objects: ', filter=0, group=True, preselect=True, select=True, objects=None )
shuffle(x)
n = rs.GetInteger(message='Number of Groups: ', number=None, minimum=None, maximum=None)
num = float(len(x))/n
l = [ x [i:i + int(num)] for i in range(0, (n-1)*int(num), int(num))]
l.append(x[(n-1)*int(num):])
for i in range(0,n):
randomnumber=randint(0,99999999999)
name = rs.AddGroup("NewGroup"+str(randomnumber))
rs.AddObjectsToGroup(l[i],name)
- Then I simply select each group and run ReplaceBlock to change into those other 4 remaining types of bushes.
With this method or similar, I can plant hundreds of thousands of plants. And because the actual geometry and the textures are handled by the GPU in Enscape everything works very fast in both Rhino and Enscape window.
Hi @Bogdan_Chipara
That’s a nice work flow and it would be a game changer to have this in Twin and Rhino. Twin has tens of thousands of models including those from quixel and sketch fab, some paid, some free so it might be a bit of work for them. Though they already lod their models so they might already have low poly versions of everything.
This would be good to start posting to Twin as your post has good info and work flow for them to look at.
RM
I totally agree with you! Those proxy-blocks manipulated with GH are very important.
This feature will benefit both software and provide the users with an inexpensive and robust rendering engine for architecture and landscape design.
Without this feature users waste a huge ammount of time with placing and adjusting vegetation again and again with each design variation.
In comparison, Enscape has 1400 blocks of vegetation. My most used library includes only 110.
So, for Twinmotion devs to implement proxy-blocks, whould be enough to start with a library of 200 and gradually add more.
A Custom Asset tool could also be implemented, so users can build their own proxy-blocks.
I actually have a very similar workflow and completely agree that having Twinmotion assets appear as blocks in Rhino (like Enscape does) would be a very powerful feature.
In my case, I often rely on Grasshopper to place large numbers of plants and entourage objects parametrically. Being able to use lightweight proxy blocks means the Rhino file stays manageable, and design changes are quick to update. Without this, every new iteration means going back into Twin and redoing placements manually — which is time-consuming.
A similar solution in Twinmotion would really make the software much more attractive, especially for small studios that need fast, flexible workflows without massive costs.
+1 to making a formal feature request to Epic — I’d be happy to support that.
1 Like
Another case: quickly populate with trees all green areas in a city. 7 different block trees from Enscape.
There is python script used inside grasshopper that shuffles an initial list and splits it into 7 sublists.
# shuffles a list and splits it into n sublists of indexes
# set geom_list as List Access and NO Type Hint
# use List Item componet to get the geometry sorted into lists
# use Bang to split the tree and get the brances separately
import random
from Grasshopper import DataTree
from Grasshopper.Kernel.Data import GH_Path
# Convert n and s to integer
n = int(n)
if s is None:
s=1
s = int(s)
# Number of items
item_count = len(geom_list)
# Create list of indices
indices = list(range(item_count))
# Set seed
random.seed(s)
# Shuffle indices
random.shuffle(indices)
# Function to split list into n parts
def split_list(lst, n):
k, m = divmod(len(lst), n)
return [lst[i * k + min(i, m):(i + 1) * k + min(i + 1, m)] for i in range(n)]
# Split shuffled indices
split_indices = split_list(indices, n)
# Create DataTree for indices
tree_indices = DataTree[int]()
for i, sublist in enumerate(split_indices):
path = GH_Path(i)
for idx in sublist:
tree_indices.Add(idx, path)
# Output
a = tree_indices
Grasshopper can also be used to populate all kinds of surfaces with blocks arranged in various patterns.
1 Like