From fd49e0db5c90bf7386692bf42410692f69deb061 Mon Sep 17 00:00:00 2001 From: iSergio Date: Fri, 19 Nov 2021 13:42:04 +0300 Subject: [PATCH] New example - Model Experimental 3D Models --- .../showcase/config/InjectorModule.java | 1 + .../examples/ModelExperimental3DModels.java | 109 +++++++ .../BoxInstanced/glTF/box-instanced.gltf | 289 ++++++++++++++++++ .../GltfLoader/BoxInstanced/glTF/geometry.bin | Bin 0 -> 648 bytes .../BoxInstanced/glTF/instances.bin | Bin 0 -> 176 bytes .../GltfLoader/BoxInstanced/glTF/metadata.bin | Bin 0 -> 104 bytes .../Data/Models/PBR/BoxUnlit/BoxUnlit.gltf | 151 +++++++++ .../examples/Model Experimental 3D Models.jpg | Bin 0 -> 11306 bytes .../examples/ModelExperimental3DModels.txt | 93 ++++++ 9 files changed, 643 insertions(+) create mode 100644 cesiumjs4gwt-showcase/src/main/java/org/cleanlogic/cesiumjs4gwt/showcase/examples/ModelExperimental3DModels.java create mode 100644 cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/Specs/Data/Models/GltfLoader/BoxInstanced/glTF/box-instanced.gltf create mode 100644 cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/Specs/Data/Models/GltfLoader/BoxInstanced/glTF/geometry.bin create mode 100644 cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/Specs/Data/Models/GltfLoader/BoxInstanced/glTF/instances.bin create mode 100644 cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/Specs/Data/Models/GltfLoader/BoxInstanced/glTF/metadata.bin create mode 100644 cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/Specs/Data/Models/PBR/BoxUnlit/BoxUnlit.gltf create mode 100644 cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/examples/Model Experimental 3D Models.jpg create mode 100644 cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/examples/ModelExperimental3DModels.txt diff --git a/cesiumjs4gwt-showcase/src/main/java/org/cleanlogic/cesiumjs4gwt/showcase/config/InjectorModule.java b/cesiumjs4gwt-showcase/src/main/java/org/cleanlogic/cesiumjs4gwt/showcase/config/InjectorModule.java index 8146c88f..0adc756c 100644 --- a/cesiumjs4gwt-showcase/src/main/java/org/cleanlogic/cesiumjs4gwt/showcase/config/InjectorModule.java +++ b/cesiumjs4gwt-showcase/src/main/java/org/cleanlogic/cesiumjs4gwt/showcase/config/InjectorModule.java @@ -122,5 +122,6 @@ public class InjectorModule extends AbstractGinModule { bind(CustomShadersModels.class).asEagerSingleton(); bind(Tiles3DNextCDBYemen.class).asEagerSingleton(); bind(Tiles3DNextS2Globe.class).asEagerSingleton(); + bind(ModelExperimental3DModels.class).asEagerSingleton(); } } diff --git a/cesiumjs4gwt-showcase/src/main/java/org/cleanlogic/cesiumjs4gwt/showcase/examples/ModelExperimental3DModels.java b/cesiumjs4gwt-showcase/src/main/java/org/cleanlogic/cesiumjs4gwt/showcase/examples/ModelExperimental3DModels.java new file mode 100644 index 00000000..22059757 --- /dev/null +++ b/cesiumjs4gwt-showcase/src/main/java/org/cleanlogic/cesiumjs4gwt/showcase/examples/ModelExperimental3DModels.java @@ -0,0 +1,109 @@ +/* + * Copyright 2021 iserge, Gis4Fun. + * + * 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. + */ + +package org.cleanlogic.cesiumjs4gwt.showcase.examples; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.ui.AbsolutePanel; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.ListBox; +import org.cesiumjs.cs.core.*; +import org.cesiumjs.cs.core.HeadingPitchRoll; +import org.cesiumjs.cs.scene.experimental.ModelExperimental; +import org.cesiumjs.cs.scene.experimental.options.ModelExperimentalFromGltfOptions; +import org.cesiumjs.cs.widgets.Viewer; +import org.cesiumjs.cs.widgets.ViewerPanel; +import org.cleanlogic.cesiumjs4gwt.showcase.basic.AbstractExample; +import org.cleanlogic.cesiumjs4gwt.showcase.components.store.ShowcaseExampleStore; + +import javax.inject.Inject; +import java.lang.Math; + +public class ModelExperimental3DModels extends AbstractExample { + private Viewer viewer; + + private final HeadingPitchRoll hpr = new HeadingPitchRoll(Math.toRadians(180), 0, 0); + private final Transforms.LocalFrameToFixedFrame fixedFrameTransform = Transforms.localFrameToFixedFrameGenerator("north", "west"); + + @Inject + public ModelExperimental3DModels(ShowcaseExampleStore store) { + super("Model Experimental 3D Models", + "Load glTF models using Model Experimental", + new String[]{"Showcase", "Cesium", "3d", "Viewer", "experimental"}, store, "1.87.1"); + } + + @Override + public void buildPanel() { + ViewerPanel csVPanel = new ViewerPanel(); + viewer = csVPanel.getViewer(); + + csVPanel.getViewer().clock().currentTime = JulianDate.fromIso8601("2021-11-09T20:27:37.016064475348684937Z"); + + ListBox listBox = new ListBox(); + listBox.addItem("Cesium Balloon"); + listBox.addItem("Skinned Character"); + listBox.addItem("Draco Compressed Model"); + listBox.addItem("Unlit Box"); + listBox.addItem("Drone"); + listBox.addItem("Ground Vehicle"); + listBox.addItem("Instanced Box"); + listBox.addChangeHandler(event -> { + String value = ((ListBox) event.getSource()).getSelectedItemText(); + String prefix = GWT.getModuleBaseURL(); + switch (value) { + case "Cesium Balloon": selectModel(prefix + "SampleData/models/CesiumBalloon/CesiumBalloon.glb", 15); break; + case "Skinned Character": selectModel(prefix + "SampleData/models/CesiumMan/Cesium_Man.glb", 0); break; + case "Draco Compressed Model": selectModel(prefix + "SampleData/models/DracoCompressed/CesiumMilkTruck.gltf", 0); break; + case "Unlit Box": selectModel(prefix + "Specs/Data/Models/PBR/BoxUnlit/BoxUnlit.gltf", 0); break; + case "Drone": selectModel(prefix + "SampleData/models/CesiumDrone/CesiumDrone.glb", 15); break; + case "Ground Vehicle": selectModel(prefix + "SampleData/models/GroundVehicle/GroundVehicle.glb", 0); break; + case "Instanced Box": selectModel(prefix + "Specs/Data/Models/GltfLoader/BoxInstanced/glTF/box-instanced.gltf", 15); break; + default: break; + } + }); + + AbsolutePanel aPanel = new AbsolutePanel(); + aPanel.add(csVPanel); + aPanel.add(listBox, 20, 20); + + contentPanel.add(new HTML( + "

Load glTF models using Model Experimental.

")); + contentPanel.add(aPanel); + + initWidget(contentPanel); + + selectModel(GWT.getModuleBaseURL() + "SampleData/models/CesiumBalloon/CesiumBalloon.glb", 15); + } + + @Override + public String[] getSourceCodeURLs() { + String[] sourceCodeURLs = new String[1]; + sourceCodeURLs[0] = GWT.getModuleBaseURL() + "examples/" + "ModelExperimental3DModels.txt"; + return sourceCodeURLs; + } + + private void selectModel(String url, double height) { + Cartesian3 position = Cartesian3.fromDegrees(-123.0744619, 44.0503706, height); + + viewer.scene().primitives().removeAll(); + ModelExperimentalFromGltfOptions options = ModelExperimentalFromGltfOptions.create(url); + options.modelMatrix = Transforms.headingPitchRollToFixedFrame(position, hpr, Ellipsoid.WGS84(), fixedFrameTransform); + ModelExperimental model = (ModelExperimental) viewer.scene().primitives().add(ModelExperimental.fromGltf(options)); + + model.readyPromise().then(nModel -> viewer.camera.lookAt(position, + new HeadingPitchRange(Math.toRadians(45), Math.toRadians(-15), model.boundingSphere().radius * 5))); + } +} diff --git a/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/Specs/Data/Models/GltfLoader/BoxInstanced/glTF/box-instanced.gltf b/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/Specs/Data/Models/GltfLoader/BoxInstanced/glTF/box-instanced.gltf new file mode 100644 index 00000000..4b134f5c --- /dev/null +++ b/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/Specs/Data/Models/GltfLoader/BoxInstanced/glTF/box-instanced.gltf @@ -0,0 +1,289 @@ +{ + "asset": { + "version": "2.0" + }, + "extensionsUsed": [ + "EXT_mesh_features", + "EXT_mesh_gpu_instancing" + ], + "extensionsRequired": [ + "EXT_mesh_gpu_instancing" + ], + "extensions": { + "EXT_mesh_features": { + "schema": { + "classes": { + "box": { + "properties": { + "name": { + "componentType": "STRING" + }, + "volume": { + "componentType": "FLOAT32" + } + } + }, + "section": { + "properties": { + "name": { + "componentType": "STRING" + }, + "id": { + "componentType": "UINT16" + } + } + } + } + }, + "propertyTables": [ + { + "name": "Box", + "class": "box", + "count": 4, + "properties": { + "name": { + "stringOffsetType": "UINT16", + "bufferView": 7, + "stringOffsetBufferView": 8 + }, + "volume": { + "bufferView": 9 + } + } + }, + { + "name": "Section", + "class": "section", + "count": 2, + "properties": { + "name": { + "stringOffsetType": "UINT16", + "bufferView": 10, + "stringOffsetBufferView": 11 + }, + "id": { + "bufferView": 12 + } + } + } + ] + } + }, + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ], + "nodes": [ + { + "mesh": 0, + "extensions": { + "EXT_mesh_gpu_instancing": { + "attributes": { + "TRANSLATION": 3, + "ROTATION": 4, + "SCALE": 5, + "FEATURE_ID_0": 6 + } + }, + "EXT_mesh_features": { + "propertyTables": [ + 0, + 1 + ], + "featureIds": [ + { + "offset": 0, + "repeat": 1 + }, + { + "attribute": 0 + } + ] + } + } + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "POSITION": 0, + "NORMAL": 1 + }, + "indices": 2, + "mode": 4 + } + ] + } + ], + "accessors": [ + { + "name": "Positions", + "bufferView": 0, + "byteOffset": 0, + "componentType": 5126, + "count": 24, + "max": [ + 0.5, + 0.5, + 0.5 + ], + "min": [ + -0.5, + -0.5, + -0.5 + ], + "type": "VEC3" + }, + { + "name": "Normals", + "bufferView": 1, + "byteOffset": 0, + "componentType": 5126, + "count": 24, + "type": "VEC3" + }, + { + "name": "Indices", + "bufferView": 2, + "byteOffset": 0, + "componentType": 5123, + "count": 36, + "type": "SCALAR" + }, + { + "name": "Instance Translations", + "bufferView": 3, + "byteOffset": 0, + "componentType": 5126, + "count": 4, + "type": "VEC3" + }, + { + "name": "Instance Rotations", + "bufferView": 4, + "byteOffset": 0, + "componentType": 5126, + "count": 4, + "type": "VEC4" + }, + { + "name": "Instance Scales", + "bufferView": 5, + "byteOffset": 0, + "componentType": 5126, + "count": 4, + "type": "VEC3" + }, + { + "name": "Instance Feature IDs", + "bufferView": 6, + "byteOffset": 0, + "componentType": 5126, + "count": 4, + "type": "SCALAR" + } + ], + "bufferViews": [ + { + "name": "Positions", + "buffer": 0, + "byteLength": 288, + "byteOffset": 0 + }, + { + "name": "Normals", + "buffer": 0, + "byteLength": 288, + "byteOffset": 288 + }, + { + "name": "Indices", + "buffer": 0, + "byteLength": 72, + "byteOffset": 576 + }, + { + "name": "Instance Translations", + "buffer": 1, + "byteLength": 48, + "byteOffset": 0 + }, + { + "name": "Instance Rotations", + "buffer": 1, + "byteLength": 64, + "byteOffset": 48 + }, + { + "name": "Instance Scales", + "buffer": 1, + "byteLength": 48, + "byteOffset": 112 + }, + { + "name": "Instance Feature IDs", + "buffer": 1, + "byteLength": 16, + "byteOffset": 160 + }, + { + "name": "Box Names", + "buffer": 2, + "byteLength": 40, + "byteOffset": 0 + }, + { + "name": "Box Name Offsets", + "buffer": 2, + "byteLength": 10, + "byteOffset": 40 + }, + { + "name": "Box Volumes", + "buffer": 2, + "byteLength": 16, + "byteOffset": 56 + }, + { + "name": "Section Name", + "buffer": 2, + "byteLength": 9, + "byteOffset": 72 + }, + { + "name": "Section Name Offsets", + "buffer": 2, + "byteLength": 6, + "byteOffset": 88 + }, + { + "name": "Section IDs", + "buffer": 2, + "byteLength": 4, + "byteOffset": 96 + } + ], + "buffers": [ + { + "name": "Geometry Buffer", + "byteLength": 648, + "uri": "geometry.bin" + }, + { + "name": "Instances Buffer", + "byteLength": 176, + "uri": "instances.bin" + }, + { + "name": "Metadata Buffer", + "byteLength": 104, + "uri": "metadata.bin" + } + ] +} diff --git a/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/Specs/Data/Models/GltfLoader/BoxInstanced/glTF/geometry.bin b/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/Specs/Data/Models/GltfLoader/BoxInstanced/glTF/geometry.bin new file mode 100644 index 0000000000000000000000000000000000000000..999f962cf186e3dd7d49fdd4d6f3afc19de1cb85 GIT binary patch literal 648 zcmcJIYYu`i5QIMg6%iF*cpR_h&A6I7(Mg((A^fq)cAo756Q6koYNXALr6=xDUh=G! zWzSkz&Xl^+*>gW<^4-lmYxO+Nq|J@?BGP%u|DHu$@7 likb~;8n%HAEjzlnJN6to&~pmxxo~FS8aQy{&KUQ|gEyr^JvjgX literal 0 HcmV?d00001 diff --git a/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/Specs/Data/Models/GltfLoader/BoxInstanced/glTF/instances.bin b/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/Specs/Data/Models/GltfLoader/BoxInstanced/glTF/instances.bin new file mode 100644 index 0000000000000000000000000000000000000000..0f4b2a8dc8f62c66aec9ea7884fa7e90505430ac GIT binary patch literal 176 zcmZQzU^u|Qz~BJHAaDSRL2L&!Hi*w4^8TO1Vbst literal 0 HcmV?d00001 diff --git a/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/Specs/Data/Models/GltfLoader/BoxInstanced/glTF/metadata.bin b/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/Specs/Data/Models/GltfLoader/BoxInstanced/glTF/metadata.bin new file mode 100644 index 0000000000000000000000000000000000000000..1dffc7779929e4cfcd4b849927021595eb2c6f55 GIT binary patch literal 104 zcmXTPFHp!yO)E*tFDc2-MP?Rdre^@f3KYN$1_llWVFq~y4F(9X<+^SMWZBP}In!2J Y|E?X#45&h=3Kj-VAj?#v`x;090FYN2;s5{u literal 0 HcmV?d00001 diff --git a/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/Specs/Data/Models/PBR/BoxUnlit/BoxUnlit.gltf b/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/Specs/Data/Models/PBR/BoxUnlit/BoxUnlit.gltf new file mode 100644 index 00000000..f4bda300 --- /dev/null +++ b/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/Specs/Data/Models/PBR/BoxUnlit/BoxUnlit.gltf @@ -0,0 +1,151 @@ +{ + "asset": { + "generator": "COLLADA2GLTF", + "version": "2.0" + }, + "extensionsUsed": [ + "KHR_materials_unlit" + ], + "extensionsRequired": [ + "KHR_materials_unlit" + ], + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ], + "nodes": [ + { + "children": [ + 1 + ], + "matrix": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0 + ] + }, + { + "mesh": 0 + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "NORMAL": 1, + "POSITION": 2 + }, + "indices": 0, + "mode": 4, + "material": 0 + } + ], + "name": "Mesh" + } + ], + "accessors": [ + { + "bufferView": 0, + "byteOffset": 0, + "componentType": 5123, + "count": 36, + "max": [ + 23 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 0, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 288, + "componentType": 5126, + "count": 24, + "max": [ + 0.5, + 0.5, + 0.5 + ], + "min": [ + -0.5, + -0.5, + -0.5 + ], + "type": "VEC3" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0, + 1.0, + 0.0, + 1.0 + ], + "metallicFactor": 1.0 + }, + "name": "Unlit Green", + "extensions": { + "KHR_materials_unlit": {} + } + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteOffset": 576, + "byteLength": 72, + "target": 34963 + }, + { + "buffer": 0, + "byteOffset": 0, + "byteLength": 576, + "byteStride": 12, + "target": 34962 + } + ], + "buffers": [ + { + "byteLength": 648, + "uri": "data:application/octet-stream;base64,AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAvwAAAL8AAAA/AAAAPwAAAL8AAAA/AAAAvwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAL8AAAA/AAAAvwAAAL8AAAA/AAAAPwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAPwAAAD8AAAA/AAAAPwAAAL8AAAA/AAAAPwAAAD8AAAC/AAAAPwAAAL8AAAC/AAAAvwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAvwAAAD8AAAC/AAAAPwAAAD8AAAC/AAAAvwAAAL8AAAA/AAAAvwAAAD8AAAA/AAAAvwAAAL8AAAC/AAAAvwAAAD8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAD8AAAC/AAAAPwAAAL8AAAC/AAAAPwAAAD8AAAC/AAABAAIAAwACAAEABAAFAAYABwAGAAUACAAJAAoACwAKAAkADAANAA4ADwAOAA0AEAARABIAEwASABEAFAAVABYAFwAWABUA" + } + ] +} diff --git a/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/examples/Model Experimental 3D Models.jpg b/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/examples/Model Experimental 3D Models.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b67fab48ac11a3f85a334369ccb8d6f2bcdfd23c GIT binary patch literal 11306 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 literal 0 HcmV?d00001 diff --git a/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/examples/ModelExperimental3DModels.txt b/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/examples/ModelExperimental3DModels.txt new file mode 100644 index 00000000..d8b0780d --- /dev/null +++ b/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/examples/ModelExperimental3DModels.txt @@ -0,0 +1,93 @@ +package org.cleanlogic.cesiumjs4gwt.showcase.examples; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.ui.AbsolutePanel; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.ListBox; +import org.cesiumjs.cs.core.*; +import org.cesiumjs.cs.core.HeadingPitchRoll; +import org.cesiumjs.cs.scene.experimental.ModelExperimental; +import org.cesiumjs.cs.scene.experimental.options.ModelExperimentalFromGltfOptions; +import org.cesiumjs.cs.widgets.Viewer; +import org.cesiumjs.cs.widgets.ViewerPanel; +import org.cleanlogic.cesiumjs4gwt.showcase.basic.AbstractExample; +import org.cleanlogic.cesiumjs4gwt.showcase.components.store.ShowcaseExampleStore; + +import javax.inject.Inject; +import java.lang.Math; + +public class ModelExperimental3DModels extends AbstractExample { + private Viewer viewer; + + private final HeadingPitchRoll hpr = new HeadingPitchRoll(Math.toRadians(180), 0, 0); + private final Transforms.LocalFrameToFixedFrame fixedFrameTransform = Transforms.localFrameToFixedFrameGenerator("north", "west"); + + @Inject + public ModelExperimental3DModels(ShowcaseExampleStore store) { + super("Model Experimental 3D Models", + "Load glTF models using Model Experimental", + new String[]{"Showcase", "Cesium", "3d", "Viewer", "experimental"}, store, "1.87.1"); + } + + @Override + public void buildPanel() { + ViewerPanel csVPanel = new ViewerPanel(); + viewer = csVPanel.getViewer(); + + csVPanel.getViewer().clock().currentTime = JulianDate.fromIso8601("2021-11-09T20:27:37.016064475348684937Z"); + + ListBox listBox = new ListBox(); + listBox.addItem("Cesium Balloon"); + listBox.addItem("Skinned Character"); + listBox.addItem("Draco Compressed Model"); + listBox.addItem("Unlit Box"); + listBox.addItem("Drone"); + listBox.addItem("Ground Vehicle"); + listBox.addItem("Instanced Box"); + listBox.addChangeHandler(event -> { + String value = ((ListBox) event.getSource()).getSelectedItemText(); + String prefix = GWT.getModuleBaseURL(); + switch (value) { + case "Cesium Balloon": selectModel(prefix + "SampleData/models/CesiumBalloon/CesiumBalloon.glb", 15); break; + case "Skinned Character": selectModel(prefix + "SampleData/models/CesiumMan/Cesium_Man.glb", 0); break; + case "Draco Compressed Model": selectModel(prefix + "SampleData/models/DracoCompressed/CesiumMilkTruck.gltf", 0); break; + case "Unlit Box": selectModel(prefix + "Specs/Data/Models/PBR/BoxUnlit/BoxUnlit.gltf", 0); break; + case "Drone": selectModel(prefix + "SampleData/models/CesiumDrone/CesiumDrone.glb", 15); break; + case "Ground Vehicle": selectModel(prefix + "SampleData/models/GroundVehicle/GroundVehicle.glb", 0); break; + case "Instanced Box": selectModel(prefix + "Specs/Data/Models/GltfLoader/BoxInstanced/glTF/box-instanced.gltf", 15); break; + default: break; + } + }); + + AbsolutePanel aPanel = new AbsolutePanel(); + aPanel.add(csVPanel); + aPanel.add(listBox, 20, 20); + + contentPanel.add(new HTML( + "

Load glTF models using Model Experimental.

")); + contentPanel.add(aPanel); + + initWidget(contentPanel); + + selectModel(GWT.getModuleBaseURL() + "SampleData/models/CesiumBalloon/CesiumBalloon.glb", 15); + } + + @Override + public String[] getSourceCodeURLs() { + String[] sourceCodeURLs = new String[1]; + sourceCodeURLs[0] = GWT.getModuleBaseURL() + "examples/" + "ModelExperimental3DModels.txt"; + return sourceCodeURLs; + } + + private void selectModel(String url, double height) { + Cartesian3 position = Cartesian3.fromDegrees(-123.0744619, 44.0503706, height); + + viewer.scene().primitives().removeAll(); + ModelExperimentalFromGltfOptions options = ModelExperimentalFromGltfOptions.create(url); + options.modelMatrix = Transforms.headingPitchRollToFixedFrame(position, hpr, Ellipsoid.WGS84(), fixedFrameTransform); + ModelExperimental model = (ModelExperimental) viewer.scene().primitives().add(ModelExperimental.fromGltf(options)); + + model.readyPromise().then(nModel -> viewer.camera.lookAt(position, + new HeadingPitchRange(Math.toRadians(45), Math.toRadians(-15), model.boundingSphere().radius * 5))); + } +} -- GitLab