I'm Lluis, a computer engereering student, and an app and videogames programmer from Spain. My partner needed a free app to study anatomy, so we decided to use these models to create it. It is in the early stages of development, so there is a lot of room for improvement. I would appreciate your opinion and / or ideas to improve it.
It's made using Unity, so it can be exported to any platform. I don't know 3D modeling, so it's been difficult to optimize the mesh for mobile. I've reduced the polygons of the models to a 30% of the original size using the Decimate tool in Blender, but it's not enough to get a good performance in low-end devices. You can download the demo APK here:
https://bit.ly/30QcFyt It is very helpful if you tell me the performance and model of your mobile. *Note: Only tested on an Android high-end mobile. *Note 2: The colors of the elements are not strictly correct. They are temporary colors.
Thank you! :)



UAu! Es enorme!
Hablamos mejor mañana, pero ya te digo que estoy boé de impresionado!
MESHES
The file size has been a central question on the contribution made in the .blend, and it is still too heavy for many computer devices.
A solution could be to split the file into several chapters that could be loaded independently from each other (Bones+Muscular insertions+Ligaments/Bones+Vascular system/Bones+nervous system...).
The use of curves for all vessels reduces a lot the poly-count (and make it much easier and cleaner to edit)
Another important trick is to instance the symmetrical structures (Alt+D) in Blender, instead of duplicating them (Shift+D).
VISUAL
In the .blend, the default colors of Blender >2.8 have been used for both the file and the website. Background is 303030
Colored lights help give an overall warm look.
Although it is not photo-realistic, saturation is intentionally lowered to pacify the contrasts.
Some specular/metallic effect gives humidity to the materials, and some Subsurface scattering can be a good compromise between a plain diffuse and transparency.
In the .blend, the orthographic view is default because it seemed convenient to study the anatomy and avoid to get lost while navigating in the 3D view.
Your buttons and sliders for the cross-section planes are very ergonomic.
The system used to create a rim-like color (to get something that looks as a plane where the mesh gets visually opened by the cross-section plane) in the .blend passes through a system of nodes, made by Marcin Zielinsky; it is based on the BIM add-on system for architecture in Blender (but works directly). The principle is to give a full emission material to the inner surface of meshes.
FUNCTIONS
The ergonomy of your app is clearly what is needed to reach a greater public.
The .blend file heavily uses the collections system that appeared in Blender >2.8. This rhizomatic organization allows to reach any level of the hierarchy by pressing RMB when an object is selected. In order to keep a readible outliner, that reproduces the TA2 (https://ta2viewer.openanatomy.org/) with only one occurrence of each anatomical structure; a bunch of hidden collections have been created, where they can appear several times. The downside is that the collections are duplicated (Eye; Eye') and that the ones without the ' do not include the content of their sub-collections.
Two features are often proposed by proprietary apps:
-Optional definitions.
-Research a structure by its name. It could then open only the layer and center the view on this selected object.
'Zygote Body' proposes the same kind of features; A later evolution of the .blend should be to parent the other structures to the armature, add an IK (Inverse Kinematics) mode to the armature shared in the .blend file, and create animations (eyes blinking, heart beat, breathing) :
Congratulations for what you have done so far!
The .blend is evolving, (I struggle with names and translations these days) so that I hope that your system does not suffer too much from these changes.
It is very inspiring.
N.B.: the latest version of the script has been shared in the 'About Python script/addon' section of this forum; it is also included as a text file within the .blend (and as a separate file in the Mac version).
Thanks for your detailed reply.
MESHES
As I said, I know nothing about 3D modelling or Blender, I'm just a programmer, so it's difficult to me understand technical aspects about blender or modelling.
I took the models and applied them the Decimate modifyer to reduce the polygon count to the 30%. Then I exported them as .fbx. They don't have any normal, metallic or occlusion map, reason why the materials look that flat.
VISUAL
In the main page of z-anatomy, we can see some renders of the models with pretty nice materials, but again, I don't know how to achieve that result. I just took a provisional flat color and applied to each material. I'd appreciate if you could tell me how to get that beautiful results. FUNCTIONS
- Optional definitions: Absolutely fundamental. In wich file the're stored in? It would be easy to program it if there's a file like this, or a similar structure:
BodyPart1,Description1; BodyPart2,Description2; So I can read in runtime when we select a body part.
- Research a structure by its name: I had not thought of it, but it's a great idea! I will work on it.
- Animations: It would be amazing and very instructive. I'll set it on my to-do list!
- Also, I'll set the camera to ortographic.
Thank you for your feedback, I will post updates on this forum! :)
The labels and muscular insertions are parented to the bones in the .blend, and the script links their visibility. In this way, when the bone is moved, the labels and insertions follow, and only the labels of the selected object appear. The script also constraint the labels towards the 3D viewport.
Can I export only the labels as .fbx?
I would make an option to show all the labels of the active body parts, and an option to show only the labels of the body part selected.
@Lluís Vinent You may have to open the file removing the script in order to select them all. They are all texts objects and their line is not selectable (see filter options>Arrow icon on the upper right corner of the outliner; Shift click on the main collections to make them all selectable). They use a Hook modifier in Blender to follow the label, when it is move, you may have to apply it to get them right. The lines are parented to the label and the labels (text objects) are parented to the labelled object.
N.B.:On the upper side of the 3D view, the icon of the eye&arrow allows you to show/hide certain objects type.
In the outliner, the filter (syphon icon) allows you to do the same within the outliner.
@Lluís Vinent Also: although it represents some work; the labels used in Blender may not be the best solution for an app: they are actually 3D objects, also curves, that needed to be constraint towards the 3D viewport through a python script. The script also links their visibility to the one of the labelled object, as mentioned before, and selecting them opens the definition.
An important reason that lead the decision to use this system and abandon the labels made with the 'MeasureIt' add-on (https://www.youtube.com/watch?v=23nkz2_r97E) is that these curve-text-objects can be searched and found through the outliner, and the view can be centered on them.
It may be more logical/lighter to use an overlay as the 'MeasureIt' add-on does; to constraint the position of each label in the 3D viewport but:
-this system would then need to be invented;
-I would recommend to give priority to the search and center functions upon the performance considerations.
UPDATE LOG
19/11/2021
- Camera background set to 303030. - Camera set to ortographic. - .blend lights imported. - '.001' suffixes removed. - Search engine.
22/11/2021
- Descriptions
23/11/2021
- Little changes on UI and some bugs fixed.
24/11/2021
- Translated to spanish (automatic translation at the moment). 26/11/2021
- Fixed minor bugs. - Avoid unwanted interactions.
- Removed the "Move" button. Replaced by two finger movement. - We can chage the font size in the settings.
- We can hide all the UI in the settings. - "About" page with a link to the Z-Anatomy web page (provisional design). - Now he can hide all the panels. "Cross sections" is hidden by default. - Now all the UI is 100% adaptative to any resolution. - Programmed all the controlls for PC. - Exported for WebGL.
29/11/2021
- Added the 'selected outline'.
- Added the multiple selection tool.
- Added a twinkling bar on the text input.
- Now when we select isolated mode we can edit the transparency of the non-isolated objects. - Fixed minor bugs.
04/12/2021
- Box selection.
- Multiple deletion and recovery.
- Fixed minor bugs.
05/12/2021
- Deselect all button.
06/12/2021
- Brush Selection
The definitions (mostly imported from wikipedia- can be found as Texts:
This is the Outliner, in 'Blender file' mode.
In the .blend, thanks to the script, they are automatically displayed within the text editor when an object that has the same name is active (last selected).
Here is the difference between 'Duplicate' and 'Duplicate-Instanced':
This is about exporting curves as .fbx (does not seem possible for the moment but would reduce drastically the poly-count):
If, as said in the post, Maya and/or 3DSMax do export curves, it should be easy to get them as .fbx passing though someone who has the program.
They appear as pipes inside Blender thanks to a function called 'Bevel'; otherwise, you'll get only their path but no real visible geometry. This function uses a general bevel radius, and each 'node' of the curve gives an additional information to widen or shrink this value. To keep it humanly understandable, I set all main radius to 0.5mm, so that each node's custom radius gives the diameter in mm.
Those are .py files. Do you have them in plain text files(.txt, excel, google sheet...) so I can read them on runtime?
@Lluís Vinent I think that the .py are but .txt whose suffix has been changed.
There is no text-export option and making it manually would require a few hours.
See if it helps: https://docs.blender.org/api/current/bpy.ops.text.html
I'll keep in mind to get an external version of these definitions in the future.
@Melodicpinpon It helped, thanks! :)
The script to get the descriptions as .txt (or any other extension) files: *It's a .txt file. Change the extension to .py.
The general trick to get rid of these '.001' suffixes, is to name the mesh shared by two symmetrical objects without suffix and to name the objects themselves with .r/.l. The mesh is the same but one of the two objects
-Has been mirrored in relation with the world's origin (0,0,0)
-These transformations have been recorded within their 'Delta transforms' coordinates,
-And has a '-1' value on the X-axis-Scale, so that it appears inverted.
The version that appears in your video is full of these .001 because of the translation system -that we try to set up with Marcin-; which is told to ignore these '.l'/'.r' suffixes when translating the name of an objects (according to the text file called 'Translations'). The one that is now shared on this website has been corrected but there are still some '.001' appearing after translating the whole atlas.
The file used to work on the translations is contained in the zipped file shared on the main page. If you want to have an easier access to it, you can send me your email address and I will give you access to the Google Sheet file. All names that had more than one occurrence have been differenciated, so that there should be much less '.001' issues when switching between the different languages.
I'm aware of that suffix. I can just remove the text after the '.' when I show it, it's not necessary clean it before runtime.
About the materials, I would like to help but
-I do not have a mobile,
-and ignore how to open the .apk file that you share.
I have been playing a bit with material nodes within Unity and could see what I can do if there is some non-coder-friendly interface somewhere.
The .apk file is an installable file for mobile devices. Anyway, I'll make a WebGL version too, so you can embeed it in any web page!
Search Engine and Lighting
Search algorithm:
Look for an object equals to the text
If not found:
Look for an object that starts with text
If not found:
Look for an object that contains the text .apk file is updated, it's the same link: https://bit.ly/30QcFyt
Very good job, and really quick!
Congratulations and thank you for considering this suggestion.
If you want another one to go even further:
The TA2-viewer displays several proposed results based on the text written, as it can be done when texting on some mobile devices.
This is very handy in order to reach an anatomical structure in a minimum amount of time: https://ta2viewer.openanatomy.org/
@Melodicpinpon
They're ordered based on the criteria explained above.
The searcher searches recursively within the active objects in the scene, so the performance is indirectly proportional to the number of active objects.
Currently all three directional lights are running in real time, so performance has decreased. I will try to bake them so that they are precalculated before the execution and do not put a load on the CPU on runtime. I have tried it on other occasions but having so many objects on the scene it takes many hours to process, reason why I decided to just use plain colors to simulate light. The .apk file has been updated: https://bit.ly/30QcFyt
Excellent!
One detail also: there seem to be a convention about the 3D gizmo colors.
Most 3D users are used to have:
-a red color for the left/right/X-axis
-a green color for the front-back/Y-axis
-a blue color for the vertical/Z-axis
If you want to, I can propose another design for the cross-section icons.
The ones that are used are very understandable but since they are visible all the time, it may be worth trying to improve their design.
About the lights, I know that is has been a big issue within Blender and that only the Render Engine called 'Eevee' allows to navigate in real time within a 'Rendered viewport shading'.
Blender can not open a document in Rendered viewport shading and the solid view is also useful because is allows to use the 'Clipping border function':
(not available in rendered viewport shading)
Just in case it could have some interest to the performance matter, here are the settings used in Solid viewport shading that I found to be the more understandable.
They may be much easier to 'compute'.
It gives this kind of result:
I could be an elegant simple option to start with; keeping all material-consideration for later if only the texts could stay more contrasted -although there would be no more differentiation between arteries, veins and nerves.
Of course! You can propose any improvement of the design. In fact, the whole design will probably change, since it is provisional and does not convince me at all. I like the layout of the UI elements and how simple and intuitive it is, but I want to change a lot of things. Any element of the app is still basically a sketch.
Descriptions
I'll make a script to remove the titles in the descriptions, so they don't appear twice. .apk has been updated: https://bit.ly/30QcFyt
Great work!
So you have achieved to export the texts?
I invite you to follow the linkedin/facebook page to be kept informed of the main improvments:
https://www.facebook.com/GauthierKERYN/posts/225619813012353?notif_id=1637604289354239¬if_t=feedback_reaction_generic&ref=notif
https://www.linkedin.com/company/z-anatomy
Yes, you can find the script a couple comments above. I get an error when I try to upload the .py file to the forum, so I have copied it directly into a comment so you can download the txt files in case you need it. I don't have Facebook or Linkedin, but will take a look from time to time too se what's new!. I think that the next step on the app should be translate it, polish the UI, make it pretty, and make it responsive so it can be exported to any resolution. Last think to make it 100% functional is improve performance on mobile devices. I have been trying the last two days without great results. It will be a big headache. Too many vertices for a not high-end mobile.
Several suggestions to simplify the interface's design:
-set all backgrounds 303030, white text, no transparency (text inputs; etc)
-full switch to the description, only develop/collapse
-full switch between isolated and not-isolated modes (no transparency)
-cross sections are very secondary to study the anatomy, it could be optional
-centering the view and orbiting around a selected object, maybe just outline the selected object(s) (orange) if needed
-if you achieve to use Matcaps, I can try and provide them
-checkboxes under the left icons could be removed and their activation be expressed giving them an orange color
I did not find the script to export texts, you could paste it in a notepad and save it as .txt to upload it.
Thank you for the suggestions! I have few doubts:
-Set all backgrounds 303030: They're 303030 in the new version, but look darker because of the post processing color adjustments. Too dark?
- Full switch to description: You mean remove the ability to resize it? Actually, it saves the last state, so if you used it fullscreen it will expand fullscreen. Example in the video.
- Full switch between isolated and not-isolated: Imagine that you are in isolated view and there's no transparency. You can't see the other objects around. If want to click another object, you will need to change to not-isolated, click on the other object and change to isolated again. That's not ergonomic.
I will make 3 view modes: not-isolated, transparency and isolated.
- Cross sections are very secondary: I'll make all the panels hideable. Cross section panel will be hidden by default. (I haven't changed the cross sections icons yet, I'll make a better desing).
- Centering the view and orbiting around a selected object, maybe just outline the selected object(s) (orange) if needed: Sorry, I don't understand what do you mean. Can you show me a graphic example?
- Checkboxes under the left icons could be removed: In fact, all checkboxes are currently removed and replaced by icon color change. Example in the video. What do you prefer? Before or after?
- Matcaps: I've never used them. If it helps us to fake lighting and avoid realtime lighting, it could improve performance. We could try.
The file to download the descriptions:
APK updated: https://bit.ly/30QcFyt
Note that the loading time of the app has increased significantly. That's because at the start of the application, it recursively searches all objects and assigns them the .txt file corresponding to their description. The solution to this is to manually assign the .txt to each object.
I put all my talent into this; don't judge me...
Edit:This version should be readable
and this is an export of the matcap on a sphere but with the settings that give a more contrasted look:
Hahaha perfect! It's more minimalist. I like it. These are the standart colors, right?
No, Blue should be horizontal (perpendicular to the vertical axis and moving accordingly)
Red is good
Green is coronal axis (instead of the blue on your image)
https://wikimedi.ca/wiki/F%C3%A9mur
https://wikimedi.ca/wiki/Ligament_crois%C3%A9_ant%C3%A9rieur
https://wikimedi.ca/wiki/Muscle_petit_rond
https://wikimedi.ca/wiki/Muscle_trap%C3%A8ze
https://wikimedi.ca/wiki/Patella
The team of Wikimedica has developed a 3D-viewer and may have some tricks to share. The modifiers seem to have been removed which leads to some very lowpoly parts, but otherwise it works quite well.