mirror of
https://github.com/NASAWorldWind/WebWorldWind.git
synced 2025-12-08 19:46:18 +00:00
139 lines
6.6 KiB
JavaScript
139 lines
6.6 KiB
JavaScript
/*
|
||
* Copyright 2003-2006, 2009, 2017, 2020 United States Government, as represented
|
||
* by the Administrator of the National Aeronautics and Space Administration.
|
||
* All rights reserved.
|
||
*
|
||
* The NASAWorldWind/WebWorldWind platform is licensed under the Apache License,
|
||
* Version 2.0 (the "License"); you may not use this file except in compliance
|
||
* with the License. You may obtain a copy of the License
|
||
* at http://www.apache.org/licenses/LICENSE-2.0
|
||
*
|
||
* Unless required by applicable law or agreed to in writing, software distributed
|
||
* under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
||
* CONDITIONS OF ANY KIND, either express or implied. See the License for the
|
||
* specific language governing permissions and limitations under the License.
|
||
*
|
||
* NASAWorldWind/WebWorldWind also contains the following 3rd party Open Source
|
||
* software:
|
||
*
|
||
* ES6-Promise – under MIT License
|
||
* libtess.js – SGI Free Software License B
|
||
* Proj4 – under MIT License
|
||
* JSZip – under MIT License
|
||
*
|
||
* A complete listing of 3rd Party software notices and licenses included in
|
||
* WebWorldWind can be found in the WebWorldWind 3rd-party notices and licenses
|
||
* PDF found in code directory.
|
||
*/
|
||
/**
|
||
* Illustrates how to load and display a Collada 3D model onto the globe. Also shows how to calculate
|
||
* intersection points when you click on the model.
|
||
*/
|
||
|
||
requirejs(['./WorldWindShim',
|
||
'./LayerManager'],
|
||
function (WorldWind, LayerManager) {
|
||
"use strict";
|
||
|
||
// Tell WorldWind to log only warnings and errors.
|
||
WorldWind.Logger.setLoggingLevel(WorldWind.Logger.LEVEL_WARNING);
|
||
|
||
// Create the WorldWindow.
|
||
var wwd = new WorldWind.WorldWindow("canvasOne");
|
||
|
||
// Create and add layers to the WorldWindow.
|
||
var layers = [
|
||
// Imagery layers.
|
||
{layer: new WorldWind.BMNGLayer(), enabled: true},
|
||
{layer: new WorldWind.BMNGLandsatLayer(), enabled: false},
|
||
{layer: new WorldWind.BingAerialLayer(null), enabled: false},
|
||
{layer: new WorldWind.BingAerialWithLabelsLayer(null), enabled: false},
|
||
{layer: new WorldWind.BingRoadsLayer(null), enabled: false},
|
||
// Add atmosphere layer on top of all base layers.
|
||
{layer: new WorldWind.AtmosphereLayer(), enabled: true},
|
||
// WorldWindow UI layers.
|
||
{layer: new WorldWind.CompassLayer(), enabled: true},
|
||
{layer: new WorldWind.CoordinatesDisplayLayer(wwd), enabled: true},
|
||
{layer: new WorldWind.ViewControlsLayer(wwd), enabled: true}
|
||
];
|
||
|
||
for (var l = 0; l < layers.length; l++) {
|
||
layers[l].layer.enabled = layers[l].enabled;
|
||
wwd.addLayer(layers[l].layer);
|
||
}
|
||
|
||
// Create renderable layer to hold the Collada model.
|
||
var modelLayer = new WorldWind.RenderableLayer("Duck");
|
||
wwd.addLayer(modelLayer);
|
||
var placemarkLayer = new WorldWind.RenderableLayer("Placemarks")
|
||
wwd.addLayer(placemarkLayer);
|
||
|
||
// Define a position for locating the model.
|
||
var position = new WorldWind.Position(45, -100, 1000e3);
|
||
// Create a Collada loader and direct it to the desired directory and .dae file.
|
||
var colladaLoader = new WorldWind.ColladaLoader(position);
|
||
colladaLoader.init({dirPath: './collada_models/duck/'});
|
||
var duckScene = null;
|
||
colladaLoader.load('duck.dae', function (scene) {
|
||
scene.scale = 5000;
|
||
modelLayer.addRenderable(scene); // Add the Collada model to the renderable layer within a callback.
|
||
duckScene = scene;
|
||
});
|
||
|
||
// The following is an example of 3D ray intersaction with a COLLADA model.
|
||
// A ray will be generated extending from the camera "eye" point towards a point in the
|
||
// COLLADA model where the user has clicked, then the intersections between this ray and the model
|
||
// will be computed and displayed.
|
||
|
||
// Add placemarks to visualize intersection points.
|
||
var placemarkAttributes = new WorldWind.PlacemarkAttributes(null);
|
||
placemarkAttributes.imageScale = 1;
|
||
placemarkAttributes.imageColor = WorldWind.Color.RED;
|
||
placemarkAttributes.labelAttributes.color = WorldWind.Color.YELLOW;
|
||
placemarkAttributes.drawLeaderLine = true;
|
||
placemarkAttributes.leaderLineAttributes.outlineColor = WorldWind.Color.RED;
|
||
placemarkAttributes.imageSource = WorldWind.configuration.baseUrl + "images/crosshair.png";
|
||
|
||
// The next placemark will portray the closest intersection point to the camera, marked in a different color.
|
||
var closestPlacemarkAttributes = new WorldWind.PlacemarkAttributes(placemarkAttributes);
|
||
closestPlacemarkAttributes.imageColor = WorldWind.Color.GREEN;
|
||
closestPlacemarkAttributes.leaderLineAttributes.outlineColor = WorldWind.Color.GREEN;
|
||
|
||
// Add click event to trigger the generation of the ray and the computation of its intersctions with the COLLADA model.
|
||
var handleClick = function (o) {
|
||
if (duckScene == null) {
|
||
return;
|
||
}
|
||
placemarkLayer.removeAllRenderables();
|
||
|
||
// Obtain 3D ray that extends from the camera "eye" point towards the point where the user clicked on the COLLADA model.
|
||
var clickPoint = wwd.canvasCoordinates(o.clientX, o.clientY);
|
||
var clickRay = wwd.rayThroughScreenPoint(clickPoint);
|
||
|
||
// Compute intersection points between the model and the ray extending from the camera "eye" point.
|
||
// Note that this takes into account possible concavities in the model.
|
||
var intersections = [];
|
||
if (duckScene.computePointIntersections(wwd.globe, clickRay, intersections)) {
|
||
for (var i = 0, len = intersections.length; i < len; i++) {
|
||
var placemark = new WorldWind.Placemark(intersections[i], true, null);
|
||
placemark.altitudeMode = WorldWind.ABSOLUTE;
|
||
if (i == 0) {
|
||
placemark.attributes = closestPlacemarkAttributes;
|
||
} else {
|
||
placemark.attributes = placemarkAttributes;
|
||
}
|
||
placemarkLayer.addRenderable(placemark);
|
||
}
|
||
}
|
||
|
||
// Redraw scene with the computed results.
|
||
wwd.redraw();
|
||
};
|
||
|
||
// Listen for mouse clicks to trigger the related event.
|
||
wwd.addEventListener("click", handleClick);
|
||
|
||
// Create a layer manager for controlling layer visibility.
|
||
var layerManager = new LayerManager(wwd);
|
||
});
|