This tutorial is outdated!
I found another, much easier way to create panorama-tours with PanoBlenderAddon, respectively how to read out the loacation/rotation values.
Read the new tutorial here:
Easy Tour Tutorial

With the release of PanoBlenderAddon1.1, a new feature called „TourMarker“ witch makes tour creating much more easy comes in!

Get the addon on Gumroad

The update is for free! If you have purchased the Addon, you should have recieved an eMail (check your spams). If not, please contact me.
To be sure that everything works fine, uninstall and remove the older version first.

In this tutorial I will show you, how to create a Panorama-Tour with PanoBlenderAddon and Krpano.

If you like you can download the example panoramas from here:
(01) (02) (03) (04) (05)

At the beginning we will create some blend-files. One Tour.blendfile to read out the positions and a number of pano.blendfiles, one file for each pano.

Let‘s start!

First Pano & Tour.blend

  • At first we create the Tour.blend and the first Pano_.blend file.
  • It will be the same… Just save it twice! 🙂
  • Create just few main things like the floor, doors, some walls.. This will help us later, to position the camera an rotate the panorama.
  • It is important to set the first panorama at 0/0/0, because it will be the reference for 3D positioning.
  • So press „Make ExportReady“ to set the location and rotation at 0/0/0.
  • Now add the first „PanoMarker“ and save the file twice (Tour.blend; Pano_01.blend)

Next Panoramas

  • Load the next panorama.
  • Position the cam and rotate the panorama until it fits the 3D-modell as good as possible.
  • Model some basics again..Then safe the file twice again.. (Tour.blend; Pano_2.blend)
  • But do not press „Make ExportReady“!
  • Repeat the last steps with all your panoramas!

At the end you will have:

  • One Tour.blend file with all the positions stored in.
  • And a number of Pano_.blend files with some basic geometrie and the right panorama loaded in.

Finish the Models

  • Load the pano_.blend files and finish the models.
  • Correct the mesh and delete all verticies, which were not needed.
  • First save the blend.file.
  • Then press „Make ExportReady“.
  • Export as STL.file (Don‘t forget to tick Ascii, Selection Only, Apply Modifiers).

Creating the Tour

  • For HotSpot creating, I have used code from the Abu Simbel Krpano example tour. (You find the modified code at the bottom of this page)
  • You only need to organize your panoramas in „scenes“ and prealignthem with the given locations and rotations from the Tour.blend.


<krpano version="1.20" title="PanoBlenderAdoon Tour" strict="true" debugmode="false">

	<include url="depthmap_navigation.xml" />
	<include url="skin/defaultskin.xml"/>

	<!-- setup stuff -->
	<events name="tourevents" keep="true" onxmlcomplete="setup_first_scene();" />

	<action name="setup_first_scene" scope="local">
		set(view, tx=get(image.ox), ty=get(image.oy), tz=get(image.oz));
		set(events[tourevents].onxmlcomplete, null);
			set(events[tourevents].onloadcomplete, moveto_scene_center() );
	<!-- startup action - load the first scene -->
	<action name="startup" autorun="onstart">
		if(startscene === null OR !scene[get(startscene)], copy(startscene,scene[0].name); );
		loadscene(get(startscene), null, MERGE);
		if(startactions !== null, startactions() );
	<!-- Automatically a floor-hotspot at each pano world location -->
	<action name="generate_floor_hotspots" autorun="onstart" scope="local">
		set(floorheight, 140.0);
		for(set(i,0), i LT style.count, inc(i),
			if (style[get(i)].autohotspot == true,
				copy(st, style[get(i)]);
				addhotspot(calc('floor_spot_' + (i+1)), hs);
				copy(hs.tx, st.ox);
				copy(, st.oz);
				calc(hs.ty, floorheight + 1.0*st.oy - 1.0);
				copy(hs.linkedscene, st.linkedscene);

	<style name="floorspot" keep="true" type="text"
		css="font-size:20px;text-align:center;" vcenter="true"
		width="200" height="200" scale="0.17"
		bgroundedge="100" bgborder="2 0x000000 1" bgshadow="0 0 5 0xFFFFFF 1.0"
		oversampling="2" mipmapping="true" zorder="1"
		distorted="true" depth="0" depthbuffer="true"
		torigin="world" rotationorder="xyz" rx="-90"
		onloaded.addevent="delayedcall(1.0, tween(alpha,0.5); );"
		onover.addevent="tween(scale,0.25); tween(alpha,0.7);"
		onout.addevent="tween(scale,0.17); tween(alpha,0.5);"

	<action name="floorspot_onclick" scope="local">
		if(xml.scene != caller.linkedscene,
	<!-- action for loading scenes -->
	<action name="tour_loadscene" scope="local" args="scenename">
		loadscene(get(scenename), null, MERGE|KEEPVIEW|KEEPMOVING, BLEND(1.0));
	<!-- transition actions -->

	<action name="moveto_scene_center" scope="local">
		if (global.customtransition != 'SKIP',

			if(global.customtransition !== null,
				tween(view.tx|view.ty|, calc(image.ox + '|' + image.oy + '|' + image.oz), 2.0, easeinoutsine);


		Depthmap Tour Organization
		- Using <style> elements to store the alignment and 3D world location of each scene.
		- That data can be also easily used to build hotspots for each scene automatically.
	<style name="Style_Pano_01" prealign="0|0|0"  ox="0" oy="0" oz="0" linkedscene="scene_Pano_01" autohotspot="true" />
	<!-- scenes -->
	<scene name="scene_Pano_01" title="Pano_01">

		<view hlookat="0.0" vlookat="0.0" fovtype="MFOV" fov="120" maxpixelzoom="1.0" fovmin="70" fovmax="140" limitview="auto" />

		<preview url="panos/pano_01.tiles/preview.jpg" />
		<image style="Style_Pano_01">
			<cube url="panos/pano_01.tiles/%s/l%l/%v/l%l_%s_%v_%h.jpg" multires="512,1152,2176,4352" />
			<depthmap url="panos/pano_01.tiles/pano_01.stl"


Hallo Mischer

Vielen Dank für das Tutorial. Irgendwie will es bei mir noch nicht richtig funmktionieren. Ich arbeite allerdings mit 3dsmax.
Braucht es für jede Kameraposition ein eigenes stl?
die Punkte für die Kamerapoistionen funktioniernen, allerdings wird das 3D Model bei den Kamera falsch in den Raum gestellt.

Hallo Stefan!
Kamerastandort und Origin müssen immer bei 0|0|0 liegen. Deshalb ist für jedes Panorama ein eigenes Model notwendig.
Beste Grüße!

Schreibe einen Kommentar

Spamschutz. Bitte die Aufgabe lösen * Time limit is exhausted. Please reload CAPTCHA.