Customizing Your 3DVista Tour Code: Hacking the Output

3DVista tours come with HTML, CSS, and JavaScript files. With a few simple code tweaks, you can change things that the 3DVista software doesn’t let you adjust on its own. In this guide, we use plain language and examples to explain what each part of the tour code does. You’ll also learn how to safely make useful changes – from changing the start scene or colors to integrating with WordPress or an LMS.

How the Tour’s Pieces Work Together

Every virual tour outputs these files:

  • HTML & CSS – HTML defines the page structure, and CSS defines the look. Together, they create the full-screen viewer layout and the loading screen.
  • tdvplayer.js – loads the 360° images and stitches them into a smooth interactive view (using WebGL, a 3D graphics technology). It also listens for user input like clicks or touch drags.
  • tdvquiz.js(optional) shows quiz pop-ups, times answers, and tracks scores if your tour has quizzes.
  • tdvremote.js(optional) lets another page or device send commands to, or mirror, the tour (used for live guided tours or remote control features).
  • script.js – your tour’s setup file. It decides which scene to show first. It also sets up what happens when a scene is loaded and adjusts settings for desktop vs. mobile.
  • manifest.json – a JSON (JavaScript Object Notation) file for Progressive Web App settings. It helps the tour act like a mobile app. For example, it sets the app’s name, icon, and theme color when someone saves the tour to their phone.
  • WebP image tiles – small pieces of each panorama image. WebP is a modern image format that loads quickly. The tour loads low-detail tiles first, then swaps in higher detail as you look around.

Details About These Files:

1 · HTML & CSS — The Visual Frame

What 3DVista gives you: A full-screen page plus a stylesheet that paints the loading spinner and basic layout.

  • Tweak ideas: Swap the spinner for your logo, add a high-contrast style sheet, create a sticky “Take the Quiz” button on phones.

2 · tdvplayer.js — The 360° Engine

What 3DVista gives you: A JavaScript file that loads all image tiles and draws them with WebGL (the browser’s 3D paintbrush).

  • Change the default zoom so visitors start close to a key detail.
  • Limit frame rate on tablets to save battery.
  • Send a Google Analytics event whenever a user pans 180°.

When someone spins the view a full 180 degrees, you know they are really exploring the scene. That single Google Analytics event is handy for five big reasons:

  1. Proves deep interest. A half-turn shows the visitor looked behind them instead of skimming the front, so you can flag them as highly engaged rather than casual.
  2. Reveals missed content. If few users ever trigger the 180° event, it tells you most people stay within the front half of the sphere—you may need to move key visuals forward.
  3. Feeds heat-map insights. Logging every half-turn lets you chart where heads point over time, building simple “which way they looked” heat-maps without extra tools.
  4. Improves scene design. Compare 180° counts across panoramas; a room with low counts may feel dull or confusing, telling you to add cues or hotspots.
  5. Counts as a real interaction. Firing a non-interaction event keeps bounce-rate honest and lets you build funnels like “Scene load → half-turn → hotspot click,” giving cleaner analytics than pageviews alone.

3 · tdvquiz.js — The Quiz Engine

What 3DVista gives you: An optional module that pops up questions and records scores.

    A WordPress REST:
    It’s a special web address on your site that starts with /wp-json/.
    You create the address in your plugin or theme with the register_rest_route() function.
    When your quiz sends a POST request to that address—such as /wp-json/quiz/v1/answer—WordPress runs the PHP function you linked to it.
    That function stores the answer in the database.
    Think of the REST route as the doorway, the POST as the knock, and your PHP code the delivery.

    • Namespace – the first segment (quiz/v1) keeps your routes separate from core ones.
    • Route path – the second part (/answer) identifies what the call is for.
    • HTTP method – you usually allow POST so the tour can push JSON like { "question": 3, "choice": "B" }.
    • Callback – a PHP function that grabs the data and updates the database (for example update_user_meta( $user_id, 'quiz_progress', $new_data );).

    In short, the REST route is simply the doorway (/wp-json/quiz/v1/answer) that your tour calls; WordPress handles the door and hands your code the payload so you can record each answer and track progress.

  • You can shuffle question order for replay value.

4 · tdvremote.js — The Remote Control Module

What 3DVista gives you: Lets another browser or device steer the tour—great for guided lessons.

  • Live teacher panel. Each student’s viewer sends its “camera angle” (where they are looking) to a simple web page. The teacher sees colored dots that move in real time, so she can tell if everyone is viewing the correct part of the scene—like watching laser pointers on a map.
  • Synchronized museum screens. Run the tour on two large monitors side-by-side. The remote module keeps both viewers locked together, so when one pans left or zooms in, the other does exactly the same. The result looks like one extra-wide “video wall” without complex hardware.

5 · script.js — Your Command Center

