물 영역 포함 관계를 수정한 실제 3D 샘플 통합
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
# 물 소재 3D 시제품 작성 경계
|
# 물 소재 3D 시제품 작성 경계
|
||||||
|
|
||||||
- 이 폴더는 물 영상의 세 대표 장면을 재현하는 bpy 코드다. 범용 실행기는 `tools/blender/run.py`를 사용하고 수정하지 않는다.
|
- 이 폴더는 물 영상의 세 대표 장면을 재현하는 bpy 코드다. 범용 실행기는 `tools/blender/run.py`를 사용하고 수정하지 않는다.
|
||||||
- 원본·렌더는 자기 `08-scenes/r2` 아래에 둔다. 이전 결과·WAV·사용자 스타일 원본·project.json은 변경하지 않는다.
|
- 원본·렌더는 자기 `08-scenes/r3` 아래에 둔다. 이전 결과·WAV·사용자 스타일 원본·project.json은 변경하지 않는다.
|
||||||
- 실제 O1H2·V자·두 종류 결합·동적 이웃·닫힌 mesh 부피와 `--disable-autoexec` 평가를 검사한다. 물리 시뮬레이션으로 주장하지 않는다.
|
- 전체 Interface 범위의 평가 mesh 정점·물 경계·화면 투영 포함과 실제 O1H2·V자·두 종류 결합·동적 이웃·닫힌 mesh 부피와 `--disable-autoexec` 평가를 검사한다. 물리 시뮬레이션으로 주장하지 않는다.
|
||||||
- draft 품질 조정은 별도 렌더 시도를 보존한다. 제출 후 결과 변경은 새 revision으로 진행하며 새 scenes 승인 전 정식 10–12를 실행하지 않는다.
|
- draft 품질 조정은 별도 렌더 시도를 보존한다. 제출 후 결과 변경은 새 revision으로 진행하며 새 scenes 승인 전 정식 10–12를 실행하지 않는다.
|
||||||
|
|||||||
@@ -13,6 +13,6 @@
|
|||||||
& 'C:/Users/baram/anaconda3/python.exe' -B -X utf8 projects/water-hydrogen-bond-surface-tension/blender/verify_design.py
|
& 'C:/Users/baram/anaconda3/python.exe' -B -X utf8 projects/water-hydrogen-bond-surface-tension/blender/verify_design.py
|
||||||
```
|
```
|
||||||
|
|
||||||
작성 순서는 새 draft 재현용이다. `prepare_artifacts.py`는 대표 미디어가 빈 08/09 초안을 작성하므로 제출한 r2에서 재실행하지 않는다. `render_preview.py`는 현재 초안에 실제 증거만 추가한다. 완료된 결과는 새 버전에서 작업한다.
|
작성 순서는 새 draft 재현용이다. `prepare_artifacts.py`는 대표 미디어가 빈 08/09 초안을 작성하므로 제출한 r3에서 재실행하지 않는다. `render_preview.py`는 현재 초안에 실제 증거만 추가한다. 완료된 결과는 새 버전에서 작업한다.
|
||||||
|
|
||||||
`test_model.py`는 없는 파일·Scene 누락·H 원자 누락·부피 driver 오류의 실제 RED와 원본 GREEN을 확인한다. 부피는 시작·중간 세 곳·전체 컷 끝을 실제 mesh로 평가한다. 실제 렌더는 기존 실행기의 source hash·Scene·profile·frame 검사, PNG/MP4 probe 및 전체 디코드를 거친다. 큰 원본·렌더·실패 시도는 해당 r2의 좁은 `.gitignore`로 보존하고 작은 검증 JSON에 복사할 파일·해시를 기록한다.
|
`test_model.py`는 없는 파일·Scene 누락·H 원자 누락·부피 driver 오류·원자 중심은 유지하고 mesh 정점만 물 밖에 둔 fixture·기존 r2 원본의 실제 RED와 수정 원본 GREEN을 확인한다. 포함 관계 실패 문구도 검사·기록한다. Interface 전체 논리 F2468–3172의 실제 원자·내부 실선·활성 점선 mesh 정점을 실제 물 mesh 경계와 camera 투영 윤곽에 대조한다. 최소 축 여백 0.03을 요구한다. 물 모형은 앞면·윗면이 실제 열린 절개이며 벽·고체 껍질이 아니다. 부피는 시작·중간 세 곳·전체 컷 끝을 실제 mesh로 평가한다. 실제 렌더는 기존 실행기의 source hash·Scene·profile·frame 검사, PNG/MP4 probe 및 전체 디코드를 거친다. 큰 원본·렌더·실패 시도는 해당 r3의 좁은 `.gitignore`로 보존하고 작은 검증 JSON에 복사할 파일·해시를 기록한다.
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import bpy
|
|||||||
from mathutils import Vector
|
from mathutils import Vector
|
||||||
|
|
||||||
ROOT = Path(__file__).resolve().parents[3]
|
ROOT = Path(__file__).resolve().parents[3]
|
||||||
OUT = ROOT / "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/generated-source/preview.blend"
|
OUT = ROOT / "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/generated-source/preview.blend"
|
||||||
if OUT.exists():
|
if OUT.exists():
|
||||||
history=OUT.parent/'history'
|
history=OUT.parent/'history'
|
||||||
history.mkdir(exist_ok=True)
|
history.mkdir(exist_ok=True)
|
||||||
@@ -164,16 +164,17 @@ for frame, x in ((905,1.65),(1018,1.65),(1118,.85),(1220,.85),(1637,.85)):
|
|||||||
dash("Pair_HO_Dash_", aa[1], ba[0], [905,1018,1118,1220,1637])
|
dash("Pair_HO_Dash_", aa[1], ba[0], [905,1018,1118,1220,1637])
|
||||||
|
|
||||||
interface = scene("Interface", (2469,3173), (0,-14,6), 13)
|
interface = scene("Interface", (2469,3173), (0,-14,6), 13)
|
||||||
# 옆면/뒤쪽의 청색 체적만 보이는 잘라낸 설명 모형. 경계 위 고체 막 없음.
|
# 실제 물 영역 전체를 표시하되 앞면·윗면을 열어 내부 분자를 보이는 절개 설명 모형.
|
||||||
bpy.ops.mesh.primitive_cube_add(size=1, location=(0,1.7,-1.15))
|
low, high = (-2.85,-.85,-3.15), (2.85,1.35,.80)
|
||||||
body = bpy.context.object
|
vertices=[(x,y,z) for z in (low[2],high[2]) for y in (low[1],high[1]) for x in (low[0],high[0])]
|
||||||
body.name = 'WaterCutawayBody'
|
mesh=bpy.data.meshes.new('WaterCutawayMesh')
|
||||||
body.scale = (5,1.5,3)
|
mesh.from_pydata(vertices,[],[(0,2,3,1),(2,6,7,3),(0,4,6,2),(1,3,7,5)])
|
||||||
|
mesh.update()
|
||||||
|
body=bpy.data.objects.new('WaterCutawayBody',mesh)
|
||||||
|
interface.collection.objects.link(body)
|
||||||
body.data.materials.append(GHOST)
|
body.data.materials.append(GHOST)
|
||||||
body['role'] = 'cutaway_water'
|
body['role']='cutaway_water'
|
||||||
bevel=body.modifiers.new('SoftCutawayEdges','BEVEL')
|
body['representation']='앞면·윗면이 열린 물 체적의 설명용 절개'
|
||||||
bevel.width=.055
|
|
||||||
bevel.segments=3
|
|
||||||
positions = [(-1.8,-.1,.25),(.4,.2,.18),(1.95,.45,.25),(-2,.3,-1.5),(-.65,.15,-1.15),(.9,.3,-1.6),(2,.35,-1.3),(-1.6,.3,-2.5),(.2,.4,-2.45),(1.6,.1,-2.6)]
|
positions = [(-1.8,-.1,.25),(.4,.2,.18),(1.95,.45,.25),(-2,.3,-1.5),(-.65,.15,-1.15),(.9,.3,-1.6),(2,.35,-1.3),(-1.6,.3,-2.5),(.2,.4,-2.45),(1.6,.1,-2.6)]
|
||||||
mols=[]
|
mols=[]
|
||||||
for i, pos in enumerate(positions):
|
for i, pos in enumerate(positions):
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ from pathlib import Path
|
|||||||
from PIL import Image, ImageChops, ImageStat
|
from PIL import Image, ImageChops, ImageStat
|
||||||
|
|
||||||
ROOT=Path(__file__).resolve().parents[3]
|
ROOT=Path(__file__).resolve().parents[3]
|
||||||
BASE=ROOT/'projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2'
|
BASE=ROOT/'projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3'
|
||||||
artifact=json.loads((BASE/'artifact.json').read_text(encoding='utf-8'))
|
artifact=json.loads((BASE/'artifact.json').read_text(encoding='utf-8'))
|
||||||
results=[]
|
results=[]
|
||||||
for sample in artifact['payload']['preview']['samples']:
|
for sample in artifact['payload']['preview']['samples']:
|
||||||
|
|||||||
@@ -44,9 +44,9 @@ def read(stage):
|
|||||||
|
|
||||||
|
|
||||||
def write(stage, payload, inputs):
|
def write(stage, payload, inputs):
|
||||||
folder = PROJECT / f'stages/{stage}/r2'
|
folder = PROJECT / f'stages/{stage}/r3'
|
||||||
folder.mkdir(parents=True, exist_ok=True)
|
folder.mkdir(parents=True, exist_ok=True)
|
||||||
body = dict(schema_version='1.1',project_id=PROJECT.name,stage_id=stage,revision=2,inputs=[dict(stage_id=s,revision=r) for s,r in inputs],payload=payload)
|
body = dict(schema_version='1.1',project_id=PROJECT.name,stage_id=stage,revision=3,inputs=[dict(stage_id=s,revision=r) for s,r in inputs],payload=payload)
|
||||||
(folder/'artifact.json').write_text(json.dumps(body,ensure_ascii=False,indent=2)+'\n',encoding='utf-8')
|
(folder/'artifact.json').write_text(json.dumps(body,ensure_ascii=False,indent=2)+'\n',encoding='utf-8')
|
||||||
|
|
||||||
|
|
||||||
@@ -81,8 +81,8 @@ if __name__ == '__main__':
|
|||||||
'새 이웃과의 H···O 연결이 보이며 분자마다 연결 수·방향이 다르다. 영구 끈·정지 격자는 없다.',
|
'새 이웃과의 H···O 연결이 보이며 분자마다 연결 수·방향이 다르다. 영구 끈·정지 격자는 없다.',
|
||||||
'불규칙한 집단을 유지하며 분자 사이의 응집이 거시적 물의 뭉침에 기여함을 다음 경계 모형으로 연결한다.'
|
'불규칙한 집단을 유지하며 분자 사이의 응집이 거시적 물의 뭉침에 기여함을 다음 경계 모형으로 연결한다.'
|
||||||
]),
|
]),
|
||||||
(14,17,'Interface','bg-interface','실제 대표 Scene Interface. 3D 체적을 옆면·뒤쪽만 남긴 잘라낸 설명 모형, 카메라 (0,-14,6), ortho_scale=13. 색 경계에 고체막을 추가하지 않는다.',[
|
(14,17,'Interface','bg-interface','실제 대표 Scene Interface. 실제 물 경계 x=[-2.85,2.85], y=[-0.85,1.35], z=[-3.15,0.80] 안에 전체 원자·결합을 포함하고 앞면·윗면을 연 절개 설명 모형, 카메라 (0,-14,6), ortho_scale=13. 색 경계에 고체막을 추가하지 않는다.',[
|
||||||
'아래쪽 청색 물 체적과 위쪽 공기 공간이 보이며 앞쪽 절개에 불규칙한 물 분자가 있다. 공기 이름은 추후 합성한다.',
|
'아래쪽 청색 물 체적과 위쪽 공기 공간이 보이며 실제 청색 물 영역 안에 불규칙한 물 분자가 모두 포함된다. 공기 이름은 추후 합성한다.',
|
||||||
'물-공기 경계를 유지하고 안쪽 Liquid4 주변의 다양한 이웃이 보이도록 근접 강조를 시작한다.',
|
'물-공기 경계를 유지하고 안쪽 Liquid4 주변의 다양한 이웃이 보이도록 근접 강조를 시작한다.',
|
||||||
'Blender F2807에서 Liquid4 안쪽 강조고리 scale=1, Liquid1 표면 강조고리 scale=0.01. 안쪽은 위·아래·옆에 이웃 물 분자가 있다.',
|
'Blender F2807에서 Liquid4 안쪽 강조고리 scale=1, Liquid1 표면 강조고리 scale=0.01. 안쪽은 위·아래·옆에 이웃 물 분자가 있다.',
|
||||||
'Blender F3051에서 안쪽 강조는 작아지고 Liquid1 표면 강조고리 scale=1. 표면보다 위 공기 쪽에는 액체 물 이웃을 배치하지 않는다; 별도 막은 없다.',
|
'Blender F3051에서 안쪽 강조는 작아지고 Liquid1 표면 강조고리 scale=1. 표면보다 위 공기 쪽에는 액체 물 이웃을 배치하지 않는다; 별도 막은 없다.',
|
||||||
@@ -129,13 +129,13 @@ if __name__ == '__main__':
|
|||||||
assert left['end_state']==right['start_state']
|
assert left['end_state']==right['start_state']
|
||||||
connections.append(dict(from_cut_id=left['cut_id'],to_cut_id=right['cut_id'],mode='continuous' if same else 'cut',reason='동일 Scene·논리 경계 프레임·물체·카메라 상태를 공유하며 설명의 다음 변화를 잇는다.' if same else f"설명 범위·조건·시점 전환으로 {mapping[left['cut_id']][0]}에서 별도 {mapping[right['cut_id']][0]} Scene으로 전환한다."))
|
connections.append(dict(from_cut_id=left['cut_id'],to_cut_id=right['cut_id'],mode='continuous' if same else 'cut',reason='동일 Scene·논리 경계 프레임·물체·카메라 상태를 공유하며 설명의 다음 변화를 잇는다.' if same else f"설명 범위·조건·시점 전환으로 {mapping[left['cut_id']][0]}에서 별도 {mapping[right['cut_id']][0]} Scene으로 전환한다."))
|
||||||
profile=dict(engine='BLENDER_EEVEE',device='GPU',fps=50,width=1080,height=1920,samples=64,seed=0)
|
profile=dict(engine='BLENDER_EEVEE',device='GPU',fps=50,width=1080,height=1920,samples=64,seed=0)
|
||||||
write('08-scenes',dict(scenes=scenes,connections=connections,preview=dict(scene_file=dict(path=f'projects/{PROJECT.name}/stages/08-scenes/r2/generated-source/preview.blend',verified=False,sha256=None,blender_version=None),render_profile=profile,samples=[])),[('02-research',1),('03-script',1),('07-cuts',1)])
|
write('08-scenes',dict(scenes=scenes,connections=connections,preview=dict(scene_file=dict(path=f'projects/{PROJECT.name}/stages/08-scenes/r3/generated-source/preview.blend',verified=False,sha256=None,blender_version=None),render_profile=profile,samples=[])),[('02-research',1),('03-script',1),('07-cuts',1)])
|
||||||
common=["references/1.png의 단순 형태·정돈된 색·정보량을 교육용 3D로 해석한다. 크림색 단순 공간·부드러운 조명·선명한 형태를 반복한다.","산호색 O·미색 H·남색 내부 O–H 실선·금색 서로 다른 분자 H···O 점선·청색 물을 일관되게 사용한다.","상하단에는 제목·자막용 빈 공간을 두고 부분전하·한국어 주석은 나중 Remotion에서 검증해 합성한다. 3D에 글자를 굽지 않는다."]
|
common=["references/1.png의 단순 형태·정돈된 색·정보량을 교육용 3D로 해석한다. 크림색 단순 공간·부드러운 조명·선명한 형태를 반복한다.","산호색 O·미색 H·남색 내부 O–H 실선·금색 서로 다른 분자 H···O 점선·청색 물을 일관되게 사용한다.","상하단에는 제목·자막용 빈 공간을 두고 부분전하·한국어 주석은 나중 Remotion에서 검증해 합성한다. 3D에 글자를 굽지 않는다."]
|
||||||
extras={
|
extras={
|
||||||
'bg-droplet':('물방울의 크림색 3D 설명 공간',["청색 물방울은 닫힌 mesh이며 별도 껍질·막을 만들지 않는다.","같은 물의 양 변형은 실제 평가 mesh 부피를 시작·중간·끝에서 검사한다. 물리 시뮬레이션으로 주장하지 않는다."]),
|
'bg-droplet':('물방울의 크림색 3D 설명 공간',["청색 물방울은 닫힌 mesh이며 별도 껍질·막을 만들지 않는다.","같은 물의 양 변형은 실제 평가 mesh 부피를 시작·중간·끝에서 검사한다. 물리 시뮬레이션으로 주장하지 않는다."]),
|
||||||
'bg-molecules':('분자의 3D 근접·불규칙 액체 연결 설명 공간',["온전한 물 분자마다 O1H2·V자 형태·내부 O–H 실선 두 개를 유지한다. 각도·거리·힘 수치를 표시하지 않는다.","분자간 H···O 점선은 서로 다른 분자의 원자만 연결한다. 액체는 불규칙한 이웃·변하는 연결이고 모든 분자의 연결 수를 고정하지 않는다."]),
|
'bg-molecules':('분자의 3D 근접·불규칙 액체 연결 설명 공간',["온전한 물 분자마다 O1H2·V자 형태·내부 O–H 실선 두 개를 유지한다. 각도·거리·힘 수치를 표시하지 않는다.","분자간 H···O 점선은 서로 다른 분자의 원자만 연결한다. 액체는 불규칙한 이웃·변하는 연결이고 모든 분자의 연결 수를 고정하지 않는다."]),
|
||||||
'bg-interface':('물-공기 경계의 3D 체적·절개 설명 공간',["물 체적을 뒤쪽·옆면에 남긴 개념도이며 위 공기는 진공 주장이 아니다. 별도 고체 표면층·전체 아래 가속 화살표가 없다.","안쪽은 다양한 방향의 액체 이웃, 표면은 위쪽 액체 이웃이 적은 환경으로 구별한다. 강조고리는 설명 표식이고 물 껍질이 아니다."]),
|
'bg-interface':('물-공기 경계의 3D 체적·절개 설명 공간',["전체 분자·결합이 물 체적 안에 포함되고 앞면·윗면만 열린 절개 설명 모형이며 위 공기는 진공 주장이 아니다. 별도 고체 표면층·전체 아래 가속 화살표가 없다.","안쪽은 다양한 방향의 액체 이웃, 표면은 위쪽 액체 이웃이 적은 환경으로 구별한다. 강조고리는 설명 표식이고 물 껍질이 아니다."]),
|
||||||
'bg-comparison':('같은 부피 비교·조건 예시의 크림색 3D 공간',["동일 부피 비교와 외부 영향 조건 예시는 별도 Scene으로 구별한다.","바닥은 조건 예시에만 등장한다. 중력·접촉각·크기 경계·표면장력 수치를 임의로 표시하지 않는다."])
|
'bg-comparison':('같은 부피 비교·조건 예시의 크림색 3D 공간',["동일 부피 비교와 외부 영향 조건 예시는 별도 Scene으로 구별한다.","바닥은 조건 예시에만 등장한다. 중력·접촉각·크기 경계·표면장력 수치를 임의로 표시하지 않는다."])
|
||||||
}
|
}
|
||||||
backgrounds=[dict(id=k,description=v[0],fixed_features=common+v[1]) for k,v in extras.items()]
|
backgrounds=[dict(id=k,description=v[0],fixed_features=common+v[1]) for k,v in extras.items()]
|
||||||
write('09-entities',dict(characters=[],backgrounds=backgrounds,appearances=[dict(cut_id=c['id'],character_ids=[],background_ids=[mapping[c['id']][1]]) for c in cuts]),[('02-research',1),('03-script',1),('07-cuts',1),('08-scenes',2)])
|
write('09-entities',dict(characters=[],backgrounds=backgrounds,appearances=[dict(cut_id=c['id'],character_ids=[],background_ids=[mapping[c['id']][1]]) for c in cuts]),[('02-research',1),('03-script',1),('07-cuts',1),('08-scenes',3)])
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import subprocess
|
|||||||
from PIL import Image, ImageChops
|
from PIL import Image, ImageChops
|
||||||
|
|
||||||
ROOT = Path(__file__).resolve().parents[3]
|
ROOT = Path(__file__).resolve().parents[3]
|
||||||
BASE = Path('projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2')
|
BASE = Path('projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3')
|
||||||
BLENDER = 'C:/Program Files/Blender Foundation/Blender 5.2/blender.exe'
|
BLENDER = 'C:/Program Files/Blender Foundation/Blender 5.2/blender.exe'
|
||||||
PYTHON = 'C:/Users/baram/anaconda3/python.exe'
|
PYTHON = 'C:/Users/baram/anaconda3/python.exe'
|
||||||
COMPOSITOR = Path('C:/git/ShortVideoGenerator/projects/water-hydrogen-bond-surface-tension/renderer/node_modules/@remotion/compositor-win32-x64-msvc')
|
COMPOSITOR = Path('C:/git/ShortVideoGenerator/projects/water-hydrogen-bond-surface-tension/renderer/node_modules/@remotion/compositor-win32-x64-msvc')
|
||||||
@@ -37,6 +37,7 @@ def run(args, records):
|
|||||||
if __name__=='__main__':
|
if __name__=='__main__':
|
||||||
parser=argparse.ArgumentParser()
|
parser=argparse.ArgumentParser()
|
||||||
parser.add_argument('--kind',choices=['image','video'],required=True)
|
parser.add_argument('--kind',choices=['image','video'],required=True)
|
||||||
|
parser.add_argument('--cut',choices=['c07','c16','c18'])
|
||||||
args=parser.parse_args()
|
args=parser.parse_args()
|
||||||
record_path=ROOT/BASE/'cli-commands.json'
|
record_path=ROOT/BASE/'cli-commands.json'
|
||||||
records=json.loads(record_path.read_text(encoding='utf-8')) if record_path.exists() else []
|
records=json.loads(record_path.read_text(encoding='utf-8')) if record_path.exists() else []
|
||||||
@@ -45,13 +46,15 @@ if __name__=='__main__':
|
|||||||
record.pop('stderr',None)
|
record.pop('stderr',None)
|
||||||
artifact=json.loads((ROOT/ARTIFACT).read_text(encoding='utf-8'))
|
artifact=json.loads((ROOT/ARTIFACT).read_text(encoding='utf-8'))
|
||||||
for cut,scene,obj,start,end,boundary in PLAN:
|
for cut,scene,obj,start,end,boundary in PLAN:
|
||||||
|
if args.cut and args.cut!=cut:
|
||||||
|
continue
|
||||||
assert not any(s['id']==cut+'-'+args.kind for s in artifact['payload']['preview']['samples']), '이미 반영한 sample을 같은 버전에서 재생성하지 않는다'
|
assert not any(s['id']==cut+'-'+args.kind for s in artifact['payload']['preview']['samples']), '이미 반영한 sample을 같은 버전에서 재생성하지 않는다'
|
||||||
common=[PYTHON,'-B','-X','utf8','tools/blender/run.py']
|
common=[PYTHON,'-B','-X','utf8','tools/blender/run.py']
|
||||||
inspect=run(common+['inspect','--blender',BLENDER,'--source',SOURCE,'--scene',scene,'--require-object',obj],records)
|
inspect=run(common+['inspect','--blender',BLENDER,'--source',SOURCE,'--scene',scene,'--require-object',obj],records)
|
||||||
artifact['payload']['preview']['scene_file']=inspect['scene_file']
|
artifact['payload']['preview']['scene_file']=inspect['scene_file']
|
||||||
(ROOT/ARTIFACT).write_text(json.dumps(artifact,ensure_ascii=False,indent=2)+'\n',encoding='utf-8')
|
(ROOT/ARTIFACT).write_text(json.dumps(artifact,ensure_ascii=False,indent=2)+'\n',encoding='utf-8')
|
||||||
options=['--frame',str(boundary)] if args.kind=='image' else ['--start',str(start),'--end',str(end)]
|
options=['--frame',str(boundary)] if args.kind=='image' else ['--start',str(start),'--end',str(end)]
|
||||||
rendered=run(common+['render','--mode','preview','--project',PROJECT,'--artifact',ARTIFACT,'--output-revision','2','--blender',BLENDER,'--source',SOURCE,'--scene',scene,'--require-object',obj,'--cut-id',cut,'--ffmpeg',str(COMPOSITOR/'ffmpeg.exe'),'--ffprobe',str(COMPOSITOR/'ffprobe.exe')]+options,records)
|
rendered=run(common+['render','--mode','preview','--project',PROJECT,'--artifact',ARTIFACT,'--output-revision','3','--blender',BLENDER,'--source',SOURCE,'--scene',scene,'--require-object',obj,'--cut-id',cut,'--ffmpeg',str(COMPOSITOR/'ffmpeg.exe'),'--ffprobe',str(COMPOSITOR/'ffprobe.exe')]+options,records)
|
||||||
# 실행기의 실제 증거만 미디어 메타데이터로 사용한다.
|
# 실행기의 실제 증거만 미디어 메타데이터로 사용한다.
|
||||||
evidence=rendered
|
evidence=rendered
|
||||||
if args.kind=='video':
|
if args.kind=='video':
|
||||||
|
|||||||
@@ -1,29 +1,32 @@
|
|||||||
"""없는 원본·잘못된 Scene·원자 수·부피를 실제 Blender로 거부하는지 검사한다."""
|
"""원본 부재·구조·물 영역 포함·부피 오류를 실제 Blender로 거부한다."""
|
||||||
import json
|
import json
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import subprocess
|
import subprocess
|
||||||
|
|
||||||
ROOT=Path(__file__).resolve().parents[3]
|
ROOT=Path(__file__).resolve().parents[3]
|
||||||
BASE=ROOT/'projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2'
|
BASE=ROOT/'projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3'
|
||||||
BLENDER='C:/Program Files/Blender Foundation/Blender 5.2/blender.exe'
|
BLENDER='C:/Program Files/Blender Foundation/Blender 5.2/blender.exe'
|
||||||
SOURCE=BASE/'generated-source/preview.blend'
|
SOURCE=BASE/'generated-source/preview.blend'
|
||||||
VERIFY=ROOT/'projects/water-hydrogen-bond-surface-tension/blender/verify_model.py'
|
VERIFY=ROOT/'projects/water-hydrogen-bond-surface-tension/blender/verify_model.py'
|
||||||
records=[]
|
records=[]
|
||||||
|
|
||||||
|
|
||||||
def execute(args, expected):
|
def execute(args, expected, reason=None):
|
||||||
command=[BLENDER,'--background','--disable-autoexec','--python-exit-code','1']+args
|
command=[BLENDER,'--background','--disable-autoexec','--python-exit-code','1']+args
|
||||||
result=subprocess.run(command,cwd=ROOT,capture_output=True,text=True,encoding='utf-8')
|
result=subprocess.run(command,cwd=ROOT,capture_output=True,text=True,encoding='utf-8')
|
||||||
assert result.returncode==expected,(command,result.stdout,result.stderr)
|
assert result.returncode==expected,(command,result.stdout,result.stderr)
|
||||||
records.append(dict(command=command,exit_code=result.returncode,expected_exit_code=expected,reason=result.stderr.strip().splitlines()[-1:] if result.stderr.strip() else []))
|
if reason:
|
||||||
|
assert reason in result.stderr, (reason,result.stderr)
|
||||||
|
records.append(dict(command=command,exit_code=result.returncode,expected_exit_code=expected,matched_reason=reason,assertion_errors=[line for line in result.stderr.splitlines() if line.startswith('AssertionError:')]))
|
||||||
|
|
||||||
|
|
||||||
for name,edit in [('invalid-default','bpy.ops.wm.read_factory_settings(use_empty=True)'),('invalid-atoms',"bpy.data.objects.remove(bpy.data.objects['PairA_H2'],do_unlink=True)"),('invalid-volume',"bpy.data.objects['Droplet'].animation_data.drivers[1].driver.expression='1'")]:
|
for name,edit in [('invalid-default','bpy.ops.wm.read_factory_settings(use_empty=True)'),('invalid-atoms',"bpy.data.objects.remove(bpy.data.objects['PairA_H2'],do_unlink=True)"),('invalid-volume',"bpy.data.objects['Droplet'].animation_data.drivers[1].driver.expression='1'"),('invalid-containment',"bpy.data.objects['Liquid9_H1'].data.vertices[0].co.x=10")]:
|
||||||
fixture=BASE/'generated-source'/f'{name}.blend'
|
fixture=BASE/'generated-source'/f'{name}.blend'
|
||||||
expression=f'import bpy; bpy.ops.wm.open_mainfile(filepath={str(SOURCE)!r}); {edit}; bpy.ops.wm.save_as_mainfile(filepath={str(fixture)!r})'
|
expression=f'import bpy; bpy.ops.wm.open_mainfile(filepath={str(SOURCE)!r}); {edit}; bpy.ops.wm.save_as_mainfile(filepath={str(fixture)!r})'
|
||||||
execute(['--python-expr',expression],0)
|
execute(['--python-expr',expression],0)
|
||||||
execute(['--python',str(VERIFY),'--','--source',str(fixture),'--out',str(BASE/'generated-source/invalid-result.json')],1)
|
execute(['--python',str(VERIFY),'--','--source',str(fixture),'--out',str(BASE/'generated-source/invalid-result.json')],1,'물 영역 밖 또는 여백 부족' if name=='invalid-containment' else None)
|
||||||
execute(['--python',str(VERIFY),'--','--source',str(BASE/'generated-source/missing.blend'),'--out',str(BASE/'generated-source/invalid-result.json')],1)
|
execute(['--python',str(VERIFY),'--','--source',str(BASE/'generated-source/missing.blend'),'--out',str(BASE/'generated-source/invalid-result.json')],1)
|
||||||
|
execute(['--python',str(VERIFY),'--','--source',str(BASE.parent/'r2/generated-source/preview.blend'),'--out',str(BASE/'generated-source/invalid-result.json')],1,'물 영역 밖 또는 여백 부족')
|
||||||
execute(['--python',str(VERIFY),'--','--source',str(SOURCE),'--out',str(BASE/'model-check.json')],0)
|
execute(['--python',str(VERIFY),'--','--source',str(SOURCE),'--out',str(BASE/'model-check.json')],0)
|
||||||
(BASE/'model-test-results.json').write_text(json.dumps(dict(result='GREEN',negative_cases=4,positive_cases=1,executions=records),ensure_ascii=False,indent=2)+'\n',encoding='utf-8')
|
(BASE/'model-test-results.json').write_text(json.dumps(dict(result='GREEN',negative_cases=6,positive_cases=1,executions=records),ensure_ascii=False,indent=2)+'\n',encoding='utf-8')
|
||||||
print('4 negative cases RED, real model GREEN')
|
print('실제 실패 사례 6개 RED, 수정 원본 GREEN')
|
||||||
|
|||||||
@@ -13,11 +13,13 @@ def read(path):
|
|||||||
|
|
||||||
|
|
||||||
if __name__=='__main__':
|
if __name__=='__main__':
|
||||||
a=read(PROJECT/'stages/08-scenes/r2/artifact.json')
|
a=read(PROJECT/'stages/08-scenes/r3/artifact.json')
|
||||||
b=read(PROJECT/'stages/09-entities/r2/artifact.json')
|
b=read(PROJECT/'stages/09-entities/r3/artifact.json')
|
||||||
schema=read(ROOT/'contracts/artifact.schema.json')
|
schema=read(ROOT/'contracts/artifact.schema.json')
|
||||||
jsonschema.validate(a,schema)
|
jsonschema.validate(a,schema)
|
||||||
jsonschema.validate(b,schema)
|
jsonschema.validate(b,schema)
|
||||||
|
assert a["revision"]==b["revision"]==3
|
||||||
|
assert {"stage_id":"08-scenes","revision":3} in b["inputs"]
|
||||||
cuts=read(PROJECT/'stages/07-cuts/r1/artifact.json')['payload']
|
cuts=read(PROJECT/'stages/07-cuts/r1/artifact.json')['payload']
|
||||||
ids=[c['id'] for c in cuts['cuts']]
|
ids=[c['id'] for c in cuts['cuts']]
|
||||||
assert len(ids)==31 and len(cuts['captions'])==38 and cuts['narration_duration_ms']==110560
|
assert len(ids)==31 and len(cuts['captions'])==38 and cuts['narration_duration_ms']==110560
|
||||||
@@ -41,6 +43,12 @@ if __name__=='__main__':
|
|||||||
preview=a['payload']['preview']
|
preview=a['payload']['preview']
|
||||||
source=preview['scene_file']
|
source=preview['scene_file']
|
||||||
assert source['verified'] and hashlib.sha256((ROOT/source['path']).read_bytes()).hexdigest()==source['sha256']
|
assert source['verified'] and hashlib.sha256((ROOT/source['path']).read_bytes()).hexdigest()==source['sha256']
|
||||||
|
assert (ROOT/source['path']).is_relative_to(PROJECT/'stages/08-scenes/r3')
|
||||||
|
model=read(PROJECT/'stages/08-scenes/r3/model-check.json')
|
||||||
|
assert model['source_sha256']==source['sha256']
|
||||||
|
containment=model['water_containment']
|
||||||
|
assert containment['frames']==705 and containment['logical_frame_start']==2468 and containment['logical_frame_end']==3172
|
||||||
|
assert min(containment['minimum_axis_margin'])>=.03 and containment['minimum_projected_margin_px']>0
|
||||||
samples=preview['samples']
|
samples=preview['samples']
|
||||||
assert len(samples)==6 and len({s['id'] for s in samples})==6
|
assert len(samples)==6 and len({s['id'] for s in samples})==6
|
||||||
assets=[dict(path=source['path'],sha256=source['sha256'])]
|
assets=[dict(path=source['path'],sha256=source['sha256'])]
|
||||||
@@ -48,7 +56,7 @@ if __name__=='__main__':
|
|||||||
for sample in samples:
|
for sample in samples:
|
||||||
media=sample['media']
|
media=sample['media']
|
||||||
path=ROOT/media['path']
|
path=ROOT/media['path']
|
||||||
assert path.is_relative_to(PROJECT/'stages/08-scenes/r2') and media['verified']
|
assert path.is_relative_to(PROJECT/'stages/08-scenes/r3') and media['verified']
|
||||||
evidence_path=path.parent/'evidence.json'
|
evidence_path=path.parent/'evidence.json'
|
||||||
evidence=read(evidence_path)
|
evidence=read(evidence_path)
|
||||||
assert evidence['media']==media and evidence['scene_file']==source and evidence['render_profile']==preview['render_profile']
|
assert evidence['media']==media and evidence['scene_file']==source and evidence['render_profile']==preview['render_profile']
|
||||||
@@ -64,12 +72,12 @@ if __name__=='__main__':
|
|||||||
for f in (path,evidence_path):
|
for f in (path,evidence_path):
|
||||||
assets.append(dict(path=f.relative_to(ROOT).as_posix(),sha256=hashlib.sha256(f.read_bytes()).hexdigest()))
|
assets.append(dict(path=f.relative_to(ROOT).as_posix(),sha256=hashlib.sha256(f.read_bytes()).hexdigest()))
|
||||||
result=dict(result='GREEN',cuts=31,captions=38,connections=30,total_ms=110560,fps=50,total_frames=5528,profile=preview['render_profile'],source_sha256=source['sha256'],samples=6,visual_review_frames=frame_reviews,actual_assets=assets,scenes_approval='pending',formal_10_12='not_started')
|
result=dict(result='GREEN',cuts=31,captions=38,connections=30,total_ms=110560,fps=50,total_frames=5528,profile=preview['render_profile'],source_sha256=source['sha256'],samples=6,visual_review_frames=frame_reviews,actual_assets=assets,scenes_approval='pending',formal_10_12='not_started')
|
||||||
motion=read(PROJECT/'stages/08-scenes/r2/motion-check.json')
|
motion=read(PROJECT/'stages/08-scenes/r3/motion-check.json')
|
||||||
assert motion['source_sha256']==source['sha256'] and len(motion['views'])==3
|
assert motion['source_sha256']==source['sha256'] and len(motion['views'])==3
|
||||||
for view in motion['views']:
|
for view in motion['views']:
|
||||||
assert all(change>0 for change in view['mean_absolute_pixel_change'])
|
assert all(change>0 for change in view['mean_absolute_pixel_change'])
|
||||||
path=ROOT/view['mobile_view_path']
|
path=ROOT/view['mobile_view_path']
|
||||||
assert hashlib.sha256(path.read_bytes()).hexdigest()==view['mobile_view_sha256']
|
assert hashlib.sha256(path.read_bytes()).hexdigest()==view['mobile_view_sha256']
|
||||||
assets.append(dict(path=view['mobile_view_path'],sha256=view['mobile_view_sha256']))
|
assets.append(dict(path=view['mobile_view_path'],sha256=view['mobile_view_sha256']))
|
||||||
(PROJECT/'stages/08-scenes/r2/design-check.json').write_text(json.dumps(result,ensure_ascii=False,indent=2)+'\n',encoding='utf-8')
|
(PROJECT/'stages/08-scenes/r3/design-check.json').write_text(json.dumps(result,ensure_ascii=False,indent=2)+'\n',encoding='utf-8')
|
||||||
print('DESIGN_GREEN: 31 cuts, 30 boundaries, 38 captions, 6 actual samples')
|
print('DESIGN_GREEN: 31 cuts, 30 boundaries, 38 captions, 6 actual samples')
|
||||||
|
|||||||
@@ -6,9 +6,71 @@ from pathlib import Path
|
|||||||
import sys
|
import sys
|
||||||
import bpy
|
import bpy
|
||||||
import bmesh
|
import bmesh
|
||||||
|
import numpy as np
|
||||||
|
from mathutils import Vector
|
||||||
from bpy_extras.object_utils import world_to_camera_view
|
from bpy_extras.object_utils import world_to_camera_view
|
||||||
|
|
||||||
|
|
||||||
|
def containment(scene):
|
||||||
|
"""전체 프레임의 실제 mesh 정점을 물 영역·화면 윤곽과 대조한다."""
|
||||||
|
bpy.context.window.scene = scene
|
||||||
|
body = scene.objects['WaterCutawayBody']
|
||||||
|
deps = bpy.context.evaluated_depsgraph_get()
|
||||||
|
evaluated = body.evaluated_get(deps)
|
||||||
|
mesh = evaluated.to_mesh()
|
||||||
|
water = np.array([tuple(evaluated.matrix_world @ v.co) for v in mesh.vertices])
|
||||||
|
evaluated.to_mesh_clear()
|
||||||
|
low, high = water.min(axis=0), water.max(axis=0)
|
||||||
|
# 실제 물 표시 mesh에서 경계를 얻고 중심·별도 메타데이터만으로 판정하지 않는다.
|
||||||
|
origin = world_to_camera_view(scene,scene.camera,Vector((0,0,0)))
|
||||||
|
projection = np.array([tuple(world_to_camera_view(scene,scene.camera,Vector(b))-origin)[:2] for b in ((1,0,0),(0,1,0),(0,0,1))])
|
||||||
|
offset = np.array(tuple(origin)[:2])
|
||||||
|
screen = (water @ projection + offset) * (1080,1920)
|
||||||
|
points = sorted(set(map(tuple,screen)))
|
||||||
|
def cross(a,b,c):
|
||||||
|
return (b[0]-a[0])*(c[1]-a[1])-(b[1]-a[1])*(c[0]-a[0])
|
||||||
|
lower, upper = [], []
|
||||||
|
for chain, vertices in ((lower,points),(upper,reversed(points))):
|
||||||
|
for p in vertices:
|
||||||
|
while len(chain)>=2 and cross(chain[-2],chain[-1],p)<=0:
|
||||||
|
chain.pop()
|
||||||
|
chain.append(p)
|
||||||
|
hull = np.array(lower[:-1]+upper[:-1])
|
||||||
|
minimum = np.full(3,np.inf)
|
||||||
|
pixel_margin = float('inf')
|
||||||
|
vertex_count = 0
|
||||||
|
for logical in range(2468,3173):
|
||||||
|
scene.frame_set(logical+1)
|
||||||
|
deps = bpy.context.evaluated_depsgraph_get()
|
||||||
|
for obj in scene.objects:
|
||||||
|
role = obj.get('role')
|
||||||
|
if role not in ('atom','covalent','hydrogen_bond') or (role=='hydrogen_bond' and obj.scale.x<=.0011):
|
||||||
|
continue
|
||||||
|
evaluated = obj.evaluated_get(deps)
|
||||||
|
mesh = evaluated.to_mesh()
|
||||||
|
local = np.array([tuple(v.co) for v in mesh.vertices])
|
||||||
|
transform = np.array(evaluated.matrix_world)
|
||||||
|
vertices = local @ transform[:3,:3].T + transform[:3,3]
|
||||||
|
evaluated.to_mesh_clear()
|
||||||
|
margin = np.minimum(vertices-low,high-vertices).min(axis=0)
|
||||||
|
assert margin.min()>=.03, f'물 영역 밖 또는 여백 부족: F{logical} {obj.name}, 축 여백 {margin.tolist()}'
|
||||||
|
minimum = np.minimum(minimum,margin)
|
||||||
|
projected = (vertices @ projection + offset) * (1080,1920)
|
||||||
|
assert (projected.min(axis=0)>0).all() and (projected.max(axis=0)<(1080,1920)).all(), '분자 화면 잘림'
|
||||||
|
for a,b in zip(hull,np.roll(hull,-1,axis=0)):
|
||||||
|
edge = b-a
|
||||||
|
distance = (edge[0]*(projected[:,1]-a[1])-edge[1]*(projected[:,0]-a[0]))/np.linalg.norm(edge)
|
||||||
|
assert distance.min()>=0, f'파란 물 영역 투영 밖: F{logical} {obj.name}'
|
||||||
|
pixel_margin = min(pixel_margin,float(distance.min()))
|
||||||
|
vertex_count += len(vertices)
|
||||||
|
# 앞면과 윗면은 실제 열린 절개이며 물의 고체 껍질을 만들지 않는다.
|
||||||
|
assert len(body.data.polygons)==4, '물 절개 면 수 불일치'
|
||||||
|
for face in body.data.polygons:
|
||||||
|
points=np.array([tuple(body.matrix_world @ body.data.vertices[i].co) for i in face.vertices])
|
||||||
|
assert not np.allclose(points[:,1],low[1]) and not np.allclose(points[:,2],high[2]), '앞면·윗면 절개가 닫힘'
|
||||||
|
return dict(logical_frame_start=2468,logical_frame_end=3172,frames=705,water_bounds=[low.tolist(),high.tolist()],minimum_axis_margin=minimum.tolist(),minimum_projected_margin_px=pixel_margin,evaluated_vertices=vertex_count,mesh_roles=['atom','covalent','active_hydrogen_bond'],open_faces=['front','top'])
|
||||||
|
|
||||||
|
|
||||||
def verify(source):
|
def verify(source):
|
||||||
assert source.is_file(), "원본 파일 없음"
|
assert source.is_file(), "원본 파일 없음"
|
||||||
bpy.ops.wm.open_mainfile(filepath=str(source))
|
bpy.ops.wm.open_mainfile(filepath=str(source))
|
||||||
@@ -52,6 +114,7 @@ def verify(source):
|
|||||||
assert (pair.objects["PairB"].matrix_world.translation - before).length > .1, "실제 3D 이동 없음"
|
assert (pair.objects["PairB"].matrix_world.translation - before).length > .1, "실제 3D 이동 없음"
|
||||||
interface = bpy.data.scenes['Interface']
|
interface = bpy.data.scenes['Interface']
|
||||||
bpy.context.window.scene = interface
|
bpy.context.window.scene = interface
|
||||||
|
water_containment = containment(interface)
|
||||||
connection_sets, neighborhoods = [], []
|
connection_sets, neighborhoods = [], []
|
||||||
for frame in (2807,2907,3051):
|
for frame in (2807,2907,3051):
|
||||||
interface.frame_set(frame)
|
interface.frame_set(frame)
|
||||||
@@ -99,7 +162,7 @@ def verify(source):
|
|||||||
if obj.get("label"):
|
if obj.get("label"):
|
||||||
p = world_to_camera_view(scene, scene.camera, obj.matrix_world.translation)
|
p = world_to_camera_view(scene, scene.camera, obj.matrix_world.translation)
|
||||||
anchors[name]['labels'][obj["label"]] = {"x": round(p.x * 1080, 2), "y": round((1-p.y)*1920, 2), "depth": round(p.z, 2)}
|
anchors[name]['labels'][obj["label"]] = {"x": round(p.x * 1080, 2), "y": round((1-p.y)*1920, 2), "depth": round(p.z, 2)}
|
||||||
return {"source_sha256": hashlib.sha256(source.read_bytes()).hexdigest(), "blender_version": bpy.app.version_string, "scenes": checks, "interface_frames_blender":[2807,2907,3051], "interface_active_pairs":connection_sets,"interface_neighborhoods":neighborhoods,"volume_frames_blender": [3173,3223,3273,3323,3373], "volumes": volumes, "relative_volume_change": relative, "evaluated_scales": scales, "label_anchors": anchors, "text_baked": False, "physical_simulation": False}
|
return {"water_containment":water_containment,"source_sha256": hashlib.sha256(source.read_bytes()).hexdigest(), "blender_version": bpy.app.version_string, "scenes": checks, "interface_frames_blender":[2807,2907,3051], "interface_active_pairs":connection_sets,"interface_neighborhoods":neighborhoods,"volume_frames_blender": [3173,3223,3273,3323,3373], "volumes": volumes, "relative_volume_change": relative, "evaluated_scales": scales, "label_anchors": anchors, "text_baked": False, "physical_simulation": False}
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
/generated-source/
|
||||||
|
/render-attempts/
|
||||||
@@ -18,8 +18,509 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"payload": {
|
"payload": {
|
||||||
"scenes": [],
|
"scenes": [
|
||||||
"connections": [],
|
{
|
||||||
"preview": null
|
"cut_id": "c01",
|
||||||
|
"description": "작은 청색 물방울의 둥근 형태를 보여주며 그 모양이 생기는 이유를 질문한다.",
|
||||||
|
"start_state": "Scene=OpeningDroplet; F1. 작은 청색 물방울이 크림색 공간 중앙에 구형에 가깝게 떠 있고 부드러운 하이라이트가 표면의 입체감을 보여준다.",
|
||||||
|
"end_state": "Scene=OpeningDroplet; F220. 작은 물방울을 유지하고 오른쪽 위에 분자 확대의 위치를 표시하는 합성 주석 앵커를 제시한다.",
|
||||||
|
"camera": "정면보다 약간 위의 3D 전경, 중심 물방울; 다음 분자 확대는 새 Scene에서 제시한다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c02",
|
||||||
|
"description": "거시적인 물방울에서 물속 분자 수준의 설명으로 관심을 옮긴다.",
|
||||||
|
"start_state": "Scene=OpeningDroplet; F220. 작은 물방울을 유지하고 오른쪽 위에 분자 확대의 위치를 표시하는 합성 주석 앵커를 제시한다.",
|
||||||
|
"end_state": "Scene=OpeningDroplet; F397. 물방울과 확대 위치를 유지한 채 분자 설명으로 넘어갈 준비 상태다.",
|
||||||
|
"camera": "정면보다 약간 위의 3D 전경, 중심 물방울; 다음 분자 확대는 새 Scene에서 제시한다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c03",
|
||||||
|
"description": "물 분자가 산소 하나와 수소 둘로 이루어진 온전한 V자 구조임을 보여준다.",
|
||||||
|
"start_state": "Scene=SingleMolecule; F397. 산호색 O 구 하나·미색 H 구 둘·남색 O–H 원통 두 개의 V자 3D 분자; 주석은 합성용 앵커만 마련한다.",
|
||||||
|
"end_state": "Scene=SingleMolecule; F597. 온전한 V자 분자가 유지되고 산소 주석 앵커가 강조 위치에 있다.",
|
||||||
|
"camera": "3D 분자 근접, 약간 비스듬한 고정 카메라; 산소와 두 수소가 모두 가려지지 않는다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c04",
|
||||||
|
"description": "산소 쪽의 부분 음전하를 강조하며 물 분자 전체가 음이온인 것으로 표현하지 않는다.",
|
||||||
|
"start_state": "Scene=SingleMolecule; F597. 온전한 V자 분자가 유지되고 산소 주석 앵커가 강조 위치에 있다.",
|
||||||
|
"end_state": "Scene=SingleMolecule; F740. 분자 전체 중성을 유지하며 Oδ− 합성 주석 위치만 강조한다.",
|
||||||
|
"camera": "3D 분자 근접, 약간 비스듬한 고정 카메라; 산소와 두 수소가 모두 가려지지 않는다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c05",
|
||||||
|
"description": "수소 쪽의 부분 양전하를 산소 쪽과 구별하며 분자 전체의 중성은 유지한다.",
|
||||||
|
"start_state": "Scene=SingleMolecule; F740. 분자 전체 중성을 유지하며 Oδ− 합성 주석 위치만 강조한다.",
|
||||||
|
"end_state": "Scene=SingleMolecule; F905. Oδ− 및 Hδ+ 합성 앵커가 모두 마련되며 원자 분리·전체 이온 표시는 없다.",
|
||||||
|
"camera": "3D 분자 근접, 약간 비스듬한 고정 카메라; 산소와 두 수소가 모두 가려지지 않는다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c06",
|
||||||
|
"description": "한 물 분자의 수소와 이웃 물 분자의 산소가 끌림의 양 끝이라는 관계를 보여준다.",
|
||||||
|
"start_state": "Scene=BondPair; F905. PairA=(-1.8,0,-0.3), PairB=(1.65,0.15,0.45). 두 온전한 V자 분자의 내부 남색 실선과 서로 다른 분자 H···O 금색 분절 원통을 구별한다.",
|
||||||
|
"end_state": "Scene=BondPair; F1018. Blender F1018에서 PairA=(-1.8,0,-0.3), PairB=(1.65,0.15,0.45); H···O 점선의 양 끝이 실제 H/O 위치에 대응한다.",
|
||||||
|
"camera": "실제 대표 Scene BondPair. 정면 위쪽 직교 카메라 (0,-12,6), ortho_scale=11.5; 내부 실선과 분자간 점선을 한 화면에 읽는다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c07",
|
||||||
|
"description": "두 온전한 분자가 가까워지며 분자 사이 H···O 점선 길이가 줄고 내부 O–H 실선은 유지된다.",
|
||||||
|
"start_state": "Scene=BondPair; F1018. Blender F1018에서 PairA=(-1.8,0,-0.3), PairB=(1.65,0.15,0.45); H···O 점선의 양 끝이 실제 H/O 위치에 대응한다.",
|
||||||
|
"end_state": "Scene=BondPair; F1220. Blender F1220에서 PairB=(0.85,0.15,0.45)로 가까워져 H···O 점선 길이가 줄었다. 내부 O–H 실선 두 개씩은 그대로다.",
|
||||||
|
"camera": "실제 대표 Scene BondPair. 정면 위쪽 직교 카메라 (0,-12,6), ortho_scale=11.5; 내부 실선과 분자간 점선을 한 화면에 읽는다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c08",
|
||||||
|
"description": "서로 다른 분자의 H···O 사이 끌림에 수소결합이라는 이름을 연결한다.",
|
||||||
|
"start_state": "Scene=BondPair; F1220. Blender F1220에서 PairB=(0.85,0.15,0.45)로 가까워져 H···O 점선 길이가 줄었다. 내부 O–H 실선 두 개씩은 그대로다.",
|
||||||
|
"end_state": "Scene=BondPair; F1425. 같은 두 V자 분자·같은 카메라·금색 H···O 점선 유지; 수소결합 명칭은 합성 단계에서 별도로 배치한다.",
|
||||||
|
"camera": "실제 대표 Scene BondPair. 정면 위쪽 직교 카메라 (0,-12,6), ortho_scale=11.5; 내부 실선과 분자간 점선을 한 화면에 읽는다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c09",
|
||||||
|
"description": "한 분자 내부의 O–H 실선과 분자 사이의 H···O 점선을 동시에 보여 두 결합을 구별한다.",
|
||||||
|
"start_state": "Scene=BondPair; F1425. 같은 두 V자 분자·같은 카메라·금색 H···O 점선 유지; 수소결합 명칭은 합성 단계에서 별도로 배치한다.",
|
||||||
|
"end_state": "Scene=BondPair; F1637. 같은 두 분자의 남색 내부 O–H 실선과 금색 분자간 H···O 점선이 동시에 보이고 모든 원자는 원래 분자에 남아 있다.",
|
||||||
|
"camera": "실제 대표 Scene BondPair. 정면 위쪽 직교 카메라 (0,-12,6), ortho_scale=11.5; 내부 실선과 분자간 점선을 한 화면에 읽는다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c10",
|
||||||
|
"description": "불규칙한 액체 분자 집단으로 범위를 넓혀 수소결합이 영구적인 끈은 아님을 설명한다.",
|
||||||
|
"start_state": "Scene=LiquidNetwork; F1637. 여러 온전한 V자 분자가 불규칙한 위치·방향에 있고 서로 다른 수의 금색 분자간 연결이 보인다.",
|
||||||
|
"end_state": "Scene=LiquidNetwork; F1779. 분자 전체가 소폭 이동하는 동안 일부 H···O 점선 연결이 사라질 준비 상태; 내부 실선은 유지된다.",
|
||||||
|
"camera": "불규칙한 3D 액체 분자 집단 근접. 고정 격자 대신 깊이·방향을 달리하고 카메라는 유지한다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c11",
|
||||||
|
"description": "온전한 분자들이 소폭 움직이며 일부 이웃 사이 연결이 사라지고 새 연결이 생기는 과정을 보여준다.",
|
||||||
|
"start_state": "Scene=LiquidNetwork; F1779. 분자 전체가 소폭 이동하는 동안 일부 H···O 점선 연결이 사라질 준비 상태; 내부 실선은 유지된다.",
|
||||||
|
"end_state": "Scene=LiquidNetwork; F2019. 첫 H···O 점선 쌍이 사라지고 다른 분자 쌍의 점선이 나타난다. 원자 분리나 화학 반응은 없다.",
|
||||||
|
"camera": "불규칙한 3D 액체 분자 집단 근접. 고정 격자 대신 깊이·방향을 달리하고 카메라는 유지한다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c12",
|
||||||
|
"description": "수소결합 연결이 반복해서 바뀌어 액체의 이웃 관계가 고정된 격자가 아님을 보여준다.",
|
||||||
|
"start_state": "Scene=LiquidNetwork; F2019. 첫 H···O 점선 쌍이 사라지고 다른 분자 쌍의 점선이 나타난다. 원자 분리나 화학 반응은 없다.",
|
||||||
|
"end_state": "Scene=LiquidNetwork; F2257. 새 이웃과의 H···O 연결이 보이며 분자마다 연결 수·방향이 다르다. 영구 끈·정지 격자는 없다.",
|
||||||
|
"camera": "불규칙한 3D 액체 분자 집단 근접. 고정 격자 대신 깊이·방향을 달리하고 카메라는 유지한다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c13",
|
||||||
|
"description": "많은 분자 사이의 끌림이 물끼리 함께 뭉치려는 응집 성질에 기여함을 연결한다.",
|
||||||
|
"start_state": "Scene=LiquidNetwork; F2257. 새 이웃과의 H···O 연결이 보이며 분자마다 연결 수·방향이 다르다. 영구 끈·정지 격자는 없다.",
|
||||||
|
"end_state": "Scene=LiquidNetwork; F2469. 불규칙한 집단을 유지하며 분자 사이의 응집이 거시적 물의 뭉침에 기여함을 다음 경계 모형으로 연결한다.",
|
||||||
|
"camera": "불규칙한 3D 액체 분자 집단 근접. 고정 격자 대신 깊이·방향을 달리하고 카메라는 유지한다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c14",
|
||||||
|
"description": "청색 물 체적과 위쪽 공기가 만나는 경계를 절개 설명 모형으로 제시한다.",
|
||||||
|
"start_state": "Scene=Interface; F2469. 아래쪽 청색 물 체적과 위쪽 공기 공간이 보이며 실제 청색 물 영역 안에 불규칙한 물 분자가 모두 포함된다. 공기 이름은 추후 합성한다.",
|
||||||
|
"end_state": "Scene=Interface; F2605. 물-공기 경계를 유지하고 안쪽 Liquid4 주변의 다양한 이웃이 보이도록 근접 강조를 시작한다.",
|
||||||
|
"camera": "실제 대표 Scene Interface. 실제 물 경계 x=[-2.85,2.85], y=[-0.85,1.35], z=[-3.15,0.80] 안에 전체 원자·결합을 포함하고 앞면·윗면을 연 절개 설명 모형, 카메라 (0,-14,6), ortho_scale=13. 색 경계에 고체막을 추가하지 않는다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c15",
|
||||||
|
"description": "물 안쪽 분자를 강조해 여러 방향에 다른 물 분자 이웃이 있다는 환경을 보여준다.",
|
||||||
|
"start_state": "Scene=Interface; F2605. 물-공기 경계를 유지하고 안쪽 Liquid4 주변의 다양한 이웃이 보이도록 근접 강조를 시작한다.",
|
||||||
|
"end_state": "Scene=Interface; F2807. Blender F2807에서 Liquid4 안쪽 강조고리 scale=1, Liquid1 표면 강조고리 scale=0.01. 안쪽은 위·아래·옆에 이웃 물 분자가 있다.",
|
||||||
|
"camera": "실제 대표 Scene Interface. 실제 물 경계 x=[-2.85,2.85], y=[-0.85,1.35], z=[-3.15,0.80] 안에 전체 원자·결합을 포함하고 앞면·윗면을 연 절개 설명 모형, 카메라 (0,-14,6), ortho_scale=13. 색 경계에 고체막을 추가하지 않는다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c16",
|
||||||
|
"description": "강조 대상을 물 안쪽에서 표면으로 옮겨 공기 방향에는 액체 물 분자 이웃이 적다는 차이를 보여준다.",
|
||||||
|
"start_state": "Scene=Interface; F2807. Blender F2807에서 Liquid4 안쪽 강조고리 scale=1, Liquid1 표면 강조고리 scale=0.01. 안쪽은 위·아래·옆에 이웃 물 분자가 있다.",
|
||||||
|
"end_state": "Scene=Interface; F3051. Blender F3051에서 안쪽 강조는 작아지고 Liquid1 표면 강조고리 scale=1. 표면보다 위 공기 쪽에는 액체 물 이웃을 배치하지 않는다; 별도 막은 없다.",
|
||||||
|
"camera": "실제 대표 Scene Interface. 실제 물 경계 x=[-2.85,2.85], y=[-0.85,1.35], z=[-3.15,0.80] 안에 전체 원자·결합을 포함하고 앞면·윗면을 연 절개 설명 모형, 카메라 (0,-14,6), ortho_scale=13. 색 경계에 고체막을 추가하지 않는다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c17",
|
||||||
|
"description": "내부와 표면의 불규칙한 분자 배치를 유지해 액체 이웃 환경의 차이를 비교한다.",
|
||||||
|
"start_state": "Scene=Interface; F3051. Blender F3051에서 안쪽 강조는 작아지고 Liquid1 표면 강조고리 scale=1. 표면보다 위 공기 쪽에는 액체 물 이웃을 배치하지 않는다; 별도 막은 없다.",
|
||||||
|
"end_state": "Scene=Interface; F3173. 안쪽과 표면의 환경 차이가 보이는 불규칙한 분자 배치 유지. 공기는 단순화한 공간이며 진공이나 수증기 부재 주장이 아니다.",
|
||||||
|
"camera": "실제 대표 Scene Interface. 실제 물 경계 x=[-2.85,2.85], y=[-0.85,1.35], z=[-3.15,0.80] 안에 전체 원자·결합을 포함하고 앞면·윗면을 연 절개 설명 모형, 카메라 (0,-14,6), ortho_scale=13. 색 경계에 고체막을 추가하지 않는다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c18",
|
||||||
|
"description": "같은 부피의 닫힌 물방울을 길게 변형해 표면을 넓히는 과정을 입체로 보여준다.",
|
||||||
|
"start_state": "Scene=DropletStretch; F3173. Blender F3173의 닫힌 Droplet mesh scale=(1,1,1); 부드러운 청색 구형 물방울. 물의 양은 같은 조건이다.",
|
||||||
|
"end_state": "Scene=DropletStretch; F3373. Blender F3373의 Droplet scale=(1.85,1/sqrt(1.85),1/sqrt(1.85)); 같은 부피를 유지하며 좌우로 길어지고 표면이 넓어지는 설명용 변형이다.",
|
||||||
|
"camera": "실제 대표 Scene DropletStretch. 닫힌 청색 3D mesh, (0,-12,5) 직교 카메라 ortho_scale=10.5. 같은 물의 양·설명용 모형 합성 앵커, 표면층 없음."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c19",
|
||||||
|
"description": "같은 물의 양으로 길어진 모형을 유지하며 표면을 더 넓히는 데 에너지가 필요함을 설명한다.",
|
||||||
|
"start_state": "Scene=DropletStretch; F3373. Blender F3373의 Droplet scale=(1.85,1/sqrt(1.85),1/sqrt(1.85)); 같은 부피를 유지하며 좌우로 길어지고 표면이 넓어지는 설명용 변형이다.",
|
||||||
|
"end_state": "Scene=DropletStretch; F3542. 길어진 같은 부피 물방울 유지; 에너지 필요 주석을 추후 합성한다. 실제 힘·에너지 수치는 표시하지 않는다.",
|
||||||
|
"camera": "실제 대표 Scene DropletStretch. 닫힌 청색 3D mesh, (0,-12,5) 직교 카메라 ortho_scale=10.5. 같은 물의 양·설명용 모형 합성 앵커, 표면층 없음."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c20",
|
||||||
|
"description": "같은 부피의 물방울이 표면 넓이를 줄이는 쪽으로 모양을 바꾸려는 경향을 연결한다.",
|
||||||
|
"start_state": "Scene=DropletStretch; F3542. 길어진 같은 부피 물방울 유지; 에너지 필요 주석을 추후 합성한다. 실제 힘·에너지 수치는 표시하지 않는다.",
|
||||||
|
"end_state": "Scene=DropletStretch; F3657. 같은 부피 물방울이 되돌아갈 준비 상태이며 물 표면의 확장 저항을 설명한다.",
|
||||||
|
"camera": "실제 대표 Scene DropletStretch. 닫힌 청색 3D mesh, (0,-12,5) 직교 카메라 ortho_scale=10.5. 같은 물의 양·설명용 모형 합성 앵커, 표면층 없음."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c21",
|
||||||
|
"description": "길어진 물방울이 같은 부피를 유지하며 구형에 가까워지는 계획으로 표면을 줄이는 변화를 보여준다.",
|
||||||
|
"start_state": "Scene=DropletStretch; F3657. 같은 부피 물방울이 되돌아갈 준비 상태이며 물 표면의 확장 저항을 설명한다.",
|
||||||
|
"end_state": "Scene=DropletStretch; F3853. 같은 부피의 닫힌 mesh가 구형에 가깝게 복귀한다. 복귀 애니메이션은 scenes 승인 후 정식 제작한다.",
|
||||||
|
"camera": "실제 대표 Scene DropletStretch. 닫힌 청색 3D mesh, (0,-12,5) 직교 카메라 ortho_scale=10.5. 같은 물의 양·설명용 모형 합성 앵커, 표면층 없음."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c22",
|
||||||
|
"description": "물 표면이 넓어지는 데 저항하는 성질을 표면장력이라는 이름과 연결한다.",
|
||||||
|
"start_state": "Scene=DropletStretch; F3853. 같은 부피의 닫힌 mesh가 구형에 가깝게 복귀한다. 복귀 애니메이션은 scenes 승인 후 정식 제작한다.",
|
||||||
|
"end_state": "Scene=DropletStretch; F4077. 구형에 가까운 물방울과 표면 확장 저항 설명이 남는다. 껍질·고체 표면층은 없다.",
|
||||||
|
"camera": "실제 대표 Scene DropletStretch. 닫힌 청색 3D mesh, (0,-12,5) 직교 카메라 ortho_scale=10.5. 같은 물의 양·설명용 모형 합성 앵커, 표면층 없음."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c23",
|
||||||
|
"description": "길어진 물방울과 둥근 물방울의 모양을 같은 물의 양이라는 공통 조건에서 비교한다.",
|
||||||
|
"start_state": "Scene=EqualVolumeComparison; F4077. 왼쪽 길어진 닫힌 물방울과 오른쪽 구형 물방울을 동일 부피 조건으로 나란히 배치한다.",
|
||||||
|
"end_state": "Scene=EqualVolumeComparison; F4149. 같은 물의 양 주석 앵커를 유지하며 두 형태의 겉면 차이를 보여준다.",
|
||||||
|
"camera": "3D 비교 전경, 좌우 모형을 같은 카메라·같은 물의 양으로 비교한다. 수치·픽셀면적 비교 없음."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c24",
|
||||||
|
"description": "같은 부피일 때 구형이 겉면을 가장 작게 만드는 관계를 두 입체 모형으로 보여준다.",
|
||||||
|
"start_state": "Scene=EqualVolumeComparison; F4149. 같은 물의 양 주석 앵커를 유지하며 두 형태의 겉면 차이를 보여준다.",
|
||||||
|
"end_state": "Scene=EqualVolumeComparison; F4370. 같은 부피에서 구형의 표면적이 작다는 관계를 청색 형태와 합성 주석으로 강조한다.",
|
||||||
|
"camera": "3D 비교 전경, 좌우 모형을 같은 카메라·같은 물의 양으로 비교한다. 수치·픽셀면적 비교 없음."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c25",
|
||||||
|
"description": "외부 영향이 작은 작은 물방울이 구형에 가까워지는 조건을 제시한다.",
|
||||||
|
"start_state": "Scene=ShapeConditions; F4370. 작은 비접촉 물방울과 더 큰 바닥 접촉 물방울을 별도의 조건 예시로 배치한다. 이 컷은 동일 부피 비교가 아니다.",
|
||||||
|
"end_state": "Scene=ShapeConditions; F4577. 외부 영향이 작은 작은 물방울이 구형에 가깝고 오른쪽 방울은 바닥과 접촉해 모양이 달라지는 예시다.",
|
||||||
|
"camera": "조건 예시 3D 전경, 왼쪽 작은 비접촉 방울과 오른쪽 바닥에 닿은 큰 방울. 앞 비교와 별도 Scene."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c26",
|
||||||
|
"description": "작은 비접촉 방울과 큰 바닥 접촉 방울을 별도 조건 예시로 구별한다.",
|
||||||
|
"start_state": "Scene=ShapeConditions; F4577. 외부 영향이 작은 작은 물방울이 구형에 가깝고 오른쪽 방울은 바닥과 접촉해 모양이 달라지는 예시다.",
|
||||||
|
"end_state": "Scene=ShapeConditions; F4809. 바닥 접촉 방울의 납작한 형태가 보이며 중력·접촉면 영향의 조건 주석 앵커가 있다.",
|
||||||
|
"camera": "조건 예시 3D 전경, 왼쪽 작은 비접촉 방울과 오른쪽 바닥에 닿은 큰 방울. 앞 비교와 별도 Scene."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c27",
|
||||||
|
"description": "바닥 접촉과 외부 영향으로 실제 물방울의 모양이 달라질 수 있음을 보여준다.",
|
||||||
|
"start_state": "Scene=ShapeConditions; F4809. 바닥 접촉 방울의 납작한 형태가 보이며 중력·접촉면 영향의 조건 주석 앵커가 있다.",
|
||||||
|
"end_state": "Scene=ShapeConditions; F4889. 두 조건 예시를 유지한다. 항상 완전한 구라는 단정·접촉각이나 크기 경계값은 없다.",
|
||||||
|
"camera": "조건 예시 3D 전경, 왼쪽 작은 비접촉 방울과 오른쪽 바닥에 닿은 큰 방울. 앞 비교와 별도 Scene."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c28",
|
||||||
|
"description": "작은 청색 물방울로 돌아와 그 주변에 별도 고체 껍질이나 막이 없음을 보여준다.",
|
||||||
|
"start_state": "Scene=AnswerDroplet; F4889. 구형에 가까운 청색 물방울과 분리된 분자 개념도 위치가 보인다. 물방울 주변에 별도 껍질은 없다.",
|
||||||
|
"end_state": "Scene=AnswerDroplet; F5100. 동일 물방울 표면을 유지하며 추가 막이 없음을 보여준다.",
|
||||||
|
"camera": "도입과 같은 크림색 3D 공간·청색 방울 전경을 새 Scene에서 재제시하고 분자 개념도를 별도 위치에 둔다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c29",
|
||||||
|
"description": "분자 개념도에서 이웃 분자 사이 수소결합을 회수하며 원자와 내부 결합은 유지한다.",
|
||||||
|
"start_state": "Scene=AnswerDroplet; F5100. 동일 물방울 표면을 유지하며 추가 막이 없음을 보여준다.",
|
||||||
|
"end_state": "Scene=AnswerDroplet; F5229. 별도 분자 개념도에서 온전한 V자 분자 사이 금색 H···O 점선이 변하고 내부 남색 실선은 유지된다.",
|
||||||
|
"camera": "도입과 같은 크림색 3D 공간·청색 방울 전경을 새 Scene에서 재제시하고 분자 개념도를 별도 위치에 둔다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c30",
|
||||||
|
"description": "물방울과 분자 개념도를 함께 유지해 표면을 넓히기 어려운 성질을 답의 원인으로 연결한다.",
|
||||||
|
"start_state": "Scene=AnswerDroplet; F5229. 별도 분자 개념도에서 온전한 V자 분자 사이 금색 H···O 점선이 변하고 내부 남색 실선은 유지된다.",
|
||||||
|
"end_state": "Scene=AnswerDroplet; F5369. 물방울과 분자 개념도를 유지하며 표면을 넓히기 어려운 성질을 합성 주석으로 회수한다.",
|
||||||
|
"camera": "도입과 같은 크림색 3D 공간·청색 방울 전경을 새 Scene에서 재제시하고 분자 개념도를 별도 위치에 둔다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c31",
|
||||||
|
"description": "분자 사이 끌림과 표면장력이 외부 영향이 작은 작은 물방울의 둥근 형태를 만든다는 답을 회수한다.",
|
||||||
|
"start_state": "Scene=AnswerDroplet; F5369. 물방울과 분자 개념도를 유지하며 표면을 넓히기 어려운 성질을 합성 주석으로 회수한다.",
|
||||||
|
"end_state": "Scene=AnswerDroplet; F5529. 외부 영향이 작은 작은 물방울의 둥근 형태와 수소결합·표면장력의 설명이 함께 남아 도입 질문에 답한다.",
|
||||||
|
"camera": "도입과 같은 크림색 3D 공간·청색 방울 전경을 새 Scene에서 재제시하고 분자 개념도를 별도 위치에 둔다."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"connections": [
|
||||||
|
{
|
||||||
|
"from_cut_id": "c01",
|
||||||
|
"to_cut_id": "c02",
|
||||||
|
"mode": "continuous",
|
||||||
|
"reason": "동일 Scene·논리 경계 프레임·물체·카메라 상태를 공유하며 설명의 다음 변화를 잇는다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_cut_id": "c02",
|
||||||
|
"to_cut_id": "c03",
|
||||||
|
"mode": "cut",
|
||||||
|
"reason": "설명 범위·조건·시점 전환으로 OpeningDroplet에서 별도 SingleMolecule Scene으로 전환한다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_cut_id": "c03",
|
||||||
|
"to_cut_id": "c04",
|
||||||
|
"mode": "continuous",
|
||||||
|
"reason": "동일 Scene·논리 경계 프레임·물체·카메라 상태를 공유하며 설명의 다음 변화를 잇는다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_cut_id": "c04",
|
||||||
|
"to_cut_id": "c05",
|
||||||
|
"mode": "continuous",
|
||||||
|
"reason": "동일 Scene·논리 경계 프레임·물체·카메라 상태를 공유하며 설명의 다음 변화를 잇는다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_cut_id": "c05",
|
||||||
|
"to_cut_id": "c06",
|
||||||
|
"mode": "cut",
|
||||||
|
"reason": "설명 범위·조건·시점 전환으로 SingleMolecule에서 별도 BondPair Scene으로 전환한다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_cut_id": "c06",
|
||||||
|
"to_cut_id": "c07",
|
||||||
|
"mode": "continuous",
|
||||||
|
"reason": "동일 Scene·논리 경계 프레임·물체·카메라 상태를 공유하며 설명의 다음 변화를 잇는다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_cut_id": "c07",
|
||||||
|
"to_cut_id": "c08",
|
||||||
|
"mode": "continuous",
|
||||||
|
"reason": "동일 Scene·논리 경계 프레임·물체·카메라 상태를 공유하며 설명의 다음 변화를 잇는다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_cut_id": "c08",
|
||||||
|
"to_cut_id": "c09",
|
||||||
|
"mode": "continuous",
|
||||||
|
"reason": "동일 Scene·논리 경계 프레임·물체·카메라 상태를 공유하며 설명의 다음 변화를 잇는다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_cut_id": "c09",
|
||||||
|
"to_cut_id": "c10",
|
||||||
|
"mode": "cut",
|
||||||
|
"reason": "설명 범위·조건·시점 전환으로 BondPair에서 별도 LiquidNetwork Scene으로 전환한다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_cut_id": "c10",
|
||||||
|
"to_cut_id": "c11",
|
||||||
|
"mode": "continuous",
|
||||||
|
"reason": "동일 Scene·논리 경계 프레임·물체·카메라 상태를 공유하며 설명의 다음 변화를 잇는다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_cut_id": "c11",
|
||||||
|
"to_cut_id": "c12",
|
||||||
|
"mode": "continuous",
|
||||||
|
"reason": "동일 Scene·논리 경계 프레임·물체·카메라 상태를 공유하며 설명의 다음 변화를 잇는다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_cut_id": "c12",
|
||||||
|
"to_cut_id": "c13",
|
||||||
|
"mode": "continuous",
|
||||||
|
"reason": "동일 Scene·논리 경계 프레임·물체·카메라 상태를 공유하며 설명의 다음 변화를 잇는다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_cut_id": "c13",
|
||||||
|
"to_cut_id": "c14",
|
||||||
|
"mode": "cut",
|
||||||
|
"reason": "설명 범위·조건·시점 전환으로 LiquidNetwork에서 별도 Interface Scene으로 전환한다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_cut_id": "c14",
|
||||||
|
"to_cut_id": "c15",
|
||||||
|
"mode": "continuous",
|
||||||
|
"reason": "동일 Scene·논리 경계 프레임·물체·카메라 상태를 공유하며 설명의 다음 변화를 잇는다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_cut_id": "c15",
|
||||||
|
"to_cut_id": "c16",
|
||||||
|
"mode": "continuous",
|
||||||
|
"reason": "동일 Scene·논리 경계 프레임·물체·카메라 상태를 공유하며 설명의 다음 변화를 잇는다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_cut_id": "c16",
|
||||||
|
"to_cut_id": "c17",
|
||||||
|
"mode": "continuous",
|
||||||
|
"reason": "동일 Scene·논리 경계 프레임·물체·카메라 상태를 공유하며 설명의 다음 변화를 잇는다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_cut_id": "c17",
|
||||||
|
"to_cut_id": "c18",
|
||||||
|
"mode": "cut",
|
||||||
|
"reason": "설명 범위·조건·시점 전환으로 Interface에서 별도 DropletStretch Scene으로 전환한다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_cut_id": "c18",
|
||||||
|
"to_cut_id": "c19",
|
||||||
|
"mode": "continuous",
|
||||||
|
"reason": "동일 Scene·논리 경계 프레임·물체·카메라 상태를 공유하며 설명의 다음 변화를 잇는다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_cut_id": "c19",
|
||||||
|
"to_cut_id": "c20",
|
||||||
|
"mode": "continuous",
|
||||||
|
"reason": "동일 Scene·논리 경계 프레임·물체·카메라 상태를 공유하며 설명의 다음 변화를 잇는다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_cut_id": "c20",
|
||||||
|
"to_cut_id": "c21",
|
||||||
|
"mode": "continuous",
|
||||||
|
"reason": "동일 Scene·논리 경계 프레임·물체·카메라 상태를 공유하며 설명의 다음 변화를 잇는다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_cut_id": "c21",
|
||||||
|
"to_cut_id": "c22",
|
||||||
|
"mode": "continuous",
|
||||||
|
"reason": "동일 Scene·논리 경계 프레임·물체·카메라 상태를 공유하며 설명의 다음 변화를 잇는다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_cut_id": "c22",
|
||||||
|
"to_cut_id": "c23",
|
||||||
|
"mode": "cut",
|
||||||
|
"reason": "설명 범위·조건·시점 전환으로 DropletStretch에서 별도 EqualVolumeComparison Scene으로 전환한다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_cut_id": "c23",
|
||||||
|
"to_cut_id": "c24",
|
||||||
|
"mode": "continuous",
|
||||||
|
"reason": "동일 Scene·논리 경계 프레임·물체·카메라 상태를 공유하며 설명의 다음 변화를 잇는다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_cut_id": "c24",
|
||||||
|
"to_cut_id": "c25",
|
||||||
|
"mode": "cut",
|
||||||
|
"reason": "설명 범위·조건·시점 전환으로 EqualVolumeComparison에서 별도 ShapeConditions Scene으로 전환한다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_cut_id": "c25",
|
||||||
|
"to_cut_id": "c26",
|
||||||
|
"mode": "continuous",
|
||||||
|
"reason": "동일 Scene·논리 경계 프레임·물체·카메라 상태를 공유하며 설명의 다음 변화를 잇는다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_cut_id": "c26",
|
||||||
|
"to_cut_id": "c27",
|
||||||
|
"mode": "continuous",
|
||||||
|
"reason": "동일 Scene·논리 경계 프레임·물체·카메라 상태를 공유하며 설명의 다음 변화를 잇는다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_cut_id": "c27",
|
||||||
|
"to_cut_id": "c28",
|
||||||
|
"mode": "cut",
|
||||||
|
"reason": "설명 범위·조건·시점 전환으로 ShapeConditions에서 별도 AnswerDroplet Scene으로 전환한다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_cut_id": "c28",
|
||||||
|
"to_cut_id": "c29",
|
||||||
|
"mode": "continuous",
|
||||||
|
"reason": "동일 Scene·논리 경계 프레임·물체·카메라 상태를 공유하며 설명의 다음 변화를 잇는다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_cut_id": "c29",
|
||||||
|
"to_cut_id": "c30",
|
||||||
|
"mode": "continuous",
|
||||||
|
"reason": "동일 Scene·논리 경계 프레임·물체·카메라 상태를 공유하며 설명의 다음 변화를 잇는다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from_cut_id": "c30",
|
||||||
|
"to_cut_id": "c31",
|
||||||
|
"mode": "continuous",
|
||||||
|
"reason": "동일 Scene·논리 경계 프레임·물체·카메라 상태를 공유하며 설명의 다음 변화를 잇는다."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"preview": {
|
||||||
|
"scene_file": {
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/generated-source/preview.blend",
|
||||||
|
"verified": true,
|
||||||
|
"sha256": "ba0850a2148824cc8416704c03f14e5714ca01a16620a4eb26981e238af78c73",
|
||||||
|
"blender_version": "5.2.2 LTS"
|
||||||
|
},
|
||||||
|
"render_profile": {
|
||||||
|
"engine": "BLENDER_EEVEE",
|
||||||
|
"device": "GPU",
|
||||||
|
"fps": 50,
|
||||||
|
"width": 1080,
|
||||||
|
"height": 1920,
|
||||||
|
"samples": 64,
|
||||||
|
"seed": 0
|
||||||
|
},
|
||||||
|
"samples": [
|
||||||
|
{
|
||||||
|
"id": "c16-image",
|
||||||
|
"cut_ids": [
|
||||||
|
"c16"
|
||||||
|
],
|
||||||
|
"media": {
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/11205a80f142fff0-8a4233b821a3/frame-00003050.png",
|
||||||
|
"kind": "image",
|
||||||
|
"verified": true,
|
||||||
|
"duration_ms": null,
|
||||||
|
"width": 1080,
|
||||||
|
"height": 1920
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "c07-image",
|
||||||
|
"cut_ids": [
|
||||||
|
"c07"
|
||||||
|
],
|
||||||
|
"media": {
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/55c4cb5b4dd88ff3-69267d17d19b/frame-00001219.png",
|
||||||
|
"kind": "image",
|
||||||
|
"verified": true,
|
||||||
|
"duration_ms": null,
|
||||||
|
"width": 1080,
|
||||||
|
"height": 1920
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "c18-image",
|
||||||
|
"cut_ids": [
|
||||||
|
"c18"
|
||||||
|
],
|
||||||
|
"media": {
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/9347ba3e949e9407-0ed92949aacd/frame-00003372.png",
|
||||||
|
"kind": "image",
|
||||||
|
"verified": true,
|
||||||
|
"duration_ms": null,
|
||||||
|
"width": 1080,
|
||||||
|
"height": 1920
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "c07-video",
|
||||||
|
"cut_ids": [
|
||||||
|
"c07"
|
||||||
|
],
|
||||||
|
"media": {
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/ade2a043a51a3c9f-855ff69849d6/clip.mp4",
|
||||||
|
"kind": "video",
|
||||||
|
"verified": true,
|
||||||
|
"duration_ms": 4040,
|
||||||
|
"width": 1080,
|
||||||
|
"height": 1920
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "c16-video",
|
||||||
|
"cut_ids": [
|
||||||
|
"c16"
|
||||||
|
],
|
||||||
|
"media": {
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/9af0672466949ffe-e876251fcde8/clip.mp4",
|
||||||
|
"kind": "video",
|
||||||
|
"verified": true,
|
||||||
|
"duration_ms": 4880,
|
||||||
|
"width": 1080,
|
||||||
|
"height": 1920
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "c18-video",
|
||||||
|
"cut_ids": [
|
||||||
|
"c18"
|
||||||
|
],
|
||||||
|
"media": {
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/c152ea48087b78fb-dc5644146e6c/clip.mp4",
|
||||||
|
"kind": "video",
|
||||||
|
"verified": true,
|
||||||
|
"duration_ms": 4000,
|
||||||
|
"width": 1080,
|
||||||
|
"height": 1920
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,410 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"command": [
|
||||||
|
"C:/Users/baram/anaconda3/python.exe",
|
||||||
|
"-B",
|
||||||
|
"-X",
|
||||||
|
"utf8",
|
||||||
|
"tools/blender/run.py",
|
||||||
|
"inspect",
|
||||||
|
"--blender",
|
||||||
|
"C:/Program Files/Blender Foundation/Blender 5.2/blender.exe",
|
||||||
|
"--source",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/generated-source/preview.blend",
|
||||||
|
"--scene",
|
||||||
|
"Interface",
|
||||||
|
"--require-object",
|
||||||
|
"WaterCutawayBody"
|
||||||
|
],
|
||||||
|
"exit_code": 0,
|
||||||
|
"source_sha256": "ba0850a2148824cc8416704c03f14e5714ca01a16620a4eb26981e238af78c73",
|
||||||
|
"scene_name": "Interface"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": [
|
||||||
|
"C:/Users/baram/anaconda3/python.exe",
|
||||||
|
"-B",
|
||||||
|
"-X",
|
||||||
|
"utf8",
|
||||||
|
"tools/blender/run.py",
|
||||||
|
"render",
|
||||||
|
"--mode",
|
||||||
|
"preview",
|
||||||
|
"--project",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/project.json",
|
||||||
|
"--artifact",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/artifact.json",
|
||||||
|
"--output-revision",
|
||||||
|
"3",
|
||||||
|
"--blender",
|
||||||
|
"C:/Program Files/Blender Foundation/Blender 5.2/blender.exe",
|
||||||
|
"--source",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/generated-source/preview.blend",
|
||||||
|
"--scene",
|
||||||
|
"Interface",
|
||||||
|
"--require-object",
|
||||||
|
"WaterCutawayBody",
|
||||||
|
"--cut-id",
|
||||||
|
"c16",
|
||||||
|
"--ffmpeg",
|
||||||
|
"C:\\git\\ShortVideoGenerator\\projects\\water-hydrogen-bond-surface-tension\\renderer\\node_modules\\@remotion\\compositor-win32-x64-msvc\\ffmpeg.exe",
|
||||||
|
"--ffprobe",
|
||||||
|
"C:\\git\\ShortVideoGenerator\\projects\\water-hydrogen-bond-surface-tension\\renderer\\node_modules\\@remotion\\compositor-win32-x64-msvc\\ffprobe.exe",
|
||||||
|
"--frame",
|
||||||
|
"3050"
|
||||||
|
],
|
||||||
|
"exit_code": 0,
|
||||||
|
"source_sha256": "ba0850a2148824cc8416704c03f14e5714ca01a16620a4eb26981e238af78c73",
|
||||||
|
"scene_name": "Interface",
|
||||||
|
"media": {
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/11205a80f142fff0-8a4233b821a3/frame-00003050.png",
|
||||||
|
"kind": "image",
|
||||||
|
"verified": true,
|
||||||
|
"duration_ms": null,
|
||||||
|
"width": 1080,
|
||||||
|
"height": 1920
|
||||||
|
},
|
||||||
|
"evidence_path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/11205a80f142fff0-8a4233b821a3/evidence.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": [
|
||||||
|
"C:/Users/baram/anaconda3/python.exe",
|
||||||
|
"-B",
|
||||||
|
"-X",
|
||||||
|
"utf8",
|
||||||
|
"tools/blender/run.py",
|
||||||
|
"inspect",
|
||||||
|
"--blender",
|
||||||
|
"C:/Program Files/Blender Foundation/Blender 5.2/blender.exe",
|
||||||
|
"--source",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/generated-source/preview.blend",
|
||||||
|
"--scene",
|
||||||
|
"BondPair",
|
||||||
|
"--require-object",
|
||||||
|
"PairA"
|
||||||
|
],
|
||||||
|
"exit_code": 0,
|
||||||
|
"source_sha256": "ba0850a2148824cc8416704c03f14e5714ca01a16620a4eb26981e238af78c73",
|
||||||
|
"scene_name": "BondPair"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": [
|
||||||
|
"C:/Users/baram/anaconda3/python.exe",
|
||||||
|
"-B",
|
||||||
|
"-X",
|
||||||
|
"utf8",
|
||||||
|
"tools/blender/run.py",
|
||||||
|
"render",
|
||||||
|
"--mode",
|
||||||
|
"preview",
|
||||||
|
"--project",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/project.json",
|
||||||
|
"--artifact",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/artifact.json",
|
||||||
|
"--output-revision",
|
||||||
|
"3",
|
||||||
|
"--blender",
|
||||||
|
"C:/Program Files/Blender Foundation/Blender 5.2/blender.exe",
|
||||||
|
"--source",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/generated-source/preview.blend",
|
||||||
|
"--scene",
|
||||||
|
"BondPair",
|
||||||
|
"--require-object",
|
||||||
|
"PairA",
|
||||||
|
"--cut-id",
|
||||||
|
"c07",
|
||||||
|
"--ffmpeg",
|
||||||
|
"C:\\git\\ShortVideoGenerator\\projects\\water-hydrogen-bond-surface-tension\\renderer\\node_modules\\@remotion\\compositor-win32-x64-msvc\\ffmpeg.exe",
|
||||||
|
"--ffprobe",
|
||||||
|
"C:\\git\\ShortVideoGenerator\\projects\\water-hydrogen-bond-surface-tension\\renderer\\node_modules\\@remotion\\compositor-win32-x64-msvc\\ffprobe.exe",
|
||||||
|
"--frame",
|
||||||
|
"1219"
|
||||||
|
],
|
||||||
|
"exit_code": 0,
|
||||||
|
"source_sha256": "ba0850a2148824cc8416704c03f14e5714ca01a16620a4eb26981e238af78c73",
|
||||||
|
"scene_name": "BondPair",
|
||||||
|
"media": {
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/55c4cb5b4dd88ff3-69267d17d19b/frame-00001219.png",
|
||||||
|
"kind": "image",
|
||||||
|
"verified": true,
|
||||||
|
"duration_ms": null,
|
||||||
|
"width": 1080,
|
||||||
|
"height": 1920
|
||||||
|
},
|
||||||
|
"evidence_path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/55c4cb5b4dd88ff3-69267d17d19b/evidence.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": [
|
||||||
|
"C:/Users/baram/anaconda3/python.exe",
|
||||||
|
"-B",
|
||||||
|
"-X",
|
||||||
|
"utf8",
|
||||||
|
"tools/blender/run.py",
|
||||||
|
"inspect",
|
||||||
|
"--blender",
|
||||||
|
"C:/Program Files/Blender Foundation/Blender 5.2/blender.exe",
|
||||||
|
"--source",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/generated-source/preview.blend",
|
||||||
|
"--scene",
|
||||||
|
"DropletStretch",
|
||||||
|
"--require-object",
|
||||||
|
"Droplet"
|
||||||
|
],
|
||||||
|
"exit_code": 0,
|
||||||
|
"source_sha256": "ba0850a2148824cc8416704c03f14e5714ca01a16620a4eb26981e238af78c73",
|
||||||
|
"scene_name": "DropletStretch"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": [
|
||||||
|
"C:/Users/baram/anaconda3/python.exe",
|
||||||
|
"-B",
|
||||||
|
"-X",
|
||||||
|
"utf8",
|
||||||
|
"tools/blender/run.py",
|
||||||
|
"render",
|
||||||
|
"--mode",
|
||||||
|
"preview",
|
||||||
|
"--project",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/project.json",
|
||||||
|
"--artifact",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/artifact.json",
|
||||||
|
"--output-revision",
|
||||||
|
"3",
|
||||||
|
"--blender",
|
||||||
|
"C:/Program Files/Blender Foundation/Blender 5.2/blender.exe",
|
||||||
|
"--source",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/generated-source/preview.blend",
|
||||||
|
"--scene",
|
||||||
|
"DropletStretch",
|
||||||
|
"--require-object",
|
||||||
|
"Droplet",
|
||||||
|
"--cut-id",
|
||||||
|
"c18",
|
||||||
|
"--ffmpeg",
|
||||||
|
"C:\\git\\ShortVideoGenerator\\projects\\water-hydrogen-bond-surface-tension\\renderer\\node_modules\\@remotion\\compositor-win32-x64-msvc\\ffmpeg.exe",
|
||||||
|
"--ffprobe",
|
||||||
|
"C:\\git\\ShortVideoGenerator\\projects\\water-hydrogen-bond-surface-tension\\renderer\\node_modules\\@remotion\\compositor-win32-x64-msvc\\ffprobe.exe",
|
||||||
|
"--frame",
|
||||||
|
"3372"
|
||||||
|
],
|
||||||
|
"exit_code": 0,
|
||||||
|
"source_sha256": "ba0850a2148824cc8416704c03f14e5714ca01a16620a4eb26981e238af78c73",
|
||||||
|
"scene_name": "DropletStretch",
|
||||||
|
"media": {
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/9347ba3e949e9407-0ed92949aacd/frame-00003372.png",
|
||||||
|
"kind": "image",
|
||||||
|
"verified": true,
|
||||||
|
"duration_ms": null,
|
||||||
|
"width": 1080,
|
||||||
|
"height": 1920
|
||||||
|
},
|
||||||
|
"evidence_path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/9347ba3e949e9407-0ed92949aacd/evidence.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": [
|
||||||
|
"C:/Users/baram/anaconda3/python.exe",
|
||||||
|
"-B",
|
||||||
|
"-X",
|
||||||
|
"utf8",
|
||||||
|
"tools/blender/run.py",
|
||||||
|
"inspect",
|
||||||
|
"--blender",
|
||||||
|
"C:/Program Files/Blender Foundation/Blender 5.2/blender.exe",
|
||||||
|
"--source",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/generated-source/preview.blend",
|
||||||
|
"--scene",
|
||||||
|
"BondPair",
|
||||||
|
"--require-object",
|
||||||
|
"PairA"
|
||||||
|
],
|
||||||
|
"exit_code": 0,
|
||||||
|
"source_sha256": "ba0850a2148824cc8416704c03f14e5714ca01a16620a4eb26981e238af78c73",
|
||||||
|
"scene_name": "BondPair"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": [
|
||||||
|
"C:/Users/baram/anaconda3/python.exe",
|
||||||
|
"-B",
|
||||||
|
"-X",
|
||||||
|
"utf8",
|
||||||
|
"tools/blender/run.py",
|
||||||
|
"render",
|
||||||
|
"--mode",
|
||||||
|
"preview",
|
||||||
|
"--project",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/project.json",
|
||||||
|
"--artifact",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/artifact.json",
|
||||||
|
"--output-revision",
|
||||||
|
"3",
|
||||||
|
"--blender",
|
||||||
|
"C:/Program Files/Blender Foundation/Blender 5.2/blender.exe",
|
||||||
|
"--source",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/generated-source/preview.blend",
|
||||||
|
"--scene",
|
||||||
|
"BondPair",
|
||||||
|
"--require-object",
|
||||||
|
"PairA",
|
||||||
|
"--cut-id",
|
||||||
|
"c07",
|
||||||
|
"--ffmpeg",
|
||||||
|
"C:\\git\\ShortVideoGenerator\\projects\\water-hydrogen-bond-surface-tension\\renderer\\node_modules\\@remotion\\compositor-win32-x64-msvc\\ffmpeg.exe",
|
||||||
|
"--ffprobe",
|
||||||
|
"C:\\git\\ShortVideoGenerator\\projects\\water-hydrogen-bond-surface-tension\\renderer\\node_modules\\@remotion\\compositor-win32-x64-msvc\\ffprobe.exe",
|
||||||
|
"--start",
|
||||||
|
"1017",
|
||||||
|
"--end",
|
||||||
|
"1219"
|
||||||
|
],
|
||||||
|
"exit_code": 0,
|
||||||
|
"source_sha256": "ba0850a2148824cc8416704c03f14e5714ca01a16620a4eb26981e238af78c73",
|
||||||
|
"scene_name": "BondPair",
|
||||||
|
"media": {
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/ade2a043a51a3c9f-855ff69849d6/clip.mp4",
|
||||||
|
"kind": "video",
|
||||||
|
"verified": true,
|
||||||
|
"duration_ms": 4040,
|
||||||
|
"width": 1080,
|
||||||
|
"height": 1920
|
||||||
|
},
|
||||||
|
"evidence_path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/ade2a043a51a3c9f-855ff69849d6/evidence.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": [
|
||||||
|
"C:/Users/baram/anaconda3/python.exe",
|
||||||
|
"-B",
|
||||||
|
"-X",
|
||||||
|
"utf8",
|
||||||
|
"tools/blender/run.py",
|
||||||
|
"inspect",
|
||||||
|
"--blender",
|
||||||
|
"C:/Program Files/Blender Foundation/Blender 5.2/blender.exe",
|
||||||
|
"--source",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/generated-source/preview.blend",
|
||||||
|
"--scene",
|
||||||
|
"Interface",
|
||||||
|
"--require-object",
|
||||||
|
"WaterCutawayBody"
|
||||||
|
],
|
||||||
|
"exit_code": 0,
|
||||||
|
"source_sha256": "ba0850a2148824cc8416704c03f14e5714ca01a16620a4eb26981e238af78c73",
|
||||||
|
"scene_name": "Interface"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": [
|
||||||
|
"C:/Users/baram/anaconda3/python.exe",
|
||||||
|
"-B",
|
||||||
|
"-X",
|
||||||
|
"utf8",
|
||||||
|
"tools/blender/run.py",
|
||||||
|
"render",
|
||||||
|
"--mode",
|
||||||
|
"preview",
|
||||||
|
"--project",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/project.json",
|
||||||
|
"--artifact",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/artifact.json",
|
||||||
|
"--output-revision",
|
||||||
|
"3",
|
||||||
|
"--blender",
|
||||||
|
"C:/Program Files/Blender Foundation/Blender 5.2/blender.exe",
|
||||||
|
"--source",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/generated-source/preview.blend",
|
||||||
|
"--scene",
|
||||||
|
"Interface",
|
||||||
|
"--require-object",
|
||||||
|
"WaterCutawayBody",
|
||||||
|
"--cut-id",
|
||||||
|
"c16",
|
||||||
|
"--ffmpeg",
|
||||||
|
"C:\\git\\ShortVideoGenerator\\projects\\water-hydrogen-bond-surface-tension\\renderer\\node_modules\\@remotion\\compositor-win32-x64-msvc\\ffmpeg.exe",
|
||||||
|
"--ffprobe",
|
||||||
|
"C:\\git\\ShortVideoGenerator\\projects\\water-hydrogen-bond-surface-tension\\renderer\\node_modules\\@remotion\\compositor-win32-x64-msvc\\ffprobe.exe",
|
||||||
|
"--start",
|
||||||
|
"2806",
|
||||||
|
"--end",
|
||||||
|
"3050"
|
||||||
|
],
|
||||||
|
"exit_code": 0,
|
||||||
|
"source_sha256": "ba0850a2148824cc8416704c03f14e5714ca01a16620a4eb26981e238af78c73",
|
||||||
|
"scene_name": "Interface",
|
||||||
|
"media": {
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/9af0672466949ffe-e876251fcde8/clip.mp4",
|
||||||
|
"kind": "video",
|
||||||
|
"verified": true,
|
||||||
|
"duration_ms": 4880,
|
||||||
|
"width": 1080,
|
||||||
|
"height": 1920
|
||||||
|
},
|
||||||
|
"evidence_path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/9af0672466949ffe-e876251fcde8/evidence.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": [
|
||||||
|
"C:/Users/baram/anaconda3/python.exe",
|
||||||
|
"-B",
|
||||||
|
"-X",
|
||||||
|
"utf8",
|
||||||
|
"tools/blender/run.py",
|
||||||
|
"inspect",
|
||||||
|
"--blender",
|
||||||
|
"C:/Program Files/Blender Foundation/Blender 5.2/blender.exe",
|
||||||
|
"--source",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/generated-source/preview.blend",
|
||||||
|
"--scene",
|
||||||
|
"DropletStretch",
|
||||||
|
"--require-object",
|
||||||
|
"Droplet"
|
||||||
|
],
|
||||||
|
"exit_code": 0,
|
||||||
|
"source_sha256": "ba0850a2148824cc8416704c03f14e5714ca01a16620a4eb26981e238af78c73",
|
||||||
|
"scene_name": "DropletStretch"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": [
|
||||||
|
"C:/Users/baram/anaconda3/python.exe",
|
||||||
|
"-B",
|
||||||
|
"-X",
|
||||||
|
"utf8",
|
||||||
|
"tools/blender/run.py",
|
||||||
|
"render",
|
||||||
|
"--mode",
|
||||||
|
"preview",
|
||||||
|
"--project",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/project.json",
|
||||||
|
"--artifact",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/artifact.json",
|
||||||
|
"--output-revision",
|
||||||
|
"3",
|
||||||
|
"--blender",
|
||||||
|
"C:/Program Files/Blender Foundation/Blender 5.2/blender.exe",
|
||||||
|
"--source",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/generated-source/preview.blend",
|
||||||
|
"--scene",
|
||||||
|
"DropletStretch",
|
||||||
|
"--require-object",
|
||||||
|
"Droplet",
|
||||||
|
"--cut-id",
|
||||||
|
"c18",
|
||||||
|
"--ffmpeg",
|
||||||
|
"C:\\git\\ShortVideoGenerator\\projects\\water-hydrogen-bond-surface-tension\\renderer\\node_modules\\@remotion\\compositor-win32-x64-msvc\\ffmpeg.exe",
|
||||||
|
"--ffprobe",
|
||||||
|
"C:\\git\\ShortVideoGenerator\\projects\\water-hydrogen-bond-surface-tension\\renderer\\node_modules\\@remotion\\compositor-win32-x64-msvc\\ffprobe.exe",
|
||||||
|
"--start",
|
||||||
|
"3172",
|
||||||
|
"--end",
|
||||||
|
"3372"
|
||||||
|
],
|
||||||
|
"exit_code": 0,
|
||||||
|
"source_sha256": "ba0850a2148824cc8416704c03f14e5714ca01a16620a4eb26981e238af78c73",
|
||||||
|
"scene_name": "DropletStretch",
|
||||||
|
"media": {
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/c152ea48087b78fb-dc5644146e6c/clip.mp4",
|
||||||
|
"kind": "video",
|
||||||
|
"verified": true,
|
||||||
|
"duration_ms": 4000,
|
||||||
|
"width": 1080,
|
||||||
|
"height": 1920
|
||||||
|
},
|
||||||
|
"evidence_path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/c152ea48087b78fb-dc5644146e6c/evidence.json"
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,135 @@
|
|||||||
|
{
|
||||||
|
"result": "GREEN",
|
||||||
|
"cuts": 31,
|
||||||
|
"captions": 38,
|
||||||
|
"connections": 30,
|
||||||
|
"total_ms": 110560,
|
||||||
|
"fps": 50,
|
||||||
|
"total_frames": 5528,
|
||||||
|
"profile": {
|
||||||
|
"engine": "BLENDER_EEVEE",
|
||||||
|
"device": "GPU",
|
||||||
|
"fps": 50,
|
||||||
|
"width": 1080,
|
||||||
|
"height": 1920,
|
||||||
|
"samples": 64,
|
||||||
|
"seed": 0
|
||||||
|
},
|
||||||
|
"source_sha256": "ba0850a2148824cc8416704c03f14e5714ca01a16620a4eb26981e238af78c73",
|
||||||
|
"samples": 6,
|
||||||
|
"visual_review_frames": [
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/ade2a043a51a3c9f-855ff69849d6/frame-00001017.png",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/ade2a043a51a3c9f-855ff69849d6/frame-00001118.png",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/ade2a043a51a3c9f-855ff69849d6/frame-00001218.png",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/9af0672466949ffe-e876251fcde8/frame-00002806.png",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/9af0672466949ffe-e876251fcde8/frame-00002928.png",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/9af0672466949ffe-e876251fcde8/frame-00003049.png",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/c152ea48087b78fb-dc5644146e6c/frame-00003172.png",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/c152ea48087b78fb-dc5644146e6c/frame-00003272.png",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/c152ea48087b78fb-dc5644146e6c/frame-00003371.png"
|
||||||
|
],
|
||||||
|
"actual_assets": [
|
||||||
|
{
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/generated-source/preview.blend",
|
||||||
|
"sha256": "ba0850a2148824cc8416704c03f14e5714ca01a16620a4eb26981e238af78c73"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/11205a80f142fff0-8a4233b821a3/frame-00003050.png",
|
||||||
|
"sha256": "ed62bbb40e4c49581e9e6746347d5904a7d7888957b4a9fe86f98b92f02c8b6d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/11205a80f142fff0-8a4233b821a3/evidence.json",
|
||||||
|
"sha256": "bf0b2c2e1625c8b2751fc7f013b75ad9da9338bfeb10745ba341fea6c051e2e4"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/55c4cb5b4dd88ff3-69267d17d19b/frame-00001219.png",
|
||||||
|
"sha256": "a90d41c2d81ba0fe0b92d9dee6c3d4d4b0011be13684e5f02f3a2bf9ff3f5160"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/55c4cb5b4dd88ff3-69267d17d19b/evidence.json",
|
||||||
|
"sha256": "30c03afccf8b004206c39d8963520007ccc1a12de3f49517132ec78d20ddeffe"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/9347ba3e949e9407-0ed92949aacd/frame-00003372.png",
|
||||||
|
"sha256": "a822284e864610cf7766234c12e945ac7df78d7bd2658bd7df5b859ac295b38b"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/9347ba3e949e9407-0ed92949aacd/evidence.json",
|
||||||
|
"sha256": "c956248853e9e7584422ae5720e8ec2bb5c5e77827e4da6e8549ebd13dee4a46"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/ade2a043a51a3c9f-855ff69849d6/frame-00001017.png",
|
||||||
|
"sha256": "64e4339aca608bdd3935e9043ef2a344416562f95d2ca916f3e5cd39b9ebc206"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/ade2a043a51a3c9f-855ff69849d6/frame-00001118.png",
|
||||||
|
"sha256": "7658351a85ac470a6c56b4c8e63d378bdff0fcfe3499ef1a83ae36aff4fe35c6"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/ade2a043a51a3c9f-855ff69849d6/frame-00001218.png",
|
||||||
|
"sha256": "327dfd77c03334b7900d16c2bb420dcfd6f49d9ba5c7a7282fca0aced5bfb201"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/ade2a043a51a3c9f-855ff69849d6/clip.mp4",
|
||||||
|
"sha256": "fcda5c8e23a14e51bf55f99cdb4b1a41630eed8c88ab55eb9cbaab8978c8b620"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/ade2a043a51a3c9f-855ff69849d6/evidence.json",
|
||||||
|
"sha256": "a895f887d9aad8e3c23ee522b86438c8ddc99c9c6d10ebc13ef8a202e7bc0b73"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/9af0672466949ffe-e876251fcde8/frame-00002806.png",
|
||||||
|
"sha256": "61e9aa6d5e1b334600a74cc7e7342ccea97f041f7e332d8cc3c91d8752f9e427"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/9af0672466949ffe-e876251fcde8/frame-00002928.png",
|
||||||
|
"sha256": "b863a1cce4d81caeb67a2d6027436ef836c9d2243af8dbce742dea85b6ecf4c4"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/9af0672466949ffe-e876251fcde8/frame-00003049.png",
|
||||||
|
"sha256": "b3a9ea178d98306afb4392a885a955ec1264c3011094df581df7bc0e872f600c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/9af0672466949ffe-e876251fcde8/clip.mp4",
|
||||||
|
"sha256": "43790be2888b6fa18217d342af28985f61884f0caccc326af8a439dcdf640c64"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/9af0672466949ffe-e876251fcde8/evidence.json",
|
||||||
|
"sha256": "c9633fbc6219b99361b552c5e8de44d042ce887cf5d7977654b19e6604e7b8a2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/c152ea48087b78fb-dc5644146e6c/frame-00003172.png",
|
||||||
|
"sha256": "080f63f3d3d7cd3c4c45bdfe2169626a7e5102dae7d5a3baa70c8c9f05edceb3"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/c152ea48087b78fb-dc5644146e6c/frame-00003272.png",
|
||||||
|
"sha256": "9098e93b84f4b2893a95d175371a034c943297b2c28720b2c6ee4d7984de224d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/c152ea48087b78fb-dc5644146e6c/frame-00003371.png",
|
||||||
|
"sha256": "f0daca6ad25b1ff83047e71e1dcc008ad043d822afbff73dadd78377d5a25626"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/c152ea48087b78fb-dc5644146e6c/clip.mp4",
|
||||||
|
"sha256": "db354bf19edf75ad275c2a5f0cd895abfa6be765c5bce4d85bbe35a4db68ee80"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/render-attempts/c152ea48087b78fb-dc5644146e6c/evidence.json",
|
||||||
|
"sha256": "ad8398fa95a8c99d7916cc1de4d4a42c7d59b17edb9fc5d41c904771bd8c8845"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/generated-source/mobile-c07.png",
|
||||||
|
"sha256": "b0ee1e3baf1561e5976fdeeacfb8e84d068237c5af2e0e7cdda1756ea502fe4c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/generated-source/mobile-c16.png",
|
||||||
|
"sha256": "6f66c4560031126a8c22e32d429605d09131f5ffbffbf21a1a5862ec5cfcaa8c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/generated-source/mobile-c18.png",
|
||||||
|
"sha256": "ae6708539c7ef2cea4e20383fd50517f8872b887d195d89354ab91c680e7df60"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"scenes_approval": "pending",
|
||||||
|
"formal_10_12": "not_started"
|
||||||
|
}
|
||||||
@@ -0,0 +1,287 @@
|
|||||||
|
{
|
||||||
|
"water_containment": {
|
||||||
|
"logical_frame_start": 2468,
|
||||||
|
"logical_frame_end": 3172,
|
||||||
|
"frames": 705,
|
||||||
|
"water_bounds": [
|
||||||
|
[
|
||||||
|
-2.8499999046325684,
|
||||||
|
-0.8500000238418579,
|
||||||
|
-3.1500000953674316
|
||||||
|
],
|
||||||
|
[
|
||||||
|
2.8499999046325684,
|
||||||
|
1.350000023841858,
|
||||||
|
0.800000011920929
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"minimum_axis_margin": [
|
||||||
|
0.32460685744227114,
|
||||||
|
0.453982540281773,
|
||||||
|
0.1150000339388848
|
||||||
|
],
|
||||||
|
"minimum_projected_margin_px": 47.9419330108349,
|
||||||
|
"evaluated_vertices": 11747388,
|
||||||
|
"mesh_roles": [
|
||||||
|
"atom",
|
||||||
|
"covalent",
|
||||||
|
"active_hydrogen_bond"
|
||||||
|
],
|
||||||
|
"open_faces": [
|
||||||
|
"front",
|
||||||
|
"top"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"source_sha256": "ba0850a2148824cc8416704c03f14e5714ca01a16620a4eb26981e238af78c73",
|
||||||
|
"blender_version": "5.2.2 LTS",
|
||||||
|
"scenes": {
|
||||||
|
"BondPair": {
|
||||||
|
"molecules": 2,
|
||||||
|
"frame_range": [
|
||||||
|
905,
|
||||||
|
1637
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Interface": {
|
||||||
|
"molecules": 10,
|
||||||
|
"frame_range": [
|
||||||
|
2469,
|
||||||
|
3173
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"DropletStretch": {
|
||||||
|
"molecules": 0,
|
||||||
|
"frame_range": [
|
||||||
|
3173,
|
||||||
|
4077
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"interface_frames_blender": [
|
||||||
|
2807,
|
||||||
|
2907,
|
||||||
|
3051
|
||||||
|
],
|
||||||
|
"interface_active_pairs": [
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"Liquid0_H1",
|
||||||
|
"Liquid1_O"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Liquid1_H1",
|
||||||
|
"Liquid2_O"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Liquid3_H1",
|
||||||
|
"Liquid4_O"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Liquid4_H1",
|
||||||
|
"Liquid5_O"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Liquid4_H1",
|
||||||
|
"Liquid7_O"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Liquid5_H1",
|
||||||
|
"Liquid6_O"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Liquid5_H1",
|
||||||
|
"Liquid8_O"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Liquid8_H1",
|
||||||
|
"Liquid9_O"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"Liquid0_H1",
|
||||||
|
"Liquid1_O"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Liquid1_H1",
|
||||||
|
"Liquid2_O"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Liquid3_H1",
|
||||||
|
"Liquid7_O"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Liquid4_H1",
|
||||||
|
"Liquid5_O"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Liquid4_H1",
|
||||||
|
"Liquid7_O"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Liquid5_H1",
|
||||||
|
"Liquid6_O"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Liquid5_H1",
|
||||||
|
"Liquid8_O"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Liquid8_H1",
|
||||||
|
"Liquid9_O"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"Liquid0_H1",
|
||||||
|
"Liquid1_O"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Liquid1_H1",
|
||||||
|
"Liquid2_O"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Liquid3_H1",
|
||||||
|
"Liquid7_O"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Liquid4_H1",
|
||||||
|
"Liquid5_O"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Liquid4_H1",
|
||||||
|
"Liquid7_O"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Liquid5_H1",
|
||||||
|
"Liquid6_O"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Liquid5_H1",
|
||||||
|
"Liquid8_O"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Liquid8_H1",
|
||||||
|
"Liquid9_O"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"interface_neighborhoods": [
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"neighbors": 6,
|
||||||
|
"above": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"neighbors": 4,
|
||||||
|
"above": 0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"neighbors": 6,
|
||||||
|
"above": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"neighbors": 4,
|
||||||
|
"above": 0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"neighbors": 6,
|
||||||
|
"above": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"neighbors": 4,
|
||||||
|
"above": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"volume_frames_blender": [
|
||||||
|
3173,
|
||||||
|
3223,
|
||||||
|
3273,
|
||||||
|
3323,
|
||||||
|
3373
|
||||||
|
],
|
||||||
|
"volumes": [
|
||||||
|
9.193528663402901,
|
||||||
|
9.193528830193246,
|
||||||
|
9.193528411895622,
|
||||||
|
9.193528263647696,
|
||||||
|
9.193529542642318
|
||||||
|
],
|
||||||
|
"relative_volume_change": 9.563677338952914e-08,
|
||||||
|
"evaluated_scales": [
|
||||||
|
[
|
||||||
|
1.0,
|
||||||
|
1.0,
|
||||||
|
1.0
|
||||||
|
],
|
||||||
|
[
|
||||||
|
1.212499976158142,
|
||||||
|
0.908153235912323,
|
||||||
|
0.908153235912323
|
||||||
|
],
|
||||||
|
[
|
||||||
|
1.4249999523162842,
|
||||||
|
0.8377078175544739,
|
||||||
|
0.8377078175544739
|
||||||
|
],
|
||||||
|
[
|
||||||
|
1.6375000476837158,
|
||||||
|
0.7814646363258362,
|
||||||
|
0.7814646363258362
|
||||||
|
],
|
||||||
|
[
|
||||||
|
1.850000023841858,
|
||||||
|
0.7352146506309509,
|
||||||
|
0.7352146506309509
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"label_anchors": {
|
||||||
|
"BondPair": {
|
||||||
|
"logical_frame": 1219,
|
||||||
|
"labels": {
|
||||||
|
"한 분자의 Hδ+": {
|
||||||
|
"x": 359.69,
|
||||||
|
"y": 927.15,
|
||||||
|
"depth": 13.32
|
||||||
|
},
|
||||||
|
"이웃 분자의 Oδ−": {
|
||||||
|
"x": 681.91,
|
||||||
|
"y": 881.6,
|
||||||
|
"depth": 13.35
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Interface": {
|
||||||
|
"logical_frame": 3050,
|
||||||
|
"labels": {
|
||||||
|
"물과 공기의 경계": {
|
||||||
|
"x": 603.07,
|
||||||
|
"y": 923.93,
|
||||||
|
"depth": 15.34
|
||||||
|
},
|
||||||
|
"물 안쪽": {
|
||||||
|
"x": 439.17,
|
||||||
|
"y": 1107.39,
|
||||||
|
"depth": 15.82
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"DropletStretch": {
|
||||||
|
"logical_frame": 3372,
|
||||||
|
"labels": {
|
||||||
|
"같은 물의 양 · 설명용 모형": {
|
||||||
|
"x": 540.0,
|
||||||
|
"y": 960.0,
|
||||||
|
"depth": 13.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"text_baked": false,
|
||||||
|
"physical_simulation": false
|
||||||
|
}
|
||||||
+219
@@ -0,0 +1,219 @@
|
|||||||
|
{
|
||||||
|
"result": "GREEN",
|
||||||
|
"negative_cases": 6,
|
||||||
|
"positive_cases": 1,
|
||||||
|
"executions": [
|
||||||
|
{
|
||||||
|
"command": [
|
||||||
|
"C:/Program Files/Blender Foundation/Blender 5.2/blender.exe",
|
||||||
|
"--background",
|
||||||
|
"--disable-autoexec",
|
||||||
|
"--python-exit-code",
|
||||||
|
"1",
|
||||||
|
"--python-expr",
|
||||||
|
"import bpy; bpy.ops.wm.open_mainfile(filepath='C:\\\\git\\\\ShortVideoGenerator\\\\.dryforge\\\\worktrees\\\\T3\\\\projects\\\\water-hydrogen-bond-surface-tension\\\\stages\\\\08-scenes\\\\r3\\\\generated-source\\\\preview.blend'); bpy.ops.wm.read_factory_settings(use_empty=True); bpy.ops.wm.save_as_mainfile(filepath='C:\\\\git\\\\ShortVideoGenerator\\\\.dryforge\\\\worktrees\\\\T3\\\\projects\\\\water-hydrogen-bond-surface-tension\\\\stages\\\\08-scenes\\\\r3\\\\generated-source\\\\invalid-default.blend')"
|
||||||
|
],
|
||||||
|
"exit_code": 0,
|
||||||
|
"expected_exit_code": 0,
|
||||||
|
"matched_reason": null,
|
||||||
|
"assertion_errors": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": [
|
||||||
|
"C:/Program Files/Blender Foundation/Blender 5.2/blender.exe",
|
||||||
|
"--background",
|
||||||
|
"--disable-autoexec",
|
||||||
|
"--python-exit-code",
|
||||||
|
"1",
|
||||||
|
"--python",
|
||||||
|
"C:\\git\\ShortVideoGenerator\\.dryforge\\worktrees\\T3\\projects\\water-hydrogen-bond-surface-tension\\blender\\verify_model.py",
|
||||||
|
"--",
|
||||||
|
"--source",
|
||||||
|
"C:\\git\\ShortVideoGenerator\\.dryforge\\worktrees\\T3\\projects\\water-hydrogen-bond-surface-tension\\stages\\08-scenes\\r3\\generated-source\\invalid-default.blend",
|
||||||
|
"--out",
|
||||||
|
"C:\\git\\ShortVideoGenerator\\.dryforge\\worktrees\\T3\\projects\\water-hydrogen-bond-surface-tension\\stages\\08-scenes\\r3\\generated-source\\invalid-result.json"
|
||||||
|
],
|
||||||
|
"exit_code": 1,
|
||||||
|
"expected_exit_code": 1,
|
||||||
|
"matched_reason": null,
|
||||||
|
"assertion_errors": [
|
||||||
|
"AssertionError: 대표 Scene 누락/혼입"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": [
|
||||||
|
"C:/Program Files/Blender Foundation/Blender 5.2/blender.exe",
|
||||||
|
"--background",
|
||||||
|
"--disable-autoexec",
|
||||||
|
"--python-exit-code",
|
||||||
|
"1",
|
||||||
|
"--python-expr",
|
||||||
|
"import bpy; bpy.ops.wm.open_mainfile(filepath='C:\\\\git\\\\ShortVideoGenerator\\\\.dryforge\\\\worktrees\\\\T3\\\\projects\\\\water-hydrogen-bond-surface-tension\\\\stages\\\\08-scenes\\\\r3\\\\generated-source\\\\preview.blend'); bpy.data.objects.remove(bpy.data.objects['PairA_H2'],do_unlink=True); bpy.ops.wm.save_as_mainfile(filepath='C:\\\\git\\\\ShortVideoGenerator\\\\.dryforge\\\\worktrees\\\\T3\\\\projects\\\\water-hydrogen-bond-surface-tension\\\\stages\\\\08-scenes\\\\r3\\\\generated-source\\\\invalid-atoms.blend')"
|
||||||
|
],
|
||||||
|
"exit_code": 0,
|
||||||
|
"expected_exit_code": 0,
|
||||||
|
"matched_reason": null,
|
||||||
|
"assertion_errors": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": [
|
||||||
|
"C:/Program Files/Blender Foundation/Blender 5.2/blender.exe",
|
||||||
|
"--background",
|
||||||
|
"--disable-autoexec",
|
||||||
|
"--python-exit-code",
|
||||||
|
"1",
|
||||||
|
"--python",
|
||||||
|
"C:\\git\\ShortVideoGenerator\\.dryforge\\worktrees\\T3\\projects\\water-hydrogen-bond-surface-tension\\blender\\verify_model.py",
|
||||||
|
"--",
|
||||||
|
"--source",
|
||||||
|
"C:\\git\\ShortVideoGenerator\\.dryforge\\worktrees\\T3\\projects\\water-hydrogen-bond-surface-tension\\stages\\08-scenes\\r3\\generated-source\\invalid-atoms.blend",
|
||||||
|
"--out",
|
||||||
|
"C:\\git\\ShortVideoGenerator\\.dryforge\\worktrees\\T3\\projects\\water-hydrogen-bond-surface-tension\\stages\\08-scenes\\r3\\generated-source\\invalid-result.json"
|
||||||
|
],
|
||||||
|
"exit_code": 1,
|
||||||
|
"expected_exit_code": 1,
|
||||||
|
"matched_reason": null,
|
||||||
|
"assertion_errors": [
|
||||||
|
"AssertionError: O1H2 위반"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": [
|
||||||
|
"C:/Program Files/Blender Foundation/Blender 5.2/blender.exe",
|
||||||
|
"--background",
|
||||||
|
"--disable-autoexec",
|
||||||
|
"--python-exit-code",
|
||||||
|
"1",
|
||||||
|
"--python-expr",
|
||||||
|
"import bpy; bpy.ops.wm.open_mainfile(filepath='C:\\\\git\\\\ShortVideoGenerator\\\\.dryforge\\\\worktrees\\\\T3\\\\projects\\\\water-hydrogen-bond-surface-tension\\\\stages\\\\08-scenes\\\\r3\\\\generated-source\\\\preview.blend'); bpy.data.objects['Droplet'].animation_data.drivers[1].driver.expression='1'; bpy.ops.wm.save_as_mainfile(filepath='C:\\\\git\\\\ShortVideoGenerator\\\\.dryforge\\\\worktrees\\\\T3\\\\projects\\\\water-hydrogen-bond-surface-tension\\\\stages\\\\08-scenes\\\\r3\\\\generated-source\\\\invalid-volume.blend')"
|
||||||
|
],
|
||||||
|
"exit_code": 0,
|
||||||
|
"expected_exit_code": 0,
|
||||||
|
"matched_reason": null,
|
||||||
|
"assertion_errors": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": [
|
||||||
|
"C:/Program Files/Blender Foundation/Blender 5.2/blender.exe",
|
||||||
|
"--background",
|
||||||
|
"--disable-autoexec",
|
||||||
|
"--python-exit-code",
|
||||||
|
"1",
|
||||||
|
"--python",
|
||||||
|
"C:\\git\\ShortVideoGenerator\\.dryforge\\worktrees\\T3\\projects\\water-hydrogen-bond-surface-tension\\blender\\verify_model.py",
|
||||||
|
"--",
|
||||||
|
"--source",
|
||||||
|
"C:\\git\\ShortVideoGenerator\\.dryforge\\worktrees\\T3\\projects\\water-hydrogen-bond-surface-tension\\stages\\08-scenes\\r3\\generated-source\\invalid-volume.blend",
|
||||||
|
"--out",
|
||||||
|
"C:\\git\\ShortVideoGenerator\\.dryforge\\worktrees\\T3\\projects\\water-hydrogen-bond-surface-tension\\stages\\08-scenes\\r3\\generated-source\\invalid-result.json"
|
||||||
|
],
|
||||||
|
"exit_code": 1,
|
||||||
|
"expected_exit_code": 1,
|
||||||
|
"matched_reason": null,
|
||||||
|
"assertion_errors": [
|
||||||
|
"AssertionError: 중간 프레임 포함 부피 변화 1% 초과"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": [
|
||||||
|
"C:/Program Files/Blender Foundation/Blender 5.2/blender.exe",
|
||||||
|
"--background",
|
||||||
|
"--disable-autoexec",
|
||||||
|
"--python-exit-code",
|
||||||
|
"1",
|
||||||
|
"--python-expr",
|
||||||
|
"import bpy; bpy.ops.wm.open_mainfile(filepath='C:\\\\git\\\\ShortVideoGenerator\\\\.dryforge\\\\worktrees\\\\T3\\\\projects\\\\water-hydrogen-bond-surface-tension\\\\stages\\\\08-scenes\\\\r3\\\\generated-source\\\\preview.blend'); bpy.data.objects['Liquid9_H1'].data.vertices[0].co.x=10; bpy.ops.wm.save_as_mainfile(filepath='C:\\\\git\\\\ShortVideoGenerator\\\\.dryforge\\\\worktrees\\\\T3\\\\projects\\\\water-hydrogen-bond-surface-tension\\\\stages\\\\08-scenes\\\\r3\\\\generated-source\\\\invalid-containment.blend')"
|
||||||
|
],
|
||||||
|
"exit_code": 0,
|
||||||
|
"expected_exit_code": 0,
|
||||||
|
"matched_reason": null,
|
||||||
|
"assertion_errors": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": [
|
||||||
|
"C:/Program Files/Blender Foundation/Blender 5.2/blender.exe",
|
||||||
|
"--background",
|
||||||
|
"--disable-autoexec",
|
||||||
|
"--python-exit-code",
|
||||||
|
"1",
|
||||||
|
"--python",
|
||||||
|
"C:\\git\\ShortVideoGenerator\\.dryforge\\worktrees\\T3\\projects\\water-hydrogen-bond-surface-tension\\blender\\verify_model.py",
|
||||||
|
"--",
|
||||||
|
"--source",
|
||||||
|
"C:\\git\\ShortVideoGenerator\\.dryforge\\worktrees\\T3\\projects\\water-hydrogen-bond-surface-tension\\stages\\08-scenes\\r3\\generated-source\\invalid-containment.blend",
|
||||||
|
"--out",
|
||||||
|
"C:\\git\\ShortVideoGenerator\\.dryforge\\worktrees\\T3\\projects\\water-hydrogen-bond-surface-tension\\stages\\08-scenes\\r3\\generated-source\\invalid-result.json"
|
||||||
|
],
|
||||||
|
"exit_code": 1,
|
||||||
|
"expected_exit_code": 1,
|
||||||
|
"matched_reason": "물 영역 밖 또는 여백 부족",
|
||||||
|
"assertion_errors": [
|
||||||
|
"AssertionError: 물 영역 밖 또는 여백 부족: F2468 Liquid9_H1, 축 여백 [-1.628933072090149, -0.05580306053161621, 0.7182001715540887]"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": [
|
||||||
|
"C:/Program Files/Blender Foundation/Blender 5.2/blender.exe",
|
||||||
|
"--background",
|
||||||
|
"--disable-autoexec",
|
||||||
|
"--python-exit-code",
|
||||||
|
"1",
|
||||||
|
"--python",
|
||||||
|
"C:\\git\\ShortVideoGenerator\\.dryforge\\worktrees\\T3\\projects\\water-hydrogen-bond-surface-tension\\blender\\verify_model.py",
|
||||||
|
"--",
|
||||||
|
"--source",
|
||||||
|
"C:\\git\\ShortVideoGenerator\\.dryforge\\worktrees\\T3\\projects\\water-hydrogen-bond-surface-tension\\stages\\08-scenes\\r3\\generated-source\\missing.blend",
|
||||||
|
"--out",
|
||||||
|
"C:\\git\\ShortVideoGenerator\\.dryforge\\worktrees\\T3\\projects\\water-hydrogen-bond-surface-tension\\stages\\08-scenes\\r3\\generated-source\\invalid-result.json"
|
||||||
|
],
|
||||||
|
"exit_code": 1,
|
||||||
|
"expected_exit_code": 1,
|
||||||
|
"matched_reason": null,
|
||||||
|
"assertion_errors": [
|
||||||
|
"AssertionError: 원본 파일 없음"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": [
|
||||||
|
"C:/Program Files/Blender Foundation/Blender 5.2/blender.exe",
|
||||||
|
"--background",
|
||||||
|
"--disable-autoexec",
|
||||||
|
"--python-exit-code",
|
||||||
|
"1",
|
||||||
|
"--python",
|
||||||
|
"C:\\git\\ShortVideoGenerator\\.dryforge\\worktrees\\T3\\projects\\water-hydrogen-bond-surface-tension\\blender\\verify_model.py",
|
||||||
|
"--",
|
||||||
|
"--source",
|
||||||
|
"C:\\git\\ShortVideoGenerator\\.dryforge\\worktrees\\T3\\projects\\water-hydrogen-bond-surface-tension\\stages\\08-scenes\\r2\\generated-source\\preview.blend",
|
||||||
|
"--out",
|
||||||
|
"C:\\git\\ShortVideoGenerator\\.dryforge\\worktrees\\T3\\projects\\water-hydrogen-bond-surface-tension\\stages\\08-scenes\\r3\\generated-source\\invalid-result.json"
|
||||||
|
],
|
||||||
|
"exit_code": 1,
|
||||||
|
"expected_exit_code": 1,
|
||||||
|
"matched_reason": "물 영역 밖 또는 여백 부족",
|
||||||
|
"assertion_errors": [
|
||||||
|
"AssertionError: 물 영역 밖 또는 여백 부족: F2468 Liquid0_O, 축 여백 [0.49120567332267306, -1.2587944235348747, -0.10879997844696021]"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": [
|
||||||
|
"C:/Program Files/Blender Foundation/Blender 5.2/blender.exe",
|
||||||
|
"--background",
|
||||||
|
"--disable-autoexec",
|
||||||
|
"--python-exit-code",
|
||||||
|
"1",
|
||||||
|
"--python",
|
||||||
|
"C:\\git\\ShortVideoGenerator\\.dryforge\\worktrees\\T3\\projects\\water-hydrogen-bond-surface-tension\\blender\\verify_model.py",
|
||||||
|
"--",
|
||||||
|
"--source",
|
||||||
|
"C:\\git\\ShortVideoGenerator\\.dryforge\\worktrees\\T3\\projects\\water-hydrogen-bond-surface-tension\\stages\\08-scenes\\r3\\generated-source\\preview.blend",
|
||||||
|
"--out",
|
||||||
|
"C:\\git\\ShortVideoGenerator\\.dryforge\\worktrees\\T3\\projects\\water-hydrogen-bond-surface-tension\\stages\\08-scenes\\r3\\model-check.json"
|
||||||
|
],
|
||||||
|
"exit_code": 0,
|
||||||
|
"expected_exit_code": 0,
|
||||||
|
"matched_reason": null,
|
||||||
|
"assertion_errors": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
{
|
||||||
|
"result": "GREEN",
|
||||||
|
"source_sha256": "ba0850a2148824cc8416704c03f14e5714ca01a16620a4eb26981e238af78c73",
|
||||||
|
"views": [
|
||||||
|
{
|
||||||
|
"cut_id": "c07",
|
||||||
|
"logical_frames": [
|
||||||
|
1017,
|
||||||
|
1118,
|
||||||
|
1218
|
||||||
|
],
|
||||||
|
"pixel_sha256": [
|
||||||
|
"ae0a8bd9b961002870a42f9d5d95bd694b4ab83e12e38f0eb1e42b8671bacbee",
|
||||||
|
"f6909898a79aed45efd47611568a0991d3b73d1788b1f12ee9ce84eee9e9421b",
|
||||||
|
"f6909898a79aed45efd47611568a0991d3b73d1788b1f12ee9ce84eee9e9421b"
|
||||||
|
],
|
||||||
|
"mean_absolute_pixel_change": [
|
||||||
|
1.7141441615226338,
|
||||||
|
1.7141441615226338
|
||||||
|
],
|
||||||
|
"mobile_view_path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/generated-source/mobile-c07.png",
|
||||||
|
"mobile_view_sha256": "b0ee1e3baf1561e5976fdeeacfb8e84d068237c5af2e0e7cdda1756ea502fe4c",
|
||||||
|
"visual_review": "checked",
|
||||||
|
"observation": "두 분자의 접근과 점선 축소 후 유지가 보이며 O1H2·실선·점선과 좌우 여백을 직접 확인했다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c16",
|
||||||
|
"logical_frames": [
|
||||||
|
2806,
|
||||||
|
2928,
|
||||||
|
3049
|
||||||
|
],
|
||||||
|
"pixel_sha256": [
|
||||||
|
"e207c7b8daff676f04eb9caac1359e42faa8723230dd3ae318f4c934c73b36c7",
|
||||||
|
"6c52320ba10371ca7dadb1cf44cfdb3ad26747478edee0d49224a0876430b066",
|
||||||
|
"804d7a4629cd846a02aa1eed442662859dfcae13551374e3668b2ab7db34ad34"
|
||||||
|
],
|
||||||
|
"mean_absolute_pixel_change": [
|
||||||
|
1.4502298739711934,
|
||||||
|
1.0236177019032922
|
||||||
|
],
|
||||||
|
"mobile_view_path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/generated-source/mobile-c16.png",
|
||||||
|
"mobile_view_sha256": "6f66c4560031126a8c22e32d429605d09131f5ffbffbf21a1a5862ec5cfcaa8c",
|
||||||
|
"visual_review": "checked",
|
||||||
|
"observation": "시작·중간·마지막 모두 전체 원자·실선·점선이 파란 물 영역 안에 보이고 내부→표면 강조와 연결 교체가 읽힌다."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c18",
|
||||||
|
"logical_frames": [
|
||||||
|
3172,
|
||||||
|
3272,
|
||||||
|
3371
|
||||||
|
],
|
||||||
|
"pixel_sha256": [
|
||||||
|
"844e0b43c1d95e098d9c2ae14ea6260a8f52b7c1d07aa06ea32e443fb0df8eb4",
|
||||||
|
"8caf4fd30eff6e1ec8547e2cf47eadd487c366b067c33e7a7aa5376746c096ea",
|
||||||
|
"dd06c356f970ebb7939d04704d3f9f446f60d0aee51353c00248c75389ec64b6"
|
||||||
|
],
|
||||||
|
"mean_absolute_pixel_change": [
|
||||||
|
4.760786554783951,
|
||||||
|
7.851008551954732
|
||||||
|
],
|
||||||
|
"mobile_view_path": "projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r3/generated-source/mobile-c18.png",
|
||||||
|
"mobile_view_sha256": "ae6708539c7ef2cea4e20383fd50517f8872b887d195d89354ab91c680e7df60",
|
||||||
|
"visual_review": "checked",
|
||||||
|
"observation": "둥근 방울→중간 타원→늘어난 방울의 매끈한 실루엣과 여백을 직접 확인했다."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
+65
@@ -0,0 +1,65 @@
|
|||||||
|
{
|
||||||
|
"result": "GREEN",
|
||||||
|
"unchanged_files": 53,
|
||||||
|
"baseline_sha256": {
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/artifact.json": "9209aea8383ae6bc5c0d921153c8cf8271666426ccf407ea408429c9d6a86e0a",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/cli-commands.json": "3851ad8e37c40905b92a75376b4bf7048c713f8380645d8b246cbf2d2bf7e37b",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/design-check.json": "5812c551c98d826dc0edd45a5d0d0561cec14c72c945ceae590fe789cc312f23",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/model-check.json": "6648003fbddb00e4e95646fb686445e00d9329419134ee3623307aee05f98964",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/model-test-results.json": "e264e25b8f8e0614cf39434ea4f4a1f5ba5e036205c82a79a4fab1ba91c5ec4a",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/motion-check.json": "9ace6ea70590502cc4d7de947ee1c6ffef0b86459f63440ab5e3ab33aac654dc",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/preservation-check.json": "d36a295dd4fcf36d5d3ebc03babb9e72bdb3c7d79cfa7a865142f002ebf9769a",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/09-entities/r2/artifact.json": "6ca47aa11942348fa3d8977bac5d3848f2485ae299f010d2d993f86eccba3029",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/09-entities/r2/review.md": "76193cf65e5bd1fb4924a2d58d4f6ae11ebe4df63f915befb1afa72a263b3539",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/review.md": "7c5a5577ba7fbe8a8681640a18b71d400118cb4edd3ee92f2db70ea682030c79",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/generated-source/preview.blend": "90300fd78369d88371f727a69f6c4b03f2d0cd3bb950d2698c48018e111a9aeb",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/render-attempts/5b09f426cc6a97b3-ab379b2220bf/frame-00001219.png": "d5c4c1265883b89f50bffe426772cf44c0997a7932a19364d18a7b5f752406eb",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/render-attempts/5b09f426cc6a97b3-ab379b2220bf/evidence.json": "bb6aa1849a65db4f042978eb9e3d193da50e0c99ef3ab0de0b64b5c9cc34ffae",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/render-attempts/5a10b9e425756d31-40434704ca5c/frame-00003050.png": "b85249515e71d7b258f97669f62e80406f6d1e112a637cd72a8a947941bcfdfb",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/render-attempts/5a10b9e425756d31-40434704ca5c/evidence.json": "58daebc48bf8f2c0a69ac4defed7b04db2ea5aabfa23bd4f6af5d15e032e8c1c",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/render-attempts/34d7d6fa6d236962-0946653f91af/frame-00003372.png": "3a5aa9639921eb4e45c515c0c221c855276b785026cfe5861edb384ef6fc1915",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/render-attempts/34d7d6fa6d236962-0946653f91af/evidence.json": "380048ebdc85eaa82b6d78f92ad2b1644ba56ea7cf85c161ba50e3ed24682da5",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/render-attempts/b687ba0725d55e27-a1f95ff8f3d0/frame-00001017.png": "57839cdd859b72b296159f9e62effe1a0dcb06d29f4b443900a469c57b2cbb05",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/render-attempts/b687ba0725d55e27-a1f95ff8f3d0/frame-00001118.png": "389703fb3dc35845781921bfda9ff155e859cd99ea415434d98534b2e13ee67a",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/render-attempts/b687ba0725d55e27-a1f95ff8f3d0/frame-00001218.png": "9715f2735c82b4804ace3424149fc88002d2e3eff116b26d0615a9714af94d3d",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/render-attempts/b687ba0725d55e27-a1f95ff8f3d0/clip.mp4": "a180c5c2d3890d35e67dca9ee393c88b6dbf52fe2b7a82f82eeb019296aadfac",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/render-attempts/b687ba0725d55e27-a1f95ff8f3d0/evidence.json": "4c8c98a5c54e66c6849d4c7c4501b5c3c440ccf8225edf600a4bee363b03d579",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/render-attempts/791d67b5b8b0d08f-90e42af24cc7/frame-00002806.png": "1dbbe8ff2040ac89fbdba73eda8358b50f6bc765cc463646f30663accb5f9281",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/render-attempts/791d67b5b8b0d08f-90e42af24cc7/frame-00002928.png": "86976f101752570d91e9eb9550649968fd289d057802d3a6eba55066e03a5881",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/render-attempts/791d67b5b8b0d08f-90e42af24cc7/frame-00003049.png": "30c45f6314d2327bc0e5399049cba637fbfd532b3a643486c0cb9e6683344c09",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/render-attempts/791d67b5b8b0d08f-90e42af24cc7/clip.mp4": "f1234254a43ab67cd3e7b8c5e855b39a18913596b8049a1201e0a6f4a60eda09",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/render-attempts/791d67b5b8b0d08f-90e42af24cc7/evidence.json": "02e66eed34b3270ed2f6613d26e587a1eccc2f5b4b7144b73cd1b67ca5176caa",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/render-attempts/189e348aeb500188-623b27f1328f/frame-00003172.png": "c9c560e8442b1cc17e5b1b34370797c3cb6ff3d16001582ea524f93fcdd99497",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/render-attempts/189e348aeb500188-623b27f1328f/frame-00003272.png": "d00f91e91a8133aa757ed2e3b2fe91b6c3e0e6e472ad96c675bf4954b778cfe9",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/render-attempts/189e348aeb500188-623b27f1328f/frame-00003371.png": "fa4c9328af95c4a2a651f14f654ddcb45c227660d2cf9ab8549ba425f4268faf",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/render-attempts/189e348aeb500188-623b27f1328f/clip.mp4": "db354bf19edf75ad275c2a5f0cd895abfa6be765c5bce4d85bbe35a4db68ee80",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/render-attempts/189e348aeb500188-623b27f1328f/evidence.json": "f2a3b2eb421d6da588f6e83f427228d678971027242a18aefb6ffcc53c1cd874",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/generated-source/mobile-c07.png": "b0ee1e3baf1561e5976fdeeacfb8e84d068237c5af2e0e7cdda1756ea502fe4c",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/generated-source/mobile-c16.png": "9e39985291ebfd404240f8463dca66b49e05f2f1a77e9960deb9c9371b435e11",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/08-scenes/r2/generated-source/mobile-c18.png": "ae6708539c7ef2cea4e20383fd50517f8872b887d195d89354ab91c680e7df60",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/media/06-tts/r1/narration.wav": "aeac3c60acf481195be1af093d633cf16ea4ea6645778d762f529e49ca5ec905",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/media/06-tts/r1/u01.wav": "6da0cdca317b77019a8c6d3a2624a66f888118aca49f4771823c174d0566fed0",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/media/06-tts/r1/u02.wav": "6fde36df1fa98e5ad4de6775b3ac21071ab0f33aa54f6c0ac14aaec9af4088bc",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/media/06-tts/r1/u03.wav": "2cd48379dfc704a6c8a06b8de21085f9f40405d94c22f5893525c9c47f0da9e4",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/media/06-tts/r1/u04.wav": "9dbfb2df6d9888127921dd17cb9c4ada4785934c3fc194aad9313dad9ec02d7e",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/media/06-tts/r1/u05.wav": "84cbd278321539207318a3a7a7cd8c3527778f5950de6cfb77b18b1352738d01",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/media/06-tts/r1/u06.wav": "5c7e19466ea3d3d01b853d9bae00e52703df6e50906aad38219689db63a60ce0",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/media/06-tts/r1/u07.wav": "38a200bab0e80f85e80719900870823d3166d5071f19866e0e44aab02d7d8fc9",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/media/06-tts/r1/u08.wav": "55d16e7f65e5f183cc17d194898e9d80b70a9308a370a36c7e4c4367fdf5a904",
|
||||||
|
"references/1.png": "5d83e03add8cdc29f5d7b1f1d06fb87f7738a6dc32579f554fb824fb36b83e44",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/01-topic/r1/artifact.json": "b6185f25aaa719da54bd3404ff919d3888b1d7c99bda38080af418b48c0ac9e7",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/02-research/r1/artifact.json": "b72b06006b5befca6b4fa5f0e140269fe40a913b42601418920018ddce930b8b",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/03-script/r1/artifact.json": "1e04070b9a98eee5e72fc42d94b2ec754c68ac7a1b97e93da9906be17d6596f6",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/04-title/r1/artifact.json": "bc98e18db9f3eef2a9cc9b6f07918c8ae6f143f5f4000fcd3a626559d58756d0",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/05-tts-split/r1/artifact.json": "fffb9f187dcb0df7bf0aa82f732c0594cedfd9f5b03d86969c9d733ff9f539ca",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/06-tts/r1/artifact.json": "70d362484ac7fc17a0abb4550d0e505bdef20ae78e3a1207492d32c306fb5873",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/07-cuts/r1/alignment.json": "15f9ca15f09b47691feec74efec487549da1f595dc0a167142d47a76317159ba",
|
||||||
|
"projects/water-hydrogen-bond-surface-tension/stages/07-cuts/r1/artifact.json": "d5ba99ef50ea270e45ca018977d0e8cce2157929a9aebaf045ac7e5d6d463bff"
|
||||||
|
},
|
||||||
|
"wav_files": 9,
|
||||||
|
"wav_byte_identical": true,
|
||||||
|
"style_byte_identical": true,
|
||||||
|
"stages_01_07_json_content_identical": true,
|
||||||
|
"previous_revision": "r2",
|
||||||
|
"note": "r2 원본·대표·검사·검토와 01–07 및 승인 WAV를 보존했다. 이 담당은 project.json을 수정하지 않았다."
|
||||||
|
}
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
# 물 영역 포함 수정 검토 · 08 r3
|
||||||
|
|
||||||
|
기존 07 r1 과 새 08 r3/09 r3 에 대한 **사용자 scenes 재검토 대기**를 제안한다. 기존 한국어 대본·제목·승인 WAV·01–07 r1·31 컷·38 자막·110560ms·5528 프레임을 유지했다. 정식 10–12 와 전체 컷 제작은 시작하지 않았다.
|
||||||
|
|
||||||
|
## 수정 이유와 실제 모델
|
||||||
|
|
||||||
|
사용자가 r2 의 내부/표면 화면에서 분자가 파란 물 박스 밖에 보인다고 지적했다. 실제 r2 원본은 물 mesh 경계 y=[0.95,2.45]와 원자·결합의 y 위치가 분리돼 있었고 일부 원자는 좌우·위·아래 경계도 넘었다. 절개 설명이라는 문구로 외부 배치를 정당화하지 않는다. r2 원본·미디어·검토·검사·과거 시도를 그대로 보존하고 새 r3 를 작성했다.
|
||||||
|
|
||||||
|
r3 의 WaterCutawayBody는 실제 8 정점·4 면 mesh다. 물 경계는 x=[-2.85,2.85], y=[-0.85,1.35], z=[-3.15,0.80]이며 기존 원자 위치와 연결 설명을 유지하면서 모든 원자·실선·활성 점선을 포함한다. 앞면과 윗면을 실제로 열고 뒤·양옆·아래의 청색 절개면으로 물 영역을 보인다. 이 면은 설명용 절개이고 별도 벽·막·고체 껍질이라는 과학적 구조가 아니다. 위쪽은 공기 방향이며 진공이나 수증기 부재를 주장하지 않는다. 물의 실제 분자 크기·거리·각도·힘 수치를 표시하지 않는다.
|
||||||
|
|
||||||
|
Interface의 고정 직교 카메라 (0,-14,6), ortho_scale=13 을 유지했다. 전체 논리 F2468–3172, Blender F2469–3173 의 705 프레임에서 원자 30·내부 실선 20·활성 분자간 점선의 **평가된 mesh 전체 정점**을 검사했다. 실제 표시 mesh에서 물 경계를 얻고 정점별 축 여백과 실제 카메라 투영 윤곽 안의 포함을 확인했다. 분자 중심만 확인한 결과가 아니다.
|
||||||
|
|
||||||
|
평가 정점 11,747,388 개가 통과했다. 최소 축 여백은 x=0.3246069, y=0.4539825, z=0.1150000 으로 요구한 0.03 이상이고 파란 물 투영 윤곽까지 최소 여백은 47.9419px이다. 이 값은 제작 검사용 임의 모형 좌표이며 화면의 과학 수치가 아니다. c16 끝 PNG를 먼저 실제 렌더하고 총괄과 담당이 직접 열어 하단 세 분자·좌우 H·윗쪽 원자 전체가 파란 영역 안에 보이고 결합이 가려지지 않음을 확인한 다음 영상 렌더를 진행했다.
|
||||||
|
|
||||||
|
## 이야기·연결·고정 특징
|
||||||
|
|
||||||
|
02 r1 의 검증 주장과 03 r1 의 의미를 유지한다. 작은 물방울→분자 부분전하→내부/분자간 결합 구별→바뀌는 액체 이웃→내부/표면 차이→같은 부피 변형→조건과 답 회수의 31 개 설명을 설계했다. 새 숫자·서사 반전·캠핑 소재·인물은 추가하지 않는다. 30 개 인접 연결에서 continuous는 같은 Scene·경계 프레임·동일 상태 문자열·카메라를 공유하고 cut은 다른 Scene의 설명 범위나 비교 조건으로 전환한다. 실제 모델은 세 대표 Scene에 한정된다.
|
||||||
|
|
||||||
|
모든 물 분자는 O1H2·V자와 내부 남색 O–H 실선 두 개를 유지한다. 금색 H···O 점선은 서로 다른 분자만 잇는다. 액체는 불규칙 이웃이며 Liquid3_H1→Liquid4_O 연결이 사라지고 Liquid3_H1→Liquid7_O 연결이 생긴다. 내부/표면의 이웃 환경 차이도 실제 배치로 검사한다. 원자 분리·반응·고정 격자·동일 결합 수를 강제하지 않는다. 강조고리는 설명 표식이며 물의 표면층이 아니다.
|
||||||
|
|
||||||
|
DropletStretch는 같은 부피의 닫힌 128×64 구 mesh를 x=s, y=z=s^(-1/2)로 평가한다. `--disable-autoexec`에서 시작·중간 세 프레임·전체 c18 끝의 실제 mesh 부피를 확인했다. 최대 상대 변화 9.5636773×10⁻⁸로 1% 이하이며 MD·유체 시뮬레이션이라고 주장하지 않는다. 이후 복귀 애니메이션과 전체 비교·조건 장면은 scenes 승인 후 정식 제작 범위다.
|
||||||
|
|
||||||
|
## 실제 대표 범위와 품질
|
||||||
|
|
||||||
|
| 컷 | 실측 음성 구간 | 논리 MP4 범위 | 끝 PNG | 변화 |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| c07 | 20340–24380ms | [1017,1219), 202F/4040ms | F1219 | 온전한 두 분자의 접근·점선 길이 변화 |
|
||||||
|
| c16 | 56120–61000ms | [2806,3050), 244F/4880ms | F3050 | 실제 물 영역 안에서 내부→표면 강조·연결 교체 |
|
||||||
|
| c18 | 63440–67440ms | [3172,3372), 200F/4000ms | F3372 | 같은 부피의 매끈한 물방울 변형 |
|
||||||
|
|
||||||
|
Blender 프레임은 논리 프레임+1이다. MP4 는 끝을 포함하지 않고 끝 PNG는 exclusive 경계여서 마지막 영상 프레임보다 20ms 뒤다. 세 PNG와 세 무음 MP4 모두 새 r3 단일 원본에서 생성하며 r2 결과를 새 source hash로 위장하지 않는다. 공통 프로필은 BLENDER_EEVEE/GPU/50fps/1080×1920/samples64/seed0 이다.
|
||||||
|
|
||||||
|
references/1.png의 단순 형태·정돈된 색·정보량을 밝은 크림 배경과 부드러운 교육용 3D 명암으로 해석했다. 원본과 WAV를 바꾸지 않는다. 산호 O·미색 H·남색 내부 실선·금색 점선·청색 물을 반복한다. Pair와 Drop의 좌우 여백·낮춘 조명·매끈한 방울 mesh를 유지한다. 글자는 3D에 굽지 않으며 상하단 제목·자막 공간을 남긴다. model-check.json의 label_anchors는 실제 카메라 투영 좌표다. 나중 Remotion에서 Oδ−/Hδ+·공기·물(절개 설명 모형)·물 안쪽·표면·같은 물의 양을 검증해 합성한다. 부분전하는 분자 전체의 이온화를 의미하지 않는다. 최종 자막 가독성과 전체 영상 품질은 아직 완료로 주장하지 않는다.
|
||||||
|
|
||||||
|
## RED→GREEN·실행·보존
|
||||||
|
|
||||||
|
새 포함 assertion을 먼저 작성해 수정 전 실제 r2 원본이 `물 영역 밖 또는 여백 부족`으로 exit1 이 되는 RED를 확인했다. 실제 fixture는 Liquid9_H1 의 객체 중심·분자 구조·내부 실선 위치를 그대로 두고 mesh 정점 하나만 x=10 으로 옮겼으며 같은 assertion으로 거부했다. stderr의 해당 AssertionError와 matched_reason을 기록했다. 기존 파일 없음·Scene 오류·H 누락·부피 driver 오류도 실제 exit1 이고 수정 r3 원본은 exit0 이다. [검사 명령·실제 오류](model-test-results.json), [원본·포함·부피·주석 앵커](model-check.json)를 참조한다.
|
||||||
|
|
||||||
|
[CLI 명령과 실제 종료코드](cli-commands.json), [설계·복사 자산 해시](design-check.json), [실제 RGB·모바일 관찰](motion-check.json), [보존 검사](preservation-check.json)를 연결한다. 기존 실행기의 inspect·source hash·Scene·frame·profile·PNG/MP4 probe·전체 디코드를 사용하며 범용 run.py는 수정하지 않았다. 계약 10 검사와 실행기 14 검사가 exit0 이다. 큰 .blend·프레임·MP4·로그는 자기 r3 의 좁은 .gitignore로 보존하고 커밋하지 않는다. 총괄은 actual_assets의 모든 실물을 해시 대조해 복사한다. r2 와 기존 자료의 보존 기준 53 파일을 다시 비교했으며 승인 WAV9·스타일 원본은 작업 루트와 바이트 동일하고 01–07 JSON 내용도 동일하다. project.json은 총괄만 작성한다.
|
||||||
|
|
||||||
|
실제 실행은 저장소 루트에서 기존 설치를 사용했다. 아래 명령은 종료코드 0 이며 내부 실패 사례 6 개는 기대대로 각각 1 이다.
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
& 'C:/Program Files/Blender Foundation/Blender 5.2/blender.exe' --background --disable-autoexec --python-exit-code 1 --python projects/water-hydrogen-bond-surface-tension/blender/build_preview.py
|
||||||
|
& 'C:/Users/baram/anaconda3/python.exe' -B -X utf8 projects/water-hydrogen-bond-surface-tension/blender/test_model.py
|
||||||
|
& 'C:/Users/baram/anaconda3/python.exe' -B -X utf8 projects/water-hydrogen-bond-surface-tension/blender/prepare_artifacts.py
|
||||||
|
& 'C:/Users/baram/anaconda3/python.exe' -B -X utf8 projects/water-hydrogen-bond-surface-tension/blender/render_preview.py --kind image --cut c16
|
||||||
|
& 'C:/Users/baram/anaconda3/python.exe' -B -X utf8 projects/water-hydrogen-bond-surface-tension/blender/render_preview.py --kind image --cut c07
|
||||||
|
& 'C:/Users/baram/anaconda3/python.exe' -B -X utf8 projects/water-hydrogen-bond-surface-tension/blender/render_preview.py --kind image --cut c18
|
||||||
|
& 'C:/Users/baram/anaconda3/python.exe' -B -X utf8 projects/water-hydrogen-bond-surface-tension/blender/render_preview.py --kind video
|
||||||
|
& 'C:/Users/baram/anaconda3/python.exe' -B -X utf8 contracts/check.py
|
||||||
|
& 'C:/Users/baram/anaconda3/python.exe' -B -X utf8 tools/blender/test_runner.py
|
||||||
|
& 'C:/Users/baram/anaconda3/python.exe' -B -X utf8 projects/water-hydrogen-bond-surface-tension/blender/inspection_views.py
|
||||||
|
& 'C:/Users/baram/anaconda3/python.exe' -B -X utf8 projects/water-hydrogen-bond-surface-tension/blender/verify_design.py
|
||||||
|
```
|
||||||
|
|
||||||
|
사용자의 새로운 07 r1/08 r3/09 r3 scenes 결정이 필요하다. 담당의 준비 완료는 승인이 아니며 승인 전 정식 10–12 로 넘어가지 않는다.
|
||||||
|
|
||||||
|
## 실제 최종 제출 파일
|
||||||
|
|
||||||
|
원본 [preview.blend](generated-source/preview.blend), Blender 5.2.2 LTS, SHA-256 `ba0850a2148824cc8416704c03f14e5714ca01a16620a4eb26981e238af78c73`. 실제 Scene은 BondPair·Interface·DropletStretch이며 외부 파일 의존성이 없다.
|
||||||
|
|
||||||
|
| 대표 | 끝 PNG | 전체 MP4 | 실제 실행 증거 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| c07 | [끝 PNG](render-attempts/55c4cb5b4dd88ff3-69267d17d19b/frame-00001219.png) | [4040ms](render-attempts/ade2a043a51a3c9f-855ff69849d6/clip.mp4) | [PNG](render-attempts/55c4cb5b4dd88ff3-69267d17d19b/evidence.json), [MP4](render-attempts/ade2a043a51a3c9f-855ff69849d6/evidence.json) |
|
||||||
|
| c16 | [끝 PNG](render-attempts/11205a80f142fff0-8a4233b821a3/frame-00003050.png) | [4880ms](render-attempts/9af0672466949ffe-e876251fcde8/clip.mp4) | [PNG](render-attempts/11205a80f142fff0-8a4233b821a3/evidence.json), [MP4](render-attempts/9af0672466949ffe-e876251fcde8/evidence.json) |
|
||||||
|
| c18 | [끝 PNG](render-attempts/9347ba3e949e9407-0ed92949aacd/frame-00003372.png) | [4000ms](render-attempts/c152ea48087b78fb-dc5644146e6c/clip.mp4) | [PNG](render-attempts/9347ba3e949e9407-0ed92949aacd/evidence.json), [MP4](render-attempts/c152ea48087b78fb-dc5644146e6c/evidence.json) |
|
||||||
|
|
||||||
|
대표 3 PNG와 MP4 시작·중간·마지막 실제 렌더 9 프레임을 view_image로 직접 열었다. 각 360×640 패널의 모바일 비교도 직접 확인했다.
|
||||||
|
|
||||||
|
- [c07 모바일 비교](generated-source/mobile-c07.png): 두 분자의 접근과 점선 축소 후 유지가 보이며 O1H2·실선·점선과 좌우 여백을 직접 확인했다. 실제 시작 대비 중간·끝 RGB 변화가 확인됐다.
|
||||||
|
- [c16 모바일 비교](generated-source/mobile-c16.png): 시작·중간·마지막 모두 전체 원자·실선·점선이 파란 물 영역 안에 보이고 내부→표면 강조와 연결 교체가 읽힌다. 실제 시작 대비 중간·끝 RGB 변화가 확인됐다.
|
||||||
|
- [c18 모바일 비교](generated-source/mobile-c18.png): 둥근 방울→중간 타원→늘어난 방울의 매끈한 실루엣과 여백을 직접 확인했다. 실제 시작 대비 중간·끝 RGB 변화가 확인됐다.
|
||||||
|
|
||||||
|
모든 대표의 probe·전체 디코드와 원본/Scene/profile/frame 대조가 종료코드 0 이다. 원본 1·대표 6·실행 증거 6·관찰 프레임 9·모바일 비교 3 의 **실물 25 파일** 경로와 SHA-256 은 design-check.json의 actual_assets에 있다. r2 결과는 섞이지 않는다. 최종 c07/c16/c18 MP4 는 각각 202/244/200 프레임이고 모든 대표 끝 PNG는 마지막 영상보다 정확히 1 프레임(20ms) 뒤다. 최종 검증과 직접 관찰을 완료했으며 새 사용자 scenes 결정은 대기 중이다.
|
||||||
@@ -23,7 +23,270 @@
|
|||||||
],
|
],
|
||||||
"payload": {
|
"payload": {
|
||||||
"characters": [],
|
"characters": [],
|
||||||
"backgrounds": [],
|
"backgrounds": [
|
||||||
"appearances": []
|
{
|
||||||
|
"id": "bg-droplet",
|
||||||
|
"description": "물방울의 크림색 3D 설명 공간",
|
||||||
|
"fixed_features": [
|
||||||
|
"references/1.png의 단순 형태·정돈된 색·정보량을 교육용 3D로 해석한다. 크림색 단순 공간·부드러운 조명·선명한 형태를 반복한다.",
|
||||||
|
"산호색 O·미색 H·남색 내부 O–H 실선·금색 서로 다른 분자 H···O 점선·청색 물을 일관되게 사용한다.",
|
||||||
|
"상하단에는 제목·자막용 빈 공간을 두고 부분전하·한국어 주석은 나중 Remotion에서 검증해 합성한다. 3D에 글자를 굽지 않는다.",
|
||||||
|
"청색 물방울은 닫힌 mesh이며 별도 껍질·막을 만들지 않는다.",
|
||||||
|
"같은 물의 양 변형은 실제 평가 mesh 부피를 시작·중간·끝에서 검사한다. 물리 시뮬레이션으로 주장하지 않는다."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "bg-molecules",
|
||||||
|
"description": "분자의 3D 근접·불규칙 액체 연결 설명 공간",
|
||||||
|
"fixed_features": [
|
||||||
|
"references/1.png의 단순 형태·정돈된 색·정보량을 교육용 3D로 해석한다. 크림색 단순 공간·부드러운 조명·선명한 형태를 반복한다.",
|
||||||
|
"산호색 O·미색 H·남색 내부 O–H 실선·금색 서로 다른 분자 H···O 점선·청색 물을 일관되게 사용한다.",
|
||||||
|
"상하단에는 제목·자막용 빈 공간을 두고 부분전하·한국어 주석은 나중 Remotion에서 검증해 합성한다. 3D에 글자를 굽지 않는다.",
|
||||||
|
"온전한 물 분자마다 O1H2·V자 형태·내부 O–H 실선 두 개를 유지한다. 각도·거리·힘 수치를 표시하지 않는다.",
|
||||||
|
"분자간 H···O 점선은 서로 다른 분자의 원자만 연결한다. 액체는 불규칙한 이웃·변하는 연결이고 모든 분자의 연결 수를 고정하지 않는다."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "bg-interface",
|
||||||
|
"description": "물-공기 경계의 3D 체적·절개 설명 공간",
|
||||||
|
"fixed_features": [
|
||||||
|
"references/1.png의 단순 형태·정돈된 색·정보량을 교육용 3D로 해석한다. 크림색 단순 공간·부드러운 조명·선명한 형태를 반복한다.",
|
||||||
|
"산호색 O·미색 H·남색 내부 O–H 실선·금색 서로 다른 분자 H···O 점선·청색 물을 일관되게 사용한다.",
|
||||||
|
"상하단에는 제목·자막용 빈 공간을 두고 부분전하·한국어 주석은 나중 Remotion에서 검증해 합성한다. 3D에 글자를 굽지 않는다.",
|
||||||
|
"전체 분자·결합이 물 체적 안에 포함되고 앞면·윗면만 열린 절개 설명 모형이며 위 공기는 진공 주장이 아니다. 별도 고체 표면층·전체 아래 가속 화살표가 없다.",
|
||||||
|
"안쪽은 다양한 방향의 액체 이웃, 표면은 위쪽 액체 이웃이 적은 환경으로 구별한다. 강조고리는 설명 표식이고 물 껍질이 아니다."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "bg-comparison",
|
||||||
|
"description": "같은 부피 비교·조건 예시의 크림색 3D 공간",
|
||||||
|
"fixed_features": [
|
||||||
|
"references/1.png의 단순 형태·정돈된 색·정보량을 교육용 3D로 해석한다. 크림색 단순 공간·부드러운 조명·선명한 형태를 반복한다.",
|
||||||
|
"산호색 O·미색 H·남색 내부 O–H 실선·금색 서로 다른 분자 H···O 점선·청색 물을 일관되게 사용한다.",
|
||||||
|
"상하단에는 제목·자막용 빈 공간을 두고 부분전하·한국어 주석은 나중 Remotion에서 검증해 합성한다. 3D에 글자를 굽지 않는다.",
|
||||||
|
"동일 부피 비교와 외부 영향 조건 예시는 별도 Scene으로 구별한다.",
|
||||||
|
"바닥은 조건 예시에만 등장한다. 중력·접촉각·크기 경계·표면장력 수치를 임의로 표시하지 않는다."
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"appearances": [
|
||||||
|
{
|
||||||
|
"cut_id": "c01",
|
||||||
|
"character_ids": [],
|
||||||
|
"background_ids": [
|
||||||
|
"bg-droplet"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c02",
|
||||||
|
"character_ids": [],
|
||||||
|
"background_ids": [
|
||||||
|
"bg-droplet"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c03",
|
||||||
|
"character_ids": [],
|
||||||
|
"background_ids": [
|
||||||
|
"bg-molecules"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c04",
|
||||||
|
"character_ids": [],
|
||||||
|
"background_ids": [
|
||||||
|
"bg-molecules"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c05",
|
||||||
|
"character_ids": [],
|
||||||
|
"background_ids": [
|
||||||
|
"bg-molecules"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c06",
|
||||||
|
"character_ids": [],
|
||||||
|
"background_ids": [
|
||||||
|
"bg-molecules"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c07",
|
||||||
|
"character_ids": [],
|
||||||
|
"background_ids": [
|
||||||
|
"bg-molecules"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c08",
|
||||||
|
"character_ids": [],
|
||||||
|
"background_ids": [
|
||||||
|
"bg-molecules"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c09",
|
||||||
|
"character_ids": [],
|
||||||
|
"background_ids": [
|
||||||
|
"bg-molecules"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c10",
|
||||||
|
"character_ids": [],
|
||||||
|
"background_ids": [
|
||||||
|
"bg-molecules"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c11",
|
||||||
|
"character_ids": [],
|
||||||
|
"background_ids": [
|
||||||
|
"bg-molecules"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c12",
|
||||||
|
"character_ids": [],
|
||||||
|
"background_ids": [
|
||||||
|
"bg-molecules"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c13",
|
||||||
|
"character_ids": [],
|
||||||
|
"background_ids": [
|
||||||
|
"bg-molecules"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c14",
|
||||||
|
"character_ids": [],
|
||||||
|
"background_ids": [
|
||||||
|
"bg-interface"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c15",
|
||||||
|
"character_ids": [],
|
||||||
|
"background_ids": [
|
||||||
|
"bg-interface"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c16",
|
||||||
|
"character_ids": [],
|
||||||
|
"background_ids": [
|
||||||
|
"bg-interface"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c17",
|
||||||
|
"character_ids": [],
|
||||||
|
"background_ids": [
|
||||||
|
"bg-interface"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c18",
|
||||||
|
"character_ids": [],
|
||||||
|
"background_ids": [
|
||||||
|
"bg-droplet"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c19",
|
||||||
|
"character_ids": [],
|
||||||
|
"background_ids": [
|
||||||
|
"bg-droplet"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c20",
|
||||||
|
"character_ids": [],
|
||||||
|
"background_ids": [
|
||||||
|
"bg-droplet"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c21",
|
||||||
|
"character_ids": [],
|
||||||
|
"background_ids": [
|
||||||
|
"bg-droplet"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c22",
|
||||||
|
"character_ids": [],
|
||||||
|
"background_ids": [
|
||||||
|
"bg-droplet"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c23",
|
||||||
|
"character_ids": [],
|
||||||
|
"background_ids": [
|
||||||
|
"bg-comparison"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c24",
|
||||||
|
"character_ids": [],
|
||||||
|
"background_ids": [
|
||||||
|
"bg-comparison"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c25",
|
||||||
|
"character_ids": [],
|
||||||
|
"background_ids": [
|
||||||
|
"bg-comparison"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c26",
|
||||||
|
"character_ids": [],
|
||||||
|
"background_ids": [
|
||||||
|
"bg-comparison"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c27",
|
||||||
|
"character_ids": [],
|
||||||
|
"background_ids": [
|
||||||
|
"bg-comparison"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c28",
|
||||||
|
"character_ids": [],
|
||||||
|
"background_ids": [
|
||||||
|
"bg-droplet"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c29",
|
||||||
|
"character_ids": [],
|
||||||
|
"background_ids": [
|
||||||
|
"bg-droplet"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c30",
|
||||||
|
"character_ids": [],
|
||||||
|
"background_ids": [
|
||||||
|
"bg-droplet"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cut_id": "c31",
|
||||||
|
"character_ids": [],
|
||||||
|
"background_ids": [
|
||||||
|
"bg-droplet"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
# 반복 요소 검토 · 09 r3
|
||||||
|
|
||||||
|
**새 사용자 scenes 승인 대기**를 제안한다. 사용자의 물 영역 포함 피드백을 새 r3에 반영했으며 이전 승인을 수정 결과의 승인으로 사용하지 않는다. project.json·승인은 총괄의 소유다.
|
||||||
|
|
||||||
|
02 r1의 과학 근거, 03 r1 대본, 실측 07 r1과 새 08 r3를 실제 읽어 inputs에 기록했다. 31컷의 appearances는 08 순서를 따라 정확히 한 번씩 존재하며 빈 character_ids를 유지한다. 이 설명에는 인물이 필요 없다. 분자·물방울은 가짜 character로 등록하지 않고 승인 후 10의 object 자산으로 다룬다.
|
||||||
|
|
||||||
|
- bg-droplet: 도입·같은 부피 변형·답 회수의 크림색 3D 공간. 청색 닫힌 물방울과 부드러운 명암, 별도 막 없음, 실제 mesh 부피 검사를 유지한다.
|
||||||
|
- bg-molecules: 단일·두 이웃·액체 연결의 3D 근접 공간. 산호 O1/미색 H2의 V자와 내부 남색 실선 두 개, 서로 다른 분자 H···O 금색 점선, 불규칙한 이웃·바뀌는 연결을 유지한다.
|
||||||
|
- bg-interface: 물-공기 경계의 체적 절개 설명 공간. 전체 원자·내부 실선·활성 점선이 실제 물 경계와 파란 화면 윤곽 안에 포함된다. 앞면·윗면은 실제 열린 절개이고 청색 설명 면은 별도 벽·막이 아니며 공기는 진공으로 해석하지 않는다. 내부/표면의 실제 이웃 배치 차이와 설명 강조고리를 구별한다.
|
||||||
|
- bg-comparison: 동일 부피 비교와 접촉면·외부 영향 조건 예시를 별도 Scene으로 구별한다. 바닥은 조건 예시에만 등장하며 접촉각·중력·크기 경계 수치를 넣지 않는다.
|
||||||
|
|
||||||
|
공통 고정 특징은 references/1.png의 단순 형태·정돈된 색을 교육용 3D로 해석한 밝은 크림색 배경, 부드러운 조명, 일관된 원자·결합·물 색과 상하단 글자 공간이다. 글자·부분전하는 나중 Remotion에서 검증해 배치한다. 고정 특징은 움직임·변형·연결 교체를 막지 않는다.
|
||||||
|
|
||||||
|
08의 같은 Scene/경계 상태를 공유하는 continuous 연결을 그대로 유지한다. 설명 범위나 조건이 바뀌는 cut에서는 다른 Scene을 계획했다. 근거에 없는 인물·캠핑 소재·상표·서사 반전은 추가하지 않았다. 대표 모델은 08 preview의 세 Scene이며 네 배경과 31 appearances의 정식 전 컷 모델을 완료했다고 주장하지 않는다.
|
||||||
|
|
||||||
|
검증: blender/verify_design.py는 실제 스키마·31컷 순서·빈 인물·유효 배경 ID·30연결·연속 경계 문자열/카메라를 검사한다. 최종 실제 실행 결과는 08 r3의 design-check.json·review.md와 대표 evidence에 연결한다. 10–12 시작 조건은 새 08/09에 대한 실제 사용자 scenes 승인이다.
|
||||||
|
|
||||||
|
실제 최종 검증: verify_design.py 종료코드 0, characters=[]·backgrounds=4·appearances=31. [08의 실제 대표 검토](../../08-scenes/r3/review.md), [설계와 복사 해시 근거](../../08-scenes/r3/design-check.json), [모바일 실제 관찰](../../08-scenes/r3/motion-check.json)을 참조한다. 02/03/07 r1과 승인 WAV를 보존했다. 새 08/09에 대한 사용자 결정은 아직 없으므로 정식 10–12를 완료하거나 새 scenes 승인을 기록하지 않는다.
|
||||||
Reference in New Issue
Block a user