원자 구조를 위한 블렌더링 & 프롬프팅
전기화학 계면에서의 전해질 복잡성 - 명시적 용매화, PCET, 이온 효과
지지체 곡률, 고금속 담지량, MNC 비대칭, 메조기공
상세 표면 원자 구조 시각화
Angew. Chem. Int. Ed. 64 (2025) - Rh/CeO2 CO-SCR
Catal. Today 425 (2024) - IF=5.2
Catal. Today 411-412 (2023) - IF=5.3
J. Mater. Chem. A 11 (2023) - IF=11.9
Atomic Blender 설치 & 기초
배치 렌더링을 위한 Python 자동화
import bpy
from pathlib import Path
from math import pi
def setup_scene():
"""카메라, 조명, 재질 설정 적용"""
# 카메라 설정
bpy.data.objects['Camera'].location.x = -0
bpy.data.objects['Camera'].location.y = -25
bpy.data.objects['Camera'].location.z = 13
bpy.data.scenes["Scene"].camera.rotation_mode = 'XYZ'
bpy.data.scenes["Scene"].camera.rotation_euler[0] = 65*(pi/180.0)
bpy.data.scenes["Scene"].camera.rotation_euler[1] = 0*(pi/180.0)
bpy.data.scenes["Scene"].camera.rotation_euler[2] = -5*(pi/180.0)
# 조명 설정
bpy.data.objects['Light'].data.type = 'SUN'
bpy.data.objects['Light'].data.energy = 2
bpy.data.objects['Light'].location.x = -10
bpy.data.objects['Light'].location.y = -10
bpy.data.objects['Light'].location.z = 20
bpy.data.objects['Light'].rotation_mode = 'XYZ'
bpy.data.objects['Light'].rotation_euler[0] = 30*(pi/180.0)
bpy.data.objects['Light'].rotation_euler[1] = -30*(pi/180.0)
bpy.data.objects['Light'].rotation_euler[2] = 0*(pi/180.0)
# 재질 설정 (재질이 존재하는 경우만)
if "Nitrogen" in bpy.data.materials:
bpy.data.materials["Nitrogen"].node_tree.nodes["Principled BSDF"].inputs[0].default_value = (1, 0.401978, 0.08022, 1)
if "Cobalt" in bpy.data.materials:
bpy.data.materials["Cobalt"].node_tree.nodes["Principled BSDF"].inputs[0].default_value = (0, 0, 0.428691, 1)
if "Molybdenum" in bpy.data.materials:
bpy.data.materials["Molybdenum"].node_tree.nodes["Principled BSDF"].inputs[0].default_value = (0.527112, 0.527116, 0.527115, 1)
# 렌더 설정
bpy.context.scene.render.engine = 'BLENDER_EEVEE'
bpy.context.scene.eevee.taa_render_samples = 32
# 이미지 형식 설정
bpy.context.scene.render.image_settings.file_format = 'JPEG'
bpy.context.scene.render.image_settings.quality = 95
def clear_mesh_objects():
"""씬에서 모든 메시 객체 제거"""
bpy.ops.object.select_all(action='DESELECT')
for obj in bpy.data.objects:
if obj.type == 'MESH':
obj.select_set(True)
bpy.ops.object.delete()
# 처리할 디렉토리
input_dirs = [
Path('/Users/sean/Downloads/supported'),
Path('/Users/sean/Downloads/structures_optimized')
]
output_dir = Path('/Users/sean/Downloads/rendered_images')
output_dir.mkdir(exist_ok=True)
# 두 디렉토리에서 모든 .xyz 파일 수집
all_xyz_files = []
for input_dir in input_dirs:
xyz_files = list(input_dir.glob('*.xyz'))
all_xyz_files.extend(xyz_files)
print(f"{input_dir.name}에서 {len(xyz_files)}개 파일 발견")
print(f"\n총: {len(all_xyz_files)}개 .xyz 파일 렌더링 예정\n")
# 각 파일 처리
for i, xyz_file in enumerate(all_xyz_files):
print(f"처리 중 {i+1}/{len(all_xyz_files)}: {xyz_file.name}")
# 이전 메시 객체 제거
clear_mesh_objects()
# .xyz 파일 임포트
try:
bpy.ops.import_mesh.xyz(filepath=str(xyz_file))
except Exception as e:
print(f"{xyz_file.name} 임포트 오류: {e}")
continue
# 설정 적용
setup_scene()
# 렌더 및 저장
output_path = output_dir / f"{xyz_file.stem}.jpg"
bpy.context.scene.render.filepath = str(output_path)
bpy.ops.render.render(write_still=True)
print(f"저장 완료: {output_path.name}")
print(f"\n완료! {len(all_xyz_files)}개 파일을 {output_dir}에 렌더링")
다양한 크기의 배치 렌더링된 나노로드 구조 예시
VISUAL_PROMPT v5.5 명세
// VISUAL_PROMPT v5.5 — Boundary-Breaker Always-On (EN, model-agnostic)
// 강화된 운영 입장과 무한한 지식 확장을 갖춘 단일 파일 명세.
// ===== 운영 입장 (의도를 먼저 선언) =====
// 1) 경계 우선: 모든 단계에서 안전한 재사용보다 프론티어 탐색 움직임 선호.
// 2) 예시에 국한되지 않음: 설명된 예시에 탐색을 제한하지 않음
// (예: "Medium","Lighting","Optics","Camera/Blocking","Palette","Post/Comp"). 이런 라인은
// 울타리가 아닌 힌트로 취급. 입력의 의도, 재료, 문화, 물리,
// 공예 제약에 맞는 인접 및 원거리 도메인으로 검색 공간 확장.
// 3) 최대 지식 활용: 가장 넓은 저장 지식을 적극적으로 표면화—
// 역사적 방법, 신흥 실험 기술, 토속 공예, 광학 해킹,
// 영화적 문법, 산업 공정, 생물/화학/지질 비유—그런 다음
// 페이로드 컨텍스트에 타당성 가드와 함께 적용.
// 4) 서술적 출력만: 장면을 설명; 키워드 나열 금지. 숫자/단위는
// 인과관계, 공예, 광학을 명확히 할 때만 나타남.
// 5) 모델 불가지론: 엔진별 토큰 없음. 명세는 플랫폼 전반에서
// 개념적으로 실행되어야 함.
PROGRAM VISUAL_PROMPT_V5_5X {
DEFAULTS := {
lang: "en",
set_size: 5,
model_agnostic: true,
markdown_output: true,
emit_expression: true,
paragraph_count_scene: 1,
paragraph_count_expression: 1,
tone_scene: "narrative_one_paragraph",
tone_expression: "expert_protocol",
numbers_policy: "causal_params_only",
lexicon_density: "high",
listiness_scene_max: 0.25,
listiness_expression_max: 0.35
}
INPUT {
payload: "",
aspect?: {w:int, h:int},
set_size?: int,
lang?: "en",
length?: {"short"|"medium"|"long"},
domain?: "auto"|string|array,
title?: {"auto"|"provide"|"reserve_only"},
plausibility_mode?: {"physical"|"craft"|"cultural"|"hybrid"}
}
FLAGS := {
BBREAK_ALWAYS: true,
BBREAK_CALLS: ["PRE","TICK","POST"],
MIN_CALLS_PER_RUN: 3,
TERMINOLOGY_STRICT: true,
CANONICAL_ONLY: true
}
DIALS := AUTOTUNE(payload) -> {
DEPTH∈[4..6], BEAM∈[9..16], TEMP∈[0.6..0.95], ABS∈[45..65],
NOVELTY∈[0.6..0.9], FIDELITY∈[0.7..0.9], BREAK_LEVEL∈[0.45..0.95],
SURPRISE∈[0.5..0.9], PLAUSIBILITY_MODE∈{physical|craft|cultural|hybrid},
NUM_ANCHORS∈[20..36], LENGTH∈{short/medium/long}
}
DOMAIN_TAXON := [
"cinema","cinema_grading","photography","photography_analog","stagecraft","vfx","animation_3d","motion_graphics",
"illustration_paint","mural_fresco","graffiti_street","comics_manga","calligraphy",
"printmaking_screen","printmaking_intaglio","printmaking_lithography","printmaking_relief","risograph","letterpress","bookbinding","papermaking","origami_kirigami",
"graphic_typography","editorial_layout","data_visualization","cartography","information_design",
"architecture","interior_design","landscape_architecture","urban_design","lighting_design","light_art","projection_mapping","holography",
"industrial_design","packaging_design","furniture_design","jewelry","watchmaking","luthiery","shoemaking","toy_design",
"ceramics_pottery","ceramics_porcelain","ceramics_raku","ceramics_celadon",
"metalsmithing_blacksmith","metalsmithing_jewelry","bronze_casting","stone_carving","sculpture_resin","kinetic_art",
"glass_hotshop","glass_neon","glass_stained","lampworking",
"woodwork_joinery","woodwork_carving","marquetry","bamboo_craft",
"textile_weave","textile_knit","dye_shibori","dye_batik","ikat","embroidery","fashion_tailoring","millinery","costume_design",
"makeup_beauty","sfx_prosthetics","body_paint","tattoo_art","nail_art","hairstyling_color",
"perfumery","cosmetics_formulation",
"culinary_hot","pastry","bread_baking","confectionery_chocolate","mixology","coffee_roasting","tea_blending",
"sound_music","sound_design","foley_fieldrec","spatial_audio","dj_performance","modular_synthesis",
"game_design","level_design","ux_ui_interaction","creative_coding","shader_art","generative_art","xr_ar_vr","volumetric_capture","photogrammetry",
"physical_computing","mechatronics","robotics_kinetic","laser_art","led_architecture",
"floral_design_ikebana","bonsai","aquascaping","terrarium",
"mosaic","tessellation","stained_pigment_glass"
]
DOMAIN_ALIAS := {
"film":"cinema", "grade":"cinema_grading", "cg":"animation_3d",
"uiux":"ux_ui_interaction", "viz":"data_visualization", "pmapping":"projection_mapping",
"vr":"xr_ar_vr", "ar":"xr_ar_vr", "ai_art":"generative_art"
}
DOMAIN_PROTOCOL_MAP := {
"cinema": ["Medium","Lighting","Optics","Camera/Blocking","Palette","Post/Comp"],
"cinema_grading": ["Camera/ColorSpace","Primary/Secondary","Keys/Windows","Texture/Grain","Look/Print","Delivery/DCP"],
"photography": ["Medium","Lighting","Optics","Camera/Exposure","Palette","Retouch"],
"vfx": ["Plates","Matchmove/Layout","FX/Sim","Lookdev/Lighting","Render","Composite"],
"animation_3d": ["Rig/Key","Camera","Material/BRDF","Lighting","Cache/Sim","Render/Post"],
"illustration_paint": ["Support","Ground","Pigment/Binder","Stroke/Layers","Glaze","Varnish/Scan"],
"ceramics_pottery": ["Clay Body","Throw/Handbuild","Trim","Bisque","Glaze","Fire/Cool"],
"metalsmithing_jewelry":["Saw/Files","Form/Anneal","Solder/Pick","Set","Polish","Plate"],
"glass_hotshop": ["Gather","Marver/Block","Form","Punty","Anneal","Coldwork"],
"shader_art": ["UV/Space","Normals/TBN","Lighting/BRDF","SDF/Raymarch","Temporal","Post"],
"generative_art": ["Rule/Grammar","Random/Seed","Morphology","Constraint","Curation","Archive"],
"data_visualization": ["Data Model","Encoding/Mapping","Scale/Axis","Interaction","Color/Accessibility","Export"]
}
TERMINOLOGY_ATLAS := {
"cinema": ["ACEScct","dichroic","Brewster angle","cross-polarization","tilt-shift","diopter","caustics","MTF"],
"vfx": ["camera solve","AOV","deep comp","USD","OpenEXR","cryptomatte","roto/paint","vector blur"],
"animation_3d": ["FK/IK","blendshapes","BSDF","SSS","importance sampling","radiance cache","denoiser","ACES"],
"shader_art": ["UV/Space","Normals/TBN","Lighting/BRDF","SDF/Raymarch","Temporal","Post"]
}
} 과학적 시각화를 위한 생성된 프롬프트
프롬프트 요청: "원자 에너지 및 힘 추정을 위한 그래프 신경망 모델의 증류"
광대하고 혼란스러운 빛나는 입자 노드와 희미하게 얽힌 엣지의 성운—거대한 "교사" 그래프 신경망을 나타냄—이 프레임의 왼쪽을 채운다. 이 격동의 구름은 중앙의 수정같은 렌즈형 구조물의 벌어진 구멍으로 빨려 들어간다. 정보가 통과하면서 필터링되고 압축되어, 오른쪽에서 단일하고 일관되며 강렬하게 밝은 빔으로 나타난다. 이 빔은 복잡하게 회전하는 분자 구조를 비추며, 각 원자에 정밀하고 빛나는 벡터를 투사하여 증류된 모델의 정확한 힘 추정을 시각화한다. 배경은 좌표계를 암시하는 미묘한 격자가 있는 어두운 추상 공간이다.
어둡고 반사되는 환경에서, "교사" 모델을 나타내는 거대하고 복잡하게 면이 깎인 고대처럼 보이는 수정이 떠 있다. 그 내부 구조는 빛의 밀집된 격자이며, 복잡한 그래프 패턴이 표면을 가로질러 이동한다. 아래의 우아하고 미니멀한 지지대에 놓인 훨씬 작고 단순하며 광택이 나는 보석—"학생" 모델—에 집중된 복잡한 빛의 빔을 투사한다.
CO2 활용 흐름도
생성적 GNN 파이프라인 시각화
Blender + 프롬프팅 = 출판 품질 그림
Atomic Blender로 3D 구조 렌더링
Python 스크립팅으로 배치 자동화
AI 프롬프팅으로 창의적 시각화
연구를 시각적으로 매력적으로 만드세요.