What 3DVista gives you: One little file called script.js. Inside it, 3DVista already picks the first scene and listens for clicks or taps. The fun starts when you add a few new lines. Think of script.js as the tour’s remote control: change the code, and the tour does new tricks.

  • Start in a different scene each morning, afternoon, and night.
    Example: Show a sunny courtyard if the visitor arrives before noon, a sunset rooftop after 6 pm – perfect for real-estate or travel sites.
  • Jump to a random “hidden gem” scene.
    Add a tiny “Surprise Me” button. Every click teleports the user to a new, less-seen panorama and keeps the tour fresh.
  • Auto-enter VR when the phone enters a headset.
    Phones have motion sensors. One line in script.js can check if the device sits in landscape-upside-down (the Cardboard position) and switch to VR view automatically – no extra tap needed.
  • Play background music only once.
    Store a flag in localStorage: if a visitor comes back tomorrow, skip the intro music so they aren’t startled twice.
  • Send a Zapier webhook at key moments.
    • When “Gallery” loads → Zapier logs the visit to a Google Sheet.
    • When the final scene ends → Zapier emails you “Tour finished – John Doe.”
    • When a quiz score ≥ 80 % → Zapier posts a Slack cheer in #wins.
  • Unlock WordPress content mid-tour.
    Hit the WordPress REST API to mark a lesson “complete.” The site then reveals the next module without reloading the page.
  • Show live weather on an outdoor pano.
    Fetch a free weather API every 10 minutes and overlay the temperature in the corner. Viewers see real-time conditions at the location they’re exploring.
  • Trigger a CRM tag for hot leads.
    When viewers spend more than two minutes in the “Penthouse” scene, script.js pings your CRM (Customer Relationship Manager) to tag them as “High Interest – Luxury.” Your sales team gets an instant notice.
  • Swap image tiles for slow networks.
    Detect connection speed; if it’s slow, call player.setTilePath('panos_low/'); to use lighter tiles. Fast networks keep the ultra-sharp default set.
  • Build a live leaderboard.
    Send each quiz score to a tiny Firebase database. Reload the scores into an overlay so students can see who’s on top in real time.
  • Add voice commands.
    A short script ties the Web Speech API to tour actions: say “Next room” to move forward, or “Map” to open the floor plan – great for hands-free kiosks.

Social Share Previews: What 3DVista Does and What You Need to Do

No, 3DVista Doesn’t Add Social Meta Tags for You

The HTML file exported by 3DVista includes the basics like <meta charset>, <meta viewport>, app icons, and PWA setup. But it does not include any Open Graph (og:) or Twitter Card tags.

That means if someone shares your tour link on Facebook, LinkedIn, or Twitter/X, the platform may only show a plain URL or scrape a title from the page—not a preview image or custom description.

Open Graph preview example
Example of a Facebook or LinkedIn Open Graph preview card
Twitter Card preview example
Example of a Twitter Card preview using summary_large_image

How to Control the Social Preview

Checklist of Tags to Add

<meta property="og:title"       content="Walk Through the Penthouse in 360°">
<meta property="og:description" content="Explore every room, click hotspots for details, and take the quiz at the end.">
<meta property="og:image"       content="https://yourcdn.com/tour/social-thumb.jpg">
<meta property="og:url"         content="https://tours.yourbrand.com/penthouse">

<meta name="twitter:card"        content="summary_large_image">
<meta name="twitter:title"       content="Walk Through the Penthouse in 360°">
<meta name="twitter:description" content="Interactive 3D tour—no VR goggles needed.">
<meta name="twitter:image"       content="https://yourcdn.com/tour/social-thumb.jpg">

Tip: Create your wrapper once, host it on a branded subdomain like tours.yourbrand.com, and always point social traffic to that page. You’ll get full preview control on all major platforms—without ever needing to touch your exported tour again.

