diff --git a/README.md b/README.md index ac9b946..b8b59c2 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,33 @@ # panellum_generator -Configuration generator for Panellum Panorama Viewer. +Configuration generator for Panellum Panorama Viewer. https://pannellum.org/ ## Usage -python panoconfig.py input.txt -o index.htm +python panoconfig.py input.txt -o pannellum/index.htm put index.htm in panellum folder together with images inside images/ folder. ## input config file format -x,y,z,id,filename,angleoffset +FromFile,ToFile,Pitch,Yaw,TargetYaw|i -xyz have to be a consistent unit -angleoffset is positive if center of image is rotated ccw +## overlay Pitch and Yaw +run overlaylatLong.sh with .jpg files in same directory. +This will create an "overlay" directory with the fotos and a lat long overlay. +## Workflow +Add .jpg equirectengular 360 photos in a directory with overlayLatLong.sh . +Run overlayLatLong.sh +create a file (for example input.txt) +Add clickable hotspots in every line +Example: from kitchen.jpg to livingroom.jpg at pitch=0 and yaw=-30 (coordinats in from picture). +kitchen,livingroom,0,-30,i +(i for autocalculate yaw viewpoint in target photo) + +Every image in the "to" field has to exist at least once as "from". + +Download pannellum and put pannellum folder in directory next to the python file. +Run "python panoconfig.py input.txt -o pannellum/index.htm" to create index.htm with config in it. +Run python -m http.server in pannellum folder. +Navigate to http://localhost:8000 diff --git a/Rasteroverlay.png b/Rasteroverlay.png new file mode 100644 index 0000000..f525ebe Binary files /dev/null and b/Rasteroverlay.png differ diff --git a/Rasteroverlay.xcf b/Rasteroverlay.xcf new file mode 100644 index 0000000..0f6edb7 Binary files /dev/null and b/Rasteroverlay.xcf differ diff --git a/input.txt b/input.txt index 86544b6..d2a2656 100644 --- a/input.txt +++ b/input.txt @@ -1,3 +1,2 @@ -570,260,50,Outside,outside.jpg,10 -350,440,50,Inside,inside.jpg,270 -435,530,50,Room,room.jpg,-70 \ No newline at end of file +kitchen,livingroom,0,-30,i +livingroom,kitchen,0,165,i diff --git a/overlayLatLong.sh b/overlayLatLong.sh new file mode 100644 index 0000000..5db2ffd --- /dev/null +++ b/overlayLatLong.sh @@ -0,0 +1,9 @@ +#!/bin/bash +mkdir overlay + +for file in *.jpg +do + echo "$file" + convert "$file" Rasteroverlay.png -gravity Center -composite overlay/overlay_"$file" +done + diff --git a/panoconfig.py b/panoconfig.py index 7359b85..ace163e 100644 --- a/panoconfig.py +++ b/panoconfig.py @@ -1,9 +1,13 @@ import math import argparse +#old #input config file format: x,y,z,id,filename,angleoffset #angleoffset is 0 when center of 360 image points to the right, positive rotation means image center in pointing more CCW. value in degrees +#new: +#input config file format: FromFile,ToFile,Pitch,Yaw,TargetYaw|i,Text + parser = argparse.ArgumentParser( prog = 'File Edit Script', description = 'Read content of text file and write to file', @@ -40,57 +44,76 @@ with open(args.filename,'r') as rf: linesinput=rf.readlines() linesinput=[x.rstrip() for x in linesinput] #remove newline and whitespaces at end +linesmask=[True for x in linesinput] + output_scenes=[] first_sceneId=None for iline1,line1 in enumerate(linesinput): + if (linesmask[iline1]==False): + continue - x1,y1,z1,id1,filename1,angleoffset1=line1.split(',') - x1,y1,z1=(float(x1),float(y1),float(z1)) - angleoffset1=float(angleoffset1) - + print("Parsing: line1") + fromID,toID,pitch,yaw,targetYaw=line1.split(',') + + #if (targetYaw=='i'): + # targetYaw=0 + + #pitch,yaw,targetYaw=(int(pitch),int(yaw),int(targetYaw)) + if first_sceneId is None: - first_sceneId=id1 #take first entry as start scene + first_sceneId=fromID #take first entry as start scene # ### Set information for scene ### current_scene=template_scenes - current_scene=[x.replace('',id1) for x in current_scene] - current_scene=[x.replace('',id1) for x in current_scene] - current_scene=[x.replace('<filename>',filename1) for x in current_scene] + current_scene=[x.replace('<id>',fromID) for x in current_scene] + current_scene=[x.replace('<title>',fromID) for x in current_scene] + current_scene=[x.replace('<filename>',fromID+".jpg") for x in current_scene] output_hotspots=[] for iline2,line2 in enumerate(linesinput): - x2,y2,z2,id2,filename2,angleoffset2=line2.split(',') - x2,y2,z2=(float(x2),float(y2),float(z2)) - angleoffset2=float(angleoffset2) - + if (linesmask[iline2]==False): + continue + + fromID2,toID2,pitch2,yaw2,targetYaw2=line2.split(',') - if id1!=id2: + if fromID==fromID2: + linesmask[iline2]=False + print() - print("from "+str(x1)+", "+str(y1)+" : "+id1) - print("to "+str(x2)+", "+str(y2)+" : "+id2) - - print("dist="+str(distance(x1,y1,x2,y2))) - angle=math.degrees(math.atan2(y2-y1, x2-x1)) #in degrees - print("angle="+str(angle)+" offset1="+str(angleoffset1)+" offset2="+str(angleoffset2)) - angle+=angleoffset1 #correct hotspot position by rotation of scene image - print("angle final="+str(angle)) - pitch=-math.degrees(math.atan(z1/distance(x1,y1,x2,y2))) #from current looking to hotspot. 0deg=straight, 90deg=down - pitch=pitch/2 #manual correction - + if (targetYaw2=='i'): + targetYaw2=0 + for iline3,line3 in enumerate(linesinput): + fromID3,toID3,pitch3,yaw3,targetYaw3=line3.split(',') + if (toID2==fromID3 and fromID2==toID3): + targetYaw2=int(yaw3)-180 + if (targetYaw2<-180): + targetYaw2+=360 + print("Calculated Target Yaw="+str(targetYaw2)) + + pitch2,yaw2,targetYaw2=(int(pitch2),int(yaw2),int(targetYaw2)) + + + print("from "+str(fromID2)) + print("to "+str(toID2)) + + # ### Set information for target/hotspot ### current_hotspot=template_hotspots - current_hotspot=[x.replace('<id>',id2) for x in current_hotspot] - current_hotspot=[x.replace('<yaw>',str(angle)) for x in current_hotspot] - current_hotspot=[x.replace('<pitch>',str(pitch)) for x in current_hotspot] + current_hotspot=[x.replace('<id>',toID2) for x in current_hotspot] + current_hotspot=[x.replace('<yaw>',str(yaw2)) for x in current_hotspot] + current_hotspot=[x.replace('<pitch>',str(pitch2)) for x in current_hotspot] + current_hotspot=[x.replace('<targetyaw>',str(targetYaw2)) for x in current_hotspot] + output_hotspots.append(current_hotspot) + output_hotspots_string="" diff --git a/template_hotspots.txt b/template_hotspots.txt index 8a16c7e..b824fbf 100644 --- a/template_hotspots.txt +++ b/template_hotspots.txt @@ -4,6 +4,6 @@ "type": "scene", "text": "<id>", "sceneId": "<id>", - "targetYaw": 0, + "targetYaw": <targetyaw>, "targetPitch": 0 - } \ No newline at end of file + }