change to individual hotspot definitions
This commit is contained in:
parent
c88256a845
commit
e2b2346f76
26
README.md
26
README.md
|
@ -1,17 +1,33 @@
|
||||||
# panellum_generator
|
# panellum_generator
|
||||||
|
|
||||||
Configuration generator for Panellum Panorama Viewer.
|
Configuration generator for Panellum Panorama Viewer.
|
||||||
https://pannellum.org/
|
https://pannellum.org/
|
||||||
|
|
||||||
## Usage
|
## 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.
|
put index.htm in panellum folder together with images inside images/ folder.
|
||||||
|
|
||||||
## input config file format
|
## input config file format
|
||||||
x,y,z,id,filename,angleoffset
|
FromFile,ToFile,Pitch,Yaw,TargetYaw|i
|
||||||
|
|
||||||
xyz have to be a consistent unit
|
## overlay Pitch and Yaw
|
||||||
angleoffset is positive if center of image is rotated ccw
|
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
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 104 KiB |
Binary file not shown.
|
@ -1,3 +1,2 @@
|
||||||
570,260,50,Outside,outside.jpg,10
|
kitchen,livingroom,0,-30,i
|
||||||
350,440,50,Inside,inside.jpg,270
|
livingroom,kitchen,0,165,i
|
||||||
435,530,50,Room,room.jpg,-70
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -1,9 +1,13 @@
|
||||||
import math
|
import math
|
||||||
import argparse
|
import argparse
|
||||||
|
|
||||||
|
#old
|
||||||
#input config file format: x,y,z,id,filename,angleoffset
|
#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
|
#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(
|
parser = argparse.ArgumentParser(
|
||||||
prog = 'File Edit Script',
|
prog = 'File Edit Script',
|
||||||
description = 'Read content of text file and write to file',
|
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=rf.readlines()
|
||||||
|
|
||||||
linesinput=[x.rstrip() for x in linesinput] #remove newline and whitespaces at end
|
linesinput=[x.rstrip() for x in linesinput] #remove newline and whitespaces at end
|
||||||
|
linesmask=[True for x in linesinput]
|
||||||
|
|
||||||
|
|
||||||
output_scenes=[]
|
output_scenes=[]
|
||||||
|
|
||||||
first_sceneId=None
|
first_sceneId=None
|
||||||
|
|
||||||
for iline1,line1 in enumerate(linesinput):
|
for iline1,line1 in enumerate(linesinput):
|
||||||
|
if (linesmask[iline1]==False):
|
||||||
|
continue
|
||||||
|
|
||||||
x1,y1,z1,id1,filename1,angleoffset1=line1.split(',')
|
print("Parsing: line1")
|
||||||
x1,y1,z1=(float(x1),float(y1),float(z1))
|
fromID,toID,pitch,yaw,targetYaw=line1.split(',')
|
||||||
angleoffset1=float(angleoffset1)
|
|
||||||
|
#if (targetYaw=='i'):
|
||||||
|
# targetYaw=0
|
||||||
|
|
||||||
|
#pitch,yaw,targetYaw=(int(pitch),int(yaw),int(targetYaw))
|
||||||
|
|
||||||
if first_sceneId is None:
|
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 ###
|
# ### Set information for scene ###
|
||||||
current_scene=template_scenes
|
current_scene=template_scenes
|
||||||
current_scene=[x.replace('<id>',id1) for x in current_scene]
|
current_scene=[x.replace('<id>',fromID) for x in current_scene]
|
||||||
current_scene=[x.replace('<title>',id1) for x in current_scene]
|
current_scene=[x.replace('<title>',fromID) for x in current_scene]
|
||||||
current_scene=[x.replace('<filename>',filename1) for x in current_scene]
|
current_scene=[x.replace('<filename>',fromID+".jpg") for x in current_scene]
|
||||||
|
|
||||||
output_hotspots=[]
|
output_hotspots=[]
|
||||||
|
|
||||||
for iline2,line2 in enumerate(linesinput):
|
for iline2,line2 in enumerate(linesinput):
|
||||||
x2,y2,z2,id2,filename2,angleoffset2=line2.split(',')
|
if (linesmask[iline2]==False):
|
||||||
x2,y2,z2=(float(x2),float(y2),float(z2))
|
continue
|
||||||
angleoffset2=float(angleoffset2)
|
|
||||||
|
fromID2,toID2,pitch2,yaw2,targetYaw2=line2.split(',')
|
||||||
|
|
||||||
|
|
||||||
if id1!=id2:
|
if fromID==fromID2:
|
||||||
|
linesmask[iline2]=False
|
||||||
|
|
||||||
print()
|
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 ###
|
# ### Set information for target/hotspot ###
|
||||||
current_hotspot=template_hotspots
|
current_hotspot=template_hotspots
|
||||||
current_hotspot=[x.replace('<id>',id2) for x in current_hotspot]
|
current_hotspot=[x.replace('<id>',toID2) for x in current_hotspot]
|
||||||
current_hotspot=[x.replace('<yaw>',str(angle)) for x in current_hotspot]
|
current_hotspot=[x.replace('<yaw>',str(yaw2)) for x in current_hotspot]
|
||||||
current_hotspot=[x.replace('<pitch>',str(pitch)) 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.append(current_hotspot)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
output_hotspots_string=""
|
output_hotspots_string=""
|
||||||
|
|
|
@ -4,6 +4,6 @@
|
||||||
"type": "scene",
|
"type": "scene",
|
||||||
"text": "<id>",
|
"text": "<id>",
|
||||||
"sceneId": "<id>",
|
"sceneId": "<id>",
|
||||||
"targetYaw": 0,
|
"targetYaw": <targetyaw>,
|
||||||
"targetPitch": 0
|
"targetPitch": 0
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue