import molecularnodes as mn
= mn.Canvas(engine="EEVEE", resolution=(800, 800), transparent=True) cv
Materials
We can progrommatically access the properties of the materials like this:
= mn.Molecule.fetch("8H1B").add_style(
mol =mn.material.AmbientOcclusion()
mn.StyleSurface(), material
)
cv.frame_object(mol)
cv.snapshot()
0].material.ambient_occlusion_distance = 0.1
mol.styles[ cv.snapshot()


0].material = mn.material.FlatOutline()
mol.styles[
cv.snapshot()
0].material.math_value = 0.1
mol.styles[ cv.snapshot()


Propeties for the material interface are based on the inputs of the nodes in the material.
for x in dir(mn.material.AmbientOcclusion()) if not x.startswith("_")] [x
['ambient_occlusion_color',
'ambient_occlusion_distance',
'ambient_occlusion_normal',
'emission_color',
'emission_strength',
'material',
'math_value',
'mix_a',
'mix_b',
'mix_factor',
'tree']
Render Engines and Materials
The different render engines handle materials diferently.
import MDAnalysis as mda
import itertools
from MDAnalysis.tests.datafiles import PSF, DCD
= mn.Canvas(resolution=(800, 800), transparent=True) cv
= mda.Universe(PSF, DCD)
u = mn.Trajectory(u)
traj ="Mesh", subdivisions=4))
traj.add_style(mn.StyleSpheres(geometry
cv.frame_view(traj)= [mn.scene.Cycles(samples=32), mn.scene.EEVEE()]
engines = [
materials
mn.material.Default(),
mn.material.AmbientOcclusion(),
mn.material.FlatOutline(),
mn.material.Squishy(),
]for mat, eng in itertools.product(materials, engines):
= eng
cv.engine 0].material = mat
traj.styles[ cv.snapshot()