Five Easy Code Snippets for script.js

  1. Start in a scene that matches the time of day.
    /* ------------- Time-based start scene ------------- *
       Morning (5-11)  →  "Garden"
       Afternoon (11-17) → "Lobby"
       Evening / Night   →  "Rooftop"
    */
    (function () {
      var h = new Date().getHours();         // current hour (0-23)
      var scene = (h < 11) ? "Garden"
        : (h < 17) ? "Lobby"
        :              "Rooftop";
      player.once('tourReady', function () { // wait till viewer is ready
        player.loadScene(scene);
      });
    })();

    Why it helps: Visitors see a scene that fits the real sun outside, making the tour feel “alive.”

  2. Auto-switch to VR when a phone drops into a cardboard headset.
    /* ------------- Auto-VR on rotation ------------- *
       Phone flips landscape-upside-down → enter VR
       Phone upright again             → exit VR
    */
    (function () {
      window.addEventListener('deviceorientation', function (e) {
        if (!player) return;
        var autoVr = Math.abs(e.gamma) > 70 && Math.abs(e.beta) < 30;
        if (autoVr && !player.isVR())  player.enterVR();
        if (!autoVr && player.isVR())  player.exitVR();
      }, true);
    })();

    Why it helps: Hands-free VR—no tiny buttons to press.

  3. Send a Zapier webhook when the final scene ends.
    /* -------- Send “tour finished” to Zapier -------- *
       Replace YOUR_WEBHOOK_URL with the unique URL
       Zapier gives you.
    */
    (function () {
      var done = false;
      player.on('sceneEnded', function () {
        if (done) return;     // fire once
        done = true;
        fetch('https://hooks.zapier.com/hooks/catch/XXXXXX/YOUR_WEBHOOK_URL', {
          method: 'POST',
          body: JSON.stringify({ event: 'tour_end', time: Date.now() })
        });
      });
    })();

    Why it helps: Zapier can email you, post to Slack, or add a row to Google Sheets the instant someone finishes.

  4. Show live weather data in an outdoor scene.
    /* -------------- Live weather overlay -------------- *
       Pulls current temperature from the free Open-Meteo API
       every 15 min and writes it into <div id="weatherBox">
    */
    (function refreshWeather () {
      var lat = 28.6084, lon = -80.6040;           // Cape Canaveral example
      fetch('https://api.open-meteo.com/v1/forecast?latitude=' + lat +
            '&longitude=' + lon + '&current_weather=true')
        .then(r => r.json())
        .then(j => {
          var w = j.current_weather;
          document.getElementById('weatherBox').textContent =
            w.temperature + ' °C · code ' + w.weathercode;
        })
        .catch(console.error)
        .finally(() => setTimeout(refreshWeather, 15*60*1000));
    })();

    Why it helps: Outdoor panoramas feel current—perfect for open-air attractions or property tours.

  5. Push high quiz scores to a live leaderboard (Firebase).
    /* ------------- Firebase live leaderboard ------------- *
       Needs a free Firebase project. Replace the config keys
       and add Firebase SDK scripts in your HTML <head>.
    */
    (function () {
      var cfg = {
        apiKey:      "YOUR_KEY",
        authDomain:  "your-app.firebaseapp.com",
        projectId:   "your-app",
        databaseURL: "https://your-app.firebaseio.com"
      };
      firebase.initializeApp(cfg);
      var db = firebase.database().ref('scores');
    
      // Write score when quiz ≥ 80 %
      player.on('quizFinished', function (d) {
        if (d.scorePercent >= 80) {
          var n = prompt('Great score! Name for the board:','');
          db.push({ name: n || 'Anon', score: d.scorePercent, time: Date.now() });
        }
      });
    })();

    Why it helps: Students see their names climb a real-time scoreboard—instant motivation!

  6. Tip: Each block is self-contained. Paste, save, refresh.

    Bottom line: If HTML is your house and CSS is the paint, script.js is the light switch, thermostat, and garage-door opener in one. A few lines of plain JavaScript turn a normal 3DVista tour into an app that responds to time of day, user behaviour, outside data, and even voice commands – all without leaving the browser.

    6 · manifest.json — The App Shell

    What 3DVista gives you: A small JSON file that turns the tour into a Progressive Web App (installable on phones).

    • Change the theme color so the phone’s address bar matches your brand.
    • Make it open like a real app.
      In manifest.json set
      "display": "standalone"
      What it does: When someone saves the tour to their phone’s home screen (Android or iOS), the tour launches in its own window without the browser’s address bar or tabs. It looks and feels like a native app you downloaded from an app store.

      Everyday example: Add “amazon.com” to your home screen and it still opens inside a browser with the URL bar. Add a PWA such as “Twitter Lite” and it opens full-screen with its own icon and no browser chrome. Setting "display": "standalone" gives your virtual tour that same polished, app-like experience.
    • Supply larger icons for 4K devices.

    What 3DVista Already Does and Doesn’t Do

    1. Start in a different scene each morning, afternoon, and night: YES (using 3DVista’s scripting interface)  BUT: There is no built-in scheduling for start scenes. A custom script in script.js must check the current time and jump to the right panorama. This logic can also store user data so viewers return to their last scene. In short, time-based scene selection works, but only by injecting a small JS snippet (no external tools required).

    2. Jump to a random “hidden gem” scene via a “Surprise Me” button: YES (using 3DVista’s scripting interface)  BUT: 3DVista has no native “random scene” action. You must list hidden panoramas in a script, then let a Skin-Editor button trigger a JS function that picks one at random and loads it through the API. A few lines of code create the effect, but it isn’t a built-in toggle.

    3. Auto-enter VR when the phone enters a headset (orientation detect): YES (using 3DVista’s scripting interface)  BUT: Users normally tap the VR icon. To auto-switch you must add JavaScript that listens for device-orientation events and calls the player’s VR function. It’s doable without an external app, but not exposed in the UI.

    4. Play background music only once per visitor: YES (using 3DVista’s scripting interface)  BUT: The tour itself can’t remember visitors. A short script must store a localStorage flag after the first play, then mute or skip the audio on future visits. No visual setting exists for this.

    5. Send Zapier webhooks at key moments (scene load, tour finish, quiz score): YES (using 3DVista’s scripting interface)  BUT: You must hook into events like player.bind('panoramaActivated') and post data out with fetch(). There’s no Zapier button—only raw JavaScript plus a catch URL.

    6. Unlock WordPress content mid-tour via API call: YES (using 3DVista’s scripting interface)  BUT: The tour can’t talk to WP on its own. A custom fetch('https://yourwp.com/wp-json/...') in a “Run JavaScript” action must trigger the unlock. You may also route through Zapier—either way, code is required.

    7. Show live weather data on outdoor panoramas: YES (using scripting or plugin)  BUT: Live data isn’t native. You either install a Skin-CMS-type add-on or write a script that calls an API like OpenWeather every few minutes and updates a label or icon. Without that code, the tour remains static.

    8. Trigger a CRM tag when a user spends 2+ minutes in a specific scene: YES (using 3DVista’s scripting interface)  BUT: Timer logic must be scripted. You listen for scene entry, start a setTimeout, and if the user stays long enough, send a webhook to the CRM. It’s fully possible, but not point-and-click.

    9. Swap image tile sets based on network speed (low-res fallback): NO (requires custom scripting or external tools)  BUT: 3DVista provides multi-resolution tiles but cannot pick an alternate panorama set based on bandwidth. You’d need a wrapper that measures speed and loads a separate low-quality tour or script that swaps scenes manually—both heavy custom work.

    10. Build a real-time leaderboard from quiz scores: NO (requires custom scripting or external tools)  BUT: Scores live only in the user’s session. To aggregate them you must post each score to an external database or Google Sheet, then pull the top results back into the tour via an HTML widget or dynamic text.

    11. Add voice-command support (“Next room”, “Open map”): NO (requires custom scripting or external tools)  BUT: The software has no speech recognition. You’d embed the Web Speech API (or similar), parse commands, and call the 3DVista JS API—complex code well outside the base editor.

    Optimizing Images in 3DVista Virtual Tours

    3DVista makes great 360° tours, but its built-in image export has limits. Below you’ll find:

    1. Clear, plain-English notes on those limits.
    2. Free tools (and a few pro tools) that fix or improve things after export.
    3. Simple examples so anyone—no coding needed—can try them.

    Key Limits in 3DVista’s Image Export

    • Single image format only. You must choose WebP / JPEG / PNG or AVIF for the whole tour. If a visitor’s browser can’t read that format, images will not load.
    • WebP and AVIF work only in new browsers. Old Safari, Internet Explorer, and many kiosk setups won’t show them.
    • Tile system is “one size fits all.” 3DVista slices each panorama into hundreds of small tiles. You can’t pick tile size, number of levels, or mix formats per level. Large tours may end up with thousands of tiny files.
    • Basic quality slider only. You get a “Quality %” box; that’s it. No MozJPEG, no advanced WebP tuning, no per-scene control.
    • Two build choices: “all-devices” or “mobile copy.” A separate “Mobile Version” halves resolution and size but doubles storage. No automatic per-device format switching.

    Free Tools That Unlock Better Images

    • ImageMagick (Windows / Mac / Linux).
      • Convert WebP tiles to JPEG for old browsers: mogrify -format jpg *.webp
      • Batch compress JPEG tiles to 70 %: mogrify -quality 70 *.jpg
    • Squoosh (Web app and CLI).
      • Drag a tile into squoosh.app, choose MozJPEG or WebP, slide until it still looks crisp.
      • Use Squoosh CLI to batch-recode all tiles with those settings.
    • IrfanView / XnConvert. Friendly “batch convert” windows—no command line. Good for quick format swaps or resizing.
    • ImageOptim (Mac). Drag-and-drop lossless shrink: strips metadata, reorders data, saves 10-30 %.

    Advanced (Optional) Power-Ups

    • CDNs like Cloudflare. Cache tiles worldwide. Many CDNs can auto-convert images to WebP for modern browsers and fall back to JPEG for others.
    • JPEGmini, Kraken.io, TinyPNG. Paid—or freemium—services that squeeze every last kilobyte out of JPEG/PNG without visible loss.
    • Prep images before import. Use Photoshop, Lightroom, or GIMP to sharpen, correct colors, or downscale responsibly before bringing them into 3DVista. Better input = better tiles later.
    • Custom code tweaks. After export, you can add a <picture> tag around each tile link to serve AVIF → WebP → JPEG in that order, or lazy-load non-pano images with loading="lazy". This takes manual editing but gives fine control.

    Practical “How-To” Samples

    • Serve a fallback JPEG set.
      1) Batch-convert every .webp tile to .jpg.
      2) In viewer.js (or your loader), test if the browser supports WebP. If not, switch the tile path from panos/ to panos_jpg/.
    • Ultra-fast school tour for mobile data.
      • Inside 3DVista: export at 50 % resolution, set quality to 70 %.
      • After export: run ImageMagick -quality 60 on tiles, then host on Cloudflare. Students on slow 3G still see the tour quickly.
    • Retina upgrade for museum kiosk.
      1) Export a second tour at 2× resolution; copy its panos folder to tiles_hd.
      2) Add one line in script.js: if (window.devicePixelRatio > 1.5) viewer.setTilePath('tiles_hd/');
      The kiosk’s 4 K monitor now looks razor-sharp.

    Bottom Line

    3DVista’s quick export works fine out of the box, but a little post-export tweaking can make tours load faster, work on every browser, and look sharper on any screen. With free tools like ImageMagick and Squoosh—or a CDN that serves the right format automatically—you can beat the built-in limits without touching the tour editor again.

    The Big Payoff

    Because 3DVista ships all these files automatically, you can edit each one for speed, brand style, data tracking, or clever integrations. A few tiny tweaks turn a “plain” tour into a living web app that talks to WordPress, Zapier & friends, and beyond.

    Example 1 – Change Start Scene

    You can start the tour in a different room (scene) by editing script.js:

    
    // Original: start in Lobby
    TDV.PlayerAPI.create({ startScene: "Lobby" });
    
    // Change to Garden
    TDV.PlayerAPI.create({ startScene: "Garden" });
      

    Benefit: You highlight your best room first.

    Example 2 – Faster Loading Fade

    To make the loading screen vanish faster, tweak your CSS:

    
    #preloadContainer {
      transition: opacity 0.2s ease; /* fade out in 0.2 seconds */
    }
    #preloadContainer.loaded {
      opacity: 0;
    }
      

    Benefit: The tour feels snappier and more alive.

    Example 3 – Change Quiz Button Color

    If you want blue quiz buttons instead of red, add this CSS rule:

    
    .vista-modifications .tdv-quiz-button {
      background-color: #007aff; /* bright blue */
    }
      

    Benefit: Matches your brand or improves contrast for all users.

    More Tweaks You Can Make

    • Fonts: Change the font-family in your CSS (for example, in the .vista-modifications class) to use any Google Font you like.
    • Image Format: In your tour’s config settings, switch tileFormat: "webp" to "jpg" if you need to support older browsers that don’t display WebP images.
    • Mobile Layout: Add a media query:
    
    @media (max-width: 767px) {
      .vista-modifications #viewer {
        height: 60vh; /* show more page and less viewer on phones */
      }
    }
      

    Benefit: Keeps your page neat on small screens.

    • Metadata & SEO: Edit the HTML <head> section to add your own meta tags. For example, you can add a <meta name="description" content="Your tour description"/> for better search results. You can also include social media sharing tags so that Facebook and Twitter show a nice preview when your tour link is shared. These tweaks improve how your tour looks on search engines and social networks.
    • Metadata & SEO: Improve the hidden “data about the page” that search engines read.
      • Meta description:
        <meta name="description" content="Walk through our 360° tour of the Space Museum. See rockets in full detail.">
        A short summary. Google often shows this text under your link.
      • Meta title (override the browser title if needed):
        <title>Virtual Space Museum – 360° Tour</title>
      • Canonical link: tells search engines which URL is the “real” one if the tour can load from more than one address.
        <link rel="canonical" href="https://example.com/space-tour/">
      • Robots tag: control indexing.
        <meta name="robots" content="index,follow"> (or noindex if you want to hide a test page)
      • Open Graph (Facebook, LinkedIn) + Twitter Card:
        <meta property="og:title" content="Explore the Space Museum">
        <meta property="og:image" content="https://example.com/preview.jpg">
        <meta name="twitter:card" content="summary_large_image">
      • JSON-LD (JavaScript Object Notation – Linked Data):
        A block of machine-readable data wrapped in a single script tag. Google recommends this because it is easy to parse.
        <script type="application/ld+json">
        {
          "@context": "https://schema.org",
          "@type": "TouristAttraction",
          "name": "Virtual Space Museum Tour",
          "description": "An online 360° walk-through of real rockets and satellites.",
          "url": "https://example.com/space-tour/",
          "image": "https://example.com/preview.jpg",
          "provider": {
            "@type": "Organization",
            "name": "Galactic Medallion"
          }
        }
        </script>
        Why JSON-LD is good:
        • It sits anywhere in the page (no need to cram inside the <head>).
        • It is easy to extend with extra fields such as location, rating, or event.
        • Search engines like Google can show rich results (stars, dates, prices) when JSON-LD is present.
      • Geographic & language tags:
        <meta name="geo.region" content="US-FL">
        <meta http-equiv="content-language" content="en">
        These help local search match the right audience.

      Benefit: Thoughtful metadata makes your tour easier to find, shares with a nice preview, and can even earn “rich-snippet” treatment (extra info shown right on the search page).

    • WordPress Integration: Use JavaScript in script.js to trigger WordPress actions when certain events happen. For instance, you could call a WordPress REST API when a scene loads or when the tour ends. This lets your site record the event or unlock new content.
    • WordPress Integration: Your tour can talk to WordPress in many ways. Add a few lines of JavaScript in script.js and WordPress can:
      • Log scene views: When a scene loads, send fetch('/wp-json/wp/v2/tour-log', {method: 'POST', body: JSON.stringify({scene: 'Lobby'})}). WordPress stores each hit and builds a “Most-Viewed Rooms” widget.
      • Unlock hidden content: After the final scene, call a REST endpoint that sets a user-meta flag. WordPress shows a members-only download link once the flag exists.
      • Trigger Elementor pop-ups: Use window.dispatchEvent(new CustomEvent('tourComplete')). An Elementor “Popup on Custom Event” listens for tourComplete and shows a signup form.
      • Save quiz scores to user profile: On quizFinished, fire an AJAX request that runs update_user_meta( $user_id, 'last_quiz', $score ). Teachers see progress inside the WordPress dashboard.
      • Show live WordPress data inside the tour: Fetch a JSON feed (posts, WooCommerce products, events) and inject the list into a hotspot pop-up so visitors always see the latest info without republishing the tour.
      • Run server-side hooks: Hit a custom REST route that calls do_action( 'tour_scene_viewed', $scene ). Developers can attach any WordPress hook—send an email, tag a CRM (software that stores and tracks customer details), or add points in a gamification plugin.
      • Benefit: These small API calls let the tour and WordPress share data in real time—turning a standalone 360° view into a fully connected part of your website’s content, marketing, and user-tracking systems.

      • Zapier Automation: Send tour data to a Zapier webhook URL. (Zapier is a service that connects different apps.) For example, when the tour ends it could send a message to Zapier. Zapier could then email you a report or add a row to a Google Sheet.
      • Zapier Automation: Zapier is an online tool that lets one app trigger actions in another app without coding. A single HTTP POST from your tour to a Zapier Webhook URL can set off a whole chain of tasks.
        • Instant emails: When the tour ends, send a webhook. Zapier emails the visitor a thank-you note and their quiz score.
        • Google Sheets log: Each time a scene loads, the tour posts {scene:"Lobby",time:"14:02"}. Zapier adds a new row—no spreadsheets to manage by hand.
        • Slack alert: If a visitor finds a hidden hotspot, Zapier pings your team’s Slack channel so you can watch engagement live.
        • CRM update: On quiz finish, Zapier adds a tag in CRM software (e.g. HubSpot) so sales can follow up with interested leads.
        • IoT fun: A “light show” Zap turns Philips Hue bulbs blue whenever someone completes the space-themed tour—great for museum exhibits.

        Why it beats the default: 3DVista alone saves results only inside the tour or a SCORM file. With one simple webhook you can:

        • Store data anywhere (Sheets, Airtable, Databases).
        • Notify teams in real time (email, Slack, SMS).
        • Trigger marketing or learning actions (add tags, unlock coupons).
        • Link to physical experiences (smart lights, displays).

        Setup is fast: copy the Zapier webhook URL, paste it into script.js like so:

        
        // in script.js
        player.bind('tourFinished', () => {
          fetch('https://hooks.zapier.com/hooks/catch/123456/abcde/', {
            method: 'POST',
            headers: {'Content-Type':'application/json'},
            body: JSON.stringify({event:'completed',tour:'Space Tour'})
          });
        });
          

        No servers to run, no plugins to install—just hook, post, and let Zapier do the heavy lifting.

      • LMS with SCORM: If you use an LMS (Learning Management System) for e-learning, you can export the tour as a SCORM package. SCORM (Sharable Content Object Reference Model) is a standard format that lets the tour report scores and completion status to an LMS. With a SCORM export, your tour’s quiz results and progress are tracked in the LMS. You can even tweak the SCORM files if needed to fine-tune what data is sent.
    • LMS & SCORM:
      • LMS – an LMS is like an online grade-book and classroom all in one. It stores lessons, tracks each learner’s progress, and shows scores (much like a teacher’s record-book).
      • SCORM – SCORM is a set of shipping rules. Picture a standard shipping container: any truck, ship, or train can carry it. In the same way, a SCORM package is a zip file that any LMS can “unpack” and run. It sends back messages such as score = 85 or status = completed.

      Why export your tour as SCORM?

      • Easy tracking: Quiz scores and time-on-task land in the LMS automatically—no copy-and-paste.
      • Certificates: The LMS can issue a printable certificate the moment the tour reports completed.
      • Reuse everywhere: The same SCORM zip works in Moodle, Canvas, Blackboard, TalentLMS—any platform that follows the standard.
      • Fine-tuning: If you unzip the SCORM file you can edit one line in imsmanifest.xml to change the passing score or add more data fields. No need to rebuild the tour in 3DVista.

      Everyday example

      Imagine a museum uses a 3DVista tour as a “virtual field trip.” Students explore at their own pace and answer five quiz questions at the end. The tour—wrapped as SCORM—sends each student’s score to the school’s LMS. The LMS acts like the teacher: it marks “pass” if the score is 4 / 5 or higher, logs the date, and awards a digital badge.

      Quick start

      1. In 3DVista, choose Export → SCORM 1.2 (widest support) or SCORM 2004 (more data points).
      2. Upload the resulting .zip to your LMS.
      3. Optionally unzip, open imsmanifest.xml, and tweak settings such as masteryscore (the passing grade) or identifier (course code).

      Special Note About SCORM

      • Exporting in 3DVista: When you publish, pick either SCORM 1.2 or SCORM 2004.
        • SCORM 1.2 – the “classic” box.
          Picture a plain cardboard package: almost every delivery truck (older LMS) accepts it. It tracks only the basics—overall score, pass / fail, total time—so you always know “Did the learner finish?”
        • SCORM 2004 – the smart box.
          Think of a box with a GPS sticker and sensors. It stores extra details such as each answer, the path the learner took, and whether they met required steps. Fewer trucks (older LMSs) handle it, but when they do you get a richer log.

        Everyday examples:

        • A teacher using a simple online grade-book chooses SCORM 1.2. She knows every school computer can read it and record a pass / fail mark.
        • A corporate trainer who needs deep stats—like how long users spend in each scene—uploads SCORM 2004. Their modern LMS shows a dashboard of every click and score.

        Tip: If you are unsure which format your LMS supports, start with SCORM 1.2 for maximum compatibility. If your LMS manual lists SCORM 2004, use that instead to unlock detailed tracking features.

      Bottom line: Packaging your tour as SCORM turns a fun 360° experience into a graded, trackable lesson that plugs straight into any learning platform.

    • Why These Changes Matter

      • Launch Point: Pick the room you want visitors to see first.
      • Speed: Faster fades make the experience feel modern and keep attention.
      • Style: Button and font colors can match your brand and improve readability.
      • Layout: Mobile-specific tweaks make the tour comfortable to use on phones.

      With just a few edits in script.js or your custom CSS, you can:

      • Start in any scene you choose.
      • Control loading and transition timing to change the feel.
      • Match the tour’s UI colors and fonts to your brand.
      • Optimize the layout for both desktop and mobile viewers.

      Ready-Made Snippets for script.js

      Below are the five code blocks mentioned above. Copy the ones you like, paste them near the bottom of script.js, save, refresh, and watch the tour gain a new trick.

      /* ------------- Time-based start scene ------------- */
      (function () {
        var h = new Date().getHours();
        var scene = (h < 11) ? "Garden" : (h < 17) ? "Lobby" : "Rooftop";
        player.once('tourReady', function () { player.loadScene(scene); });
      })();
      /* ------------- Auto-VR on rotation ------------- */
      (function () {
        window.addEventListener('deviceorientation', function (e) {
          if (!player) return;
          var autoVr = Math.abs(e.gamma) > 70 && Math.abs(e.beta) < 30;
          if (autoVr && !player.isVR()) player.enterVR();
          if (!autoVr && player.isVR()) player.exitVR();
        }, true);
      })();
      /* -------- Send “tour finished” to Zapier -------- */
      (function () {
        var done = false;
        player.on('sceneEnded', function () {
          if (done) return; done = true;
          fetch('https://hooks.zapier.com/hooks/catch/XXXXXX/YOUR_WEBHOOK_URL',{
            method:'POST',
            body:JSON.stringify({event:'tour_end',time:Date.now()})
          });
        });
      })();
      /* -------------- Live weather overlay -------------- */
      (function refreshWeather(){
        var lat=28.6084,lon=-80.6040;
        fetch('https://api.open-meteo.com/v1/forecast?latitude='+lat+
              '&longitude='+lon+'&current_weather=true')
          .then(r=>r.json())
          .then(j=>{
            var w=j.current_weather;
            document.getElementById('weatherBox').textContent=
              w.temperature+' °C · code '+w.weathercode;
          })
          .catch(console.error)
          .finally(()=>setTimeout(refreshWeather,900000));
      })();
      /* ------------- Firebase live leaderboard ------------- */
      (function () {
        var cfg={apiKey:"YOUR_KEY",authDomain:"your-app.firebaseapp.com",
                 projectId:"your-app",databaseURL:"https://your-app.firebaseio.com"};
        firebase.initializeApp(cfg);
        var db=firebase.database().ref('scores');
        player.on('quizFinished',function(d){
          if(d.scorePercent>=80){
            var n=prompt('Great score! Name for the board:','');
            db.push({name:n||'Anon',score:d.scorePercent,time:Date.now()});
          }
        });
      })();

      Can 3DVista do this on its own?

      3DVista already lets you swap hot-spot icons, choose skins, and replace its splash-screen logo from inside the editor (see built-in “Skin” & “Hotspot” tools). Everything else below is done after you press “Export”. You simply open the exported files (HTML, JSON, images) in a free text or image editor. Nothing here requires re-compiling the tour or advanced coding.

      Things you can already adjust inside 3DVista

      • Swap or batch-change hotspot icons from the Hotspot Library (Menu → Hotspots)
      • Edit skin colours, fonts and button shapes via the Skin Editor (Menu → Skin)
      • Replace the default 3DVista splash-screen logo in the Skin → Splash tab
      • Create a PWA that runs offline using the built-in PWA export

      PWA Support in 3DVista Virtual Tour PRO

      A Note about Native PWA Support:

      • Includes a ready-made manifest.json. The file already lists icons, colors, and "display": "standalone", so the tour can install like an app and hide the browser’s bars.
      • Shows an install banner on Android / desktop. Turn on “Download for offline playing” when you publish. Users see “Add to Home Screen,” tap it, and the tour opens full-screen in its own window.
      • Provides Apple touch-icon tags. iPhone and iPad owners can use Safari’s “Add to Home Screen.” The tour then launches full-screen without Safari chrome.

      Built-In Limits to Keep in Mind

      • No point-and-click branding. You cannot change the PWA icon, name, or theme color inside the 3DVista editor.
      • No service worker out of the box. The tour works offline only for files the browser has cached during an online visit.
      • No auto-prompt on iOS. Safari never shows an install banner; users must save the tour manually.

      How to Take It Further with a Few Tweaks

      • Brand the PWA. Replace the PNG icon files and edit manifest.json to set your own "name", "short_name", "theme_color", and "background_color". Repeat after each export.
      • Add a service worker. Drop in an sw.js and register it from the tour’s HTML. Cache panoramas, scripts, and JSON so the tour runs fully offline after one visit.
      • Automate the tweaks. Use a build script (npm, Gulp, or simple shell) that copies your icons and rewrites the manifest each time you republish.
      • Test storage limits. Large tours can hit browser quota ceilings. Check offline behavior on both Android and iOS and prune assets if needed.

      15 Post-Export Hacks for Deeper Branding

      The table below lists every file you can “paint” with your brand, why it matters, and exactly how to do it using free tools such as Notepad, Squoosh.app, ImageMagick or a simple browser console.

      # File / Folder Branding Trick Why it's Good How (step by step)
      1 index.html <head> Add custom <meta>, Open Graph & Twitter tags Google snippets and social shares show your own title, description and preview image instead of the generic ones Open index.html in Notepad → paste
      <meta name="description" content="Your tour in one line">
      Add your OG image:
      <meta property="og:image" content="https://…/hero.jpg">
      2 manifest.json Change name, theme-colour, icons When users “Add to Home Screen”, the shortcut carries your logo and opens with your colour palette Replace PNG icons in /misc/ with your own
      Edit "name": "My Brand Tour"
      Set "theme_color": "#FF6600"
      3 favicon.ico / favicon.png Custom browser-tab icon Your badge appears in bookmarks and tabs Convert logo to 32 × 32 PNG (IcoConverter)
      Save over favicon.png
      Update <link rel="icon"> in index.html
      4 skin.css (or your vista-modifications.css) Brand colours & Google Fonts Panels, pop-ups, buttons instantly match your site style Paste @import url(…Barlow.css) at top of CSS
      Replace all colour codes (#5A0000 → #FF6600)
      5 #preloadContainer in CSS Swap spinner & fade colour The loading moment carries your animation and hue Drop new GIF in /media/
      Change background: in CSS to your brand gradient
      6 /hotspots/*.png Bespoke hotspot icons Users click your mascot or logo instead of stock arrows Create 64 px transparent PNGs → overwrite originals
      7 /panos/thumbs_*.jpg Retouch or frame thumbnails Thumbnail bar echoes your brand colours Batch process in Photoshop (Stroke 3 px, colour #FF6600) → save
      8 script.js Time-based first scene Morning visitors start with sunrise, night owls see a night view Paste the “Time-based start scene” snippet (see list #1)
      9 script.js Zapier webhooks Instant emails, Slack alerts, CRM entries without coding a backend Paste “tour finished” snippet, replace URL with your Zapier hook
      10 Skin → Variables (XML) Rename interface text “Points” becomes “Gold Stars”, “Score” becomes “XP” Open skin.xml → search <text id="score"> → change inner text
      11 /audio/*.mp3 Voice-over greetings per scene The tour literally speaks in your brand voice Record MP3 → save as scene name (e.g. Lobby.mp3) → update <audio> path in tour.xml
      12 /panos/*_tile.webp Watermark hi-res tiles only Screenshot pirates still see your mark; small previews stay clean ImageMagick: magick composite logo.png tile.webp tile.webp (batch loop)
      13 service-worker.js (add) Pre-cache first scene + logo Tour opens offline at trade shows Workbox CLI → choose “cache images in /panos” → copy generated file next to index.html
      14 script.js Google Tag Manager events Measure which scenes wow people most Paste dataLayer.push({event:'scene',name:s.name}) inside a sceneChanged listener
      15 index.html overlay Fixed promo banner or live-chat button Drive sales or support without leaving the tour Add
      <div id="promo">10 % Off — Use code TOUR10</div>
      CSS:
      #promo{position:fixed;bottom:1rem;right:1rem;}

      Analytics and User Tracking

      3DVista tours do not provide detailed user tracking by default. However, you can add custom tracking code to the tour’s exported files. This lets you see what viewers do in the virtual tour. For example, you can insert a Google Analytics script. With a bit of code, you can hook into tour events. For instance, you can detect when a scene changes or when someone clicks a hotspot. That way, you can log which scenes people view the most. You can also see which info spots they click. User analytics isn’t built in. But these tweaks let you collect useful data about your tour’s viewers.

      External System Integrations

      By default, a 3DVista tour cannot send data to other platforms or receive data from them. You can change that by editing the tour’s code. The tour can make web requests to talk to other services. In practice, the tour can trigger actions outside itself. For example, it could send an email when a viewer clicks a “Contact Us” hotspot. It could also add a new entry to a database for that event. All it takes is a few lines of JavaScript. With that in place, the tour can talk to outside services. This allows integrations that aren’t possible natively.

      Flexible UI and Branding Customization

      The standard 3DVista interface has a fixed layout and style. If you want a custom look and feel, you can tweak the exported HTML and CSS. This lets you change the style of interface elements. You can even add new ones to match your brand. For example, you might insert your own logo or watermark into the tour viewer. You could also change the colors and sizes of buttons. The skin editor does not normally allow these changes. Some creators add a custom loading screen with special branding. These changes go beyond the software’s built-in settings. By editing the files directly, you get a more flexible interface. This gives you a fully branded experience.

      Personalized Content Experiences

      By default, every viewer sees the same content in a 3DVista tour. There is no personalization in the standard setup. You can change this by adding scripts. These scripts can adjust the content based on who is viewing. The tour can adapt to different users or situations. For example, the tour might greet a signed-in user by name. It can display the name in a welcome panel. It could also use a link parameter (like language or user type) to decide which scene to show. For instance, a special URL could make the tour open in a specific language or mode. In this way, each viewer can get a different experience. Personalization is not built in. But you can still give each viewer a tailored tour. A small custom script can get user data. It then adjusts what the tour displays on the fly.

      Advanced Interactive Features

      3DVista’s built-in features like hotspots and quizzes cover common needs. But some ideas need extra code. You can add new functions by modifying the tour’s files. This lets you go beyond what 3DVista offers on its own. For instance, you could embed a live chat window in the tour. Visitors would then be able to talk with a guide in real time. You might even include a video call element. This would allow face-to-face help inside the tour. Some creators have also synced tours for multiple users. This setup lets a group explore together at the same time. None of these are supported out of the box. But they become possible with custom enhancements. These upgrades let you push interactivity further than the standard tour allows.

      Performance and Image Delivery Improvements

      3DVista tours run well by default. Even so, there are ways to make them load faster. You can boost performance by adjusting the exported files. For example, you might host the tour’s images on a network of global servers (called a CDN). That way, they load more quickly for viewers around the world. You can also fine-tune how and when the tour’s assets load. This way, the tour works best for your audience. Some creators compress or resize media files to reduce their size. They may also use lazy loading for secondary scenes. This makes the tour run smoother on phones and tablets. These tweaks aren’t part of the normal publishing process. With a bit of manual work in the tour’s code and files, you can still make it faster and more efficient.

      Final Cheat sheet

      1. See Where Visitors Click

      Add the Google Analytics tag to index.html and link it to scene-change events. Now you can track which rooms guests visit and what they tap.

      2. Tour Together in Real Time

      Use the built-in Live-Guided feature plus a tiny Firebase relay so everyone’s view follows the host. Viewers can still unhook and look around on their own.

      3. Work Offline Like an App

      Drop a short service-worker script into the tour folder. It caches the pages and image tiles so the tour opens even with no internet.

      4. Add Fun Visual Filters

      Slip a Three.js shader into script.js. It can tint, blur, or add retro scan lines to the panorama while it runs.

      5. Pop Objects into AR

      Create a hotspot that links to a USDZ file with <a rel="ar">. On iPhones, the object appears in the real world through the camera.

      6. Talk to the Parent Page

      When you embed the tour in an iframe, use window.postMessage. The parent site can now react to tour events or steer the tour by code.

      7. Navigate by Voice

      Load the Web Speech API. Map words like “next room” to tour actions, giving hands-free control and better access.

      8. Show Live Data Inside

      Add a small fetch() loop in script.js. It grabs JSON (weather, scores, stock prices) and updates hotspot text every few seconds.

      9. Build a Leaderboard

      When the tour finishes scoring, send a Zapier webhook to Google Sheets. Show the top scores in a pop-up so players compete.

      10. Swap in a Custom Skin

      Replace the default skin files with ones from the 3DVista Marketplace or your own CSS. The interface now matches your brand exactly.

let's book your Kennedy Space Center Tour

Prefer to chat? Call us instead.

Need assurance first?
No obligation. No pressure.

let's book your Kennedy Space Center Tour

Prefer to chat? Call us instead.

Need assurance first?
No obligation. No pressure.

Want to See this launch in person?

Send us your information, and
we’ll get back to you.

Want to See this launch in person?

Send us your information, and
we’ll get back to you.