npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

aframe-terrain-model-component

v1.0.1

Published

Terrain model components for A-Frame.

Downloads

40

Readme

aframe-terrain-model-component

This is an A-Frame component for displaying ENVI formatted, digital elevation models (DEMs).

The basic idea is to create a large plane with a certain width, height, and number of vertices. Each vertex is then repositioned based on elevation from a digital elevation model (DEM). The DEM must be in ENVI format--see this blog post for conversion details.

Usage

Browser

Install and use by directly including the browser files:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>My A-Frame Scene</title>
    <script src="https://aframe.io/releases/1.0.4/aframe.min.js"></script>
    <script src="https://unpkg.com/[email protected]/dist/aframe-terrain-model-component.js"></script>
  </head>
  <body>
    <a-scene renderer="antialias: true">
      <!-- Camera -->
      <a-entity position="0 80 -200" rotation="0 180 0">
        <a-entity camera look-controls wasd-controls></a-entity>
      </a-entity>

      <!-- Terrain-->
      <a-entity
        terrain-model="map: url(data/noctis-3500-clip-textureRED-resized.jpg);
          dem: url(data/noctis-3500-clip-envi.bin);
          planeWidth: 346;
          planeHeight: 346;
          segmentsWidth: 199;
          segmentsHeight: 199;
          zPosition: 100"
      ></a-entity>

      <a-sky color="#fff"></a-sky>
    </a-scene>
  </body>
</html>

npm

Alternatively, install via npm:

npm install aframe-terrain-model-component

Then register and use.

require("aframe");
require("aframe-terrain-model-component");

API

Properties

| Property | Description | Default Value | | :------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :-----------: | | dem | Path to digital elevation model data in ENVI format. | | | map | Path to a color texture. | | | alphaMap | The alpha map is a grayscale texture that controls the opacity across the surface (black: fully transparent; white: fully opaque). | | | planeHeight | The height of the plane. | | | planeWidth | The width of the plane. | | | segmentsHeight | Width of elevation grid minus one. | 199 | | segmentsWidth | Height of elevation grid minus one. | 199 | | zPosition | Vertical exaggeration. Lower values will seem flatter, higher values more mountainous. | 1.5 | | wireframe | Adds a wireframe | false |

The relationship between these properties and the DEM data may not be straightforward.

The height and width of the plane should have the same ratio as the height and width of the area covered by your DEM. For instance, if you've clipped your DEM down to an image/grid size of 6000 px by 6000 px then planeHeight and planeWidth could be set to 60.

The segmentsHeight and segmentsWidth values should be set to "the width and height of your elevation grid minus one". The height and width of your elevation grid was probably determined during the conversion to ENVI.

e.g.

Corresponds to a segmentsHeight and segmentsWidth value of 199.

These values seem to control the "resolution" of the elevation data. The L.A. Times has this to say:

"You'll notice we specified the -outsize parameter, which specifies the number of data points in the output file, and the number of vertices in the plane in the Three.js scene. This can be as high or low as you want, but you'll find that larger values can be very taxing on the graphics processor when rendering the scene. We found that using 300 x 285 provided a good amount of detail without stressing out the GPU too much. For phones, we used a smaller file, 200 x 190, and for some phones even went to a 100 x 95 file, to ensure that the interactive ran smoothly."

Lastly, zPosition controls vertical exaggeration. It is a kind of scaling factor that alters terrain height. I'm not sure how to determine an accurate value for this; my tactic is to adjust until the result is aesthetically pleasing. The L.A. Times used a value of 100 for their Gale Crater experience, Sandvik used 5 for Jotunheimen, and I used 50 for the crater floor example.

Events

| Name | Description | | :-------------------: | :-------------------------------------------------------------------------------------------: | | textureLoaded | Emitted when a texture has finished loading | | demLoaded | Emitted when a DEM has finished loading | | positionBufferUpdated | Emitted after the terrain geometry's position attribute buffer has been adjusted by a new DEM |

FAQ

Does this component work with A-Frame's asset management system?

Yes, kind of. Assets loaded through the asset management system are cached by three.js' loaders; since this component uses three.js' loaders, textures should not be downloaded twice.

<a-assets>
  <img src="data/noctis-3500-clip-textureRED-resized.jpg" />
  <a-asset-item src="data/noctis-3500-clip-envi.bin"></a-asset-item>
</a-assets>

<!-- terrain-model 'map' and 'dem' properties use the same URL as assets in <a-assets>  -->
<a-entity
  terrain-model="map: url(data/noctis-3500-clip-textureRED-resized.jpg); dem: url(data/noctis-3500-clip-envi.bin); planeWidth: 346; planeHeight: 346; segmentsWidth: 199; segmentsHeight: 199; zPosition: 100"
></a-entity>

However, passing resources by selector is not currently supported.

<a-assets>
  <img id="noctisTexture" src="data/noctis-3500-clip-textureRED-resized.jpg" />
  <a-asset-item src="data/noctis-3500-clip-envi.bin"></a-asset-item>
</a-assets>

<!-- '#noctisTexture' will not work! -->
<a-entity
  terrain-model="map: #noctisTexture; dem: url(data/noctis-3500-clip-envi.bin); planeWidth: 346; planeHeight: 346; segmentsWidth: 199; segmentsHeight: 199; zPosition: 100"
></a-entity>

References

Till Hinrichs' orbit-controls-component is used in some of the examples.

For a different take on terrain, checkout Morandd's aframe-heatmap3d component.

Data (DEM and textures)

The Gale-Crater and Jotunheimen examples were created by journalists from the L.A. Times and Bjørn Sandvik respectively. The Jotunheimen data was obtained from The Norwegian Mapping Authority.

All Mars examples use public domain data from HiRISE (credit: NASA/JPL/University of Arizona